Indice dei contenuti
Introduzione
Waze è stato il mio primo modulo sviluppato per il progetto iLEAPP; chi non avesse ancora avuto modo di leggere l'articolo dedicato può consultare iOS WAZE. Il refactoring del codice per il nuovo framework iLEAPP ha permesso di potenziare il parsing di Waze, migliorando l'efficacia degli artefatti già identificati e ampliando la ricerca verso nuove fonti di prova.
Percorsi
Per semplicità, nel documento verranno utilizzate le seguenti abbreviazioni:
<ADC>=/private/var/mobile/Containers/Data/Application/<UUID>/
<AGC>=/private/var/mobile/Containers/Shared/AppGroup/<UUID>/
Strutture di interesse forense:
| Path | File name | File type |
|---|---|---|
| <ADC>/Documents/ | user.db | SQLite |
| <ADC>/Documents/ | user | Text (Key-Value) |
| <ADC>/Documents/ | session | Text (Key-Value) |
| <ADC>/Documents/ | preferences | Text (Key-Value) |
| <ADC>/Documents/ |
cached_data |
Protobuf |
| <ADC>/Documents/ | spdlog.*logdata | Log (Text) |
| <ADC>/Library/Caches/tts/ | tts.db | SQLite |
| <ADC>/Library/Preferences/ | com.waze.iphone.plist | Plist |
Account
La ricostruzione dell’account avviene in prima battuta mediante l'analisi del file di configurazione <ADC>/Documents/user. Si tratta di un file di testo in cui ogni riga è strutturata secondo il formato standard dominio.chiave: valore.
Le informazioni cruciali del profilo possono essere ricavate dalle seguenti chiavi d'esempio:
- General.First use: 1773745554 (timestamp del primo utilizzo in assoluto dell'app su questo dispositivo in Unix Epoch: 17 marzo 2026 11:05:54).
- Realtime.Nickname: dj (nickname pubblico dell'utente).
- Realtime.FirstName: Django (nome dell'utente).
- Realtime.LastName: Faiola (cognome dell'utente).
- Realtime.Name: world_jx4inxxx (username univoco dell'account).
- Realtime.PersistentId: 1|global|2278204xxx (identificatore globale dell'utente).
- Realtime.Invisible mode: 1 (indica che l'utente ha attivato la modalità invisibile nelle impostazioni della privacy "Diventa invisibile": 1=On).
- App Launch.Dynamic Splash Screen Last Shown Utc Seconds: 1781407671 (timestamp dell'ultimo avvio dell'app da zero "cold start" in Unix Epoch: 14 Giugno 2026 03:27:51).
📌 Nota: I valori sopra riportati sono puramente esemplificativi. Nelle versioni più recenti dell'applicazione, all'interno del file user viene generalmente conservata la sola chiave Realtime.Name, mentre gli altri metadati risultano spesso assenti.
Per sopperire a questa assenza, il parser introduce l'analisi del file <ADC>/Documents/cached_data. Questo file rappresenta una cache persistente serializzata nel formato Protocol Buffers (protobuf). Una volta decodificato, permette di recuperare non solo i dettagli nativi dell'account Waze, ma anche i dati di sincronizzazione provenienti da eventuali provider esterni (es. Google o Facebook).
La figura seguente illustra la struttura del file cached_data una volta decodificato mediante dfDataViewer.
Lo schema (message type) utilizzato da blackboxprotobuf per la decodifica non viene riportato in questa sede ed è consultabile direttamente nel codice waze.py.
L'alberatura del messaggio mostra che il tag 1.1 (user_profile) contiene le informazioni dell'account Waze, mentre il tag 1.2 (social_profile) raccoglie i dati del profilo utilizzato per l'autenticazione:
- 1.2.3: https://social-row.waze.com/SocialMediaServer/images/profile/7394e373-f06d-49da-bb24-ff1a32e3901c (URL dell'immagine del profilo).
- 1.1.4: df.whatsappizza@gmail.com (indirizzo email associato all'account).
- 1.5.11: 1|global|2278204xxx (ID univoco dell'utente Waze ricavato dalla componente finale dell'identificatore globale: 2278204xxx).
- 1.2.4.11: Django (nome dell'utente registrato presso il provider di autenticazione).
- 1.2.4.12: Faiola (cognome dell'utente registrato presso il provider di autenticazione).
- 1.2.4.1: google (nome del provider social utilizzato per il login).
- 1.2.4.4: 111346244207233378xxx (identificatore univoco dell'utente presso il provider di autenticazione).
📌 Nota: In alcuni scenari d'analisi, il cognome all'interno del profilo nativo Waze (user_profile) non viene memorizzato come stringa in chiaro ma come riferimento a un identificatore numerico (ID_REF), a differenza di quanto avviene nei dati speculari del social_profile.
Session Info
Il file <ADC>/Documents/session memorizza lo stato corrente e l'attività volatile dell'applicazione in formato testo semplice. Al suo interno, Waze scrive e aggiorna le coppie chiave-valore legate all'ultima sessione attiva dell'utente.
Le informazioni della sessione estratte sono:
- GPS.Position: 13420991,41363102 (ultime coordinate geografiche di latitudine e longitudine in formato E6 rilevate direttamente dal chip GPS del dispositivo).
- ORIG_GPS.Position: 13420793,41363236 (coordinate geografiche del fix GPS originale registrato all'inizio del tracciamento corrente).
- Location.Position: 13420793,41363236 (coordinate geografiche dell'ultima posizione stimata complessivamente dall'app combinando le diverse sorgenti).
- Home.Position: 13420786,41363856 (coordinate geografiche impostate e salvate dall'utente per l'indirizzo di casa).
- Work.Position: 12557257,41869344 (coordinate geografiche impostate e salvate dall'utente per l'indirizzo di lavoro).
- Navigation.Last position: (coordinate geografiche relative all'ultima posizione di navigazione attiva).
- Parking.Last GPS position: 0,0 (coordinate geografiche dell'ultimo punto registrato in cui il veicolo è stato parcheggiato).
- Destination.Position: 0,0 (coordinate geografiche della destinazione attiva o dell'ultima impostata nella barra di ricerca).
- VenueMapPin.Position: 0,0 (coordinate geografiche di un eventuale pin inserito manualmente dall'utente sulla mappa).
- Config.Last synced: 1781423761457 (timestamp dell'ultima sincronizzazione dei file di configurazione dell'app con i server remoti in Unix Epoch millisecondi: 14 Giugno 2026 07:56:01).
- GPS.Time: 1781424019 (timestamp del momento esatto in cui è stato registrato l'ultimo fix GPS valido in Unix Epoch: 14 Giugno 2026 08:00:19).
- ORIG_GPS.Time: 1781424010 (timestamp del fix di geolocalizzazione originale registrato in Unix Epoch: 14 Giugno 2026 08:00:10).
- Location.Time: 1781424010 (timestamp associato all'ultima posizione stimata o registrata in Unix Epoch: 14 Giugno 2026 08:00:10).
- General.First use: 1774764598 (timestamp corrispondente al primo avvio e utilizzo dell'applicazione su questo dispositivo in Unix Epoch: 29 Marzo 2026 06:09:58).
- Rewire.Main menu last viewed time: 1781423980 (timestamp dell'ultima interazione dell'utente con il menu principale dell'interfaccia in Unix Epoch: 14 Giugno 2026 07:59:40).
- Rewire.Inbox last viewed time: 1781323877 (timestamp dell'ultima visualizzazione dei messaggi o della posta in arrivo in Unix Epoch: 13 Giugno 2026 04:11:17).
- Places.Places Table Cleanup Time: 1780677043 (timestamp dell'ultima operazione automatica di manutenzione del database locale dei luoghi in Unix Epoch: 05 Giugno 2026 16:30:43).
- GPS.Direction: -1 (direzione o orientamento di marcia espresso in gradi rilevato dal sensore GPS; il valore -1 indica un dato non disponibile).
- General.Sessions since first install: 10 (conteggio totale delle sessioni di utilizzo avviate dall'utente dal momento dell'installazione).
- Push Notifications.Token: Aju/toINSKeWZuIH...DowU= (token crittografico utilizzato per l'instradamento delle notifiche push).
- Map.Zoom: 6 (livello di zoom corrente impostato sulla mappa di navigazione).
- Navigation.Last dest name: (nome testuale descrittivo della destinazione finale dell'ultima navigazione).
- Navigation.Last dest venue name: (nome della specifica attività commerciale o POI associato alla destinazione).
- Navigation.Last dest number: (numero civico dell'indirizzo dell'ultima destinazione).
- Navigation.Last dest street: (nome della via o strada dell'ultima destinazione).
- Navigation.Last dest city: (città o comune dell'indirizzo dell'ultima destinazione).
- Navigation.Last dest state: (stato o provincia dell'indirizzo dell'ultima destinazione).
- Navigation.Last dest country: (nazione o paese dell'indirizzo dell'ultima destinazione).
Track GPS Quality
Sfruttando i log diagnostici memorizzati dall'applicazione all'interno dei file di testo spdlog.*logdata (situati nel percorso <ADC>/Documents/), è possibile ricostruire una traccia posizionale ad alta precisione. Nelle precedenti build di Waze, l'estrazione si focalizzava esclusivamente sulle righe marcate dalla macro C++ GPS_QUALITY. Tuttavia, l'evoluzione del framework di sviluppo dell'applicazione ha introdotto una transizione radicale.
Nelle versioni intermedie, la telemetria legacy C++ è stata affiancata e progressivamente sostituita da una nuova formattazione basata su strutture Swift. Nelle build più recenti di Waze per iOS, il formato C++ è stato definitivamente rimosso, lasciando i blocchi Swift come unica sorgente disponibile.
Per garantire la continuità dell'analisi indipendentemente dalla versione dell'app, il parser implementa un motore di analisi a doppia struttura in grado di interpretare entrambi i formati ed eseguire una deduplicazione euristica temporale.
A differenza della singola riga compatta del formato C++, la struttura Swift si presenta come un blocco multi-riga nidificato che serializza un oggetto di telemetria dell'applicazione (WCEWazeAppEvent):
[05:29:57.734 286121 W] New stats infra - saving stat to disk: <WCEWazeAppEvent 0x280d9cd20>: {
payload {
gps_stats_wrapper {
gps_quality {
sample_count: 19
bad_sample_count: 0
duplicate_sample_count: 0
accuracy_avg_meters: 35
accuracy_min_meters: 35
accuracy_max_meters: 35
position_provider: LOCATION_PROVIDER_GPS
coordinates {
latitude: 41.363235
longitude: 13.420794
}
}
}
}
metadata {
event_client_timestamp {
seconds: 1781407797
nanos: 733749866
}
projected_platform: EXTERNAL_DISPLAY_NONE
driving_info {
navigating: false
driving: false
}
sequence_number: 331
session_info {
client_session_id: "8a3056fb-e38c-4065-ab4d-02076c741e2d"
session_id: "6b4dd5ea-c586-3db2-90ed-c8499a1f8776"
stealth: false
}
display_info {
mobile_display_mode: FOREGROUND
in_car_display_mode: NOT_CONNECTED
}
client_version: "5.19.1.0"
}
} [StatsReporter.swift:52 (<StatsReporter.swift> report(_:))]
Mentre nel vecchio formato le coordinate erano espresse come interi scalati (formato E6), nel blocco Swift i valori di latitude e longitude sono memorizzati direttamente come numeri reali (float/double) in gradi decimali standard.
I parametri isolati dal parser all'interno del blocco Swift includono:
- payload,gps_stats_wrapper,gps_quality: sotto-blocco principale che incapsula le metriche di telemetria e le statistiche sul segnale.
- coordinates: localizzazione geografica in gradi decimali.
- latitude: 41.363235 (latitudine).
- longitude: 13.420794 (longitudine).
- sample_count: 19 (numero totale di campioni elaborati nel ciclo).
- bad_sample_count: 0 (numero di campioni scartati: non validi o corrotti).
- duplicate_sample_count: 0 (numero di campioni duplicati ricevuti).
- accuracy_avg_meters: 35 (accuratezza media stimata espressa in metri).
- accuracy_min_meters: 35 (accuratezza minima registrata espressa in metri).
- accuracy_max_meters: 35 (accuratezza massima registrata espressa in metri).
- position_provider: LOCATION_PROVIDER_GPS (indica il ricevitore satellitare GPS come sorgente nativa del dato).
- metadata.event_client_timestamp: sotto-blocco che ospita la marcatura temporale assoluta dell'evento lato dispositivo.
- seconds: 1781407797 (timestamp in Unix Epoch: 14 giugno 2026 03:29:57).
- nanos: 733749866 (frazione di secondo espressa in nanosecondi).
I metadati di performance della ricezione satellitare mantengono la medesima granularità investigativa vista nel precedente articolo iOS WAZE.
Cronologia Ricerche
L'analisi delle ricerche effettuate dall'utente fornisce una traccia cristallina dei suoi interessi e delle sue intenzioni di spostamento. Waze gestisce la persistenza di questa cronologia attraverso la tabella PLACES del database principale user.db.
SELECT
P.id AS "P_id",
datetime(P.updated_time, 'unixepoch') AS "updated_time",
P.name,
P.house,
P.street,
P.city,
P.state,
P.country,
CASE
WHEN P.is_residential = 0 THEN 'No'
WHEN P.is_residential = 1 THEN 'Yes'
ELSE coalesce(CAST(P.is_residential AS TEXT), 'N/A')
END AS "residential_status",
CAST((CAST(P.latitude AS REAL) / 1000000) AS TEXT) AS "latitude",
CAST((CAST(P.longitude AS REAL) / 1000000) AS TEXT) AS "longitude",
datetime(P.created_time, 'unixepoch') AS "created_time",
P.venue_id
FROM PLACES AS "P"
Esempio di record (P_id=115):
- id: 9 (chiave primaria).
- updated_time: 1781407793 (timestamp dell'ultima ricerca in Unix Epoch: 14 giugno 2026 03:29:53).
- name: Segretariato Generale della Difesa e Direzione Nazionale Armamenti (nome del punto di interesse - POI o stringa digitata).
- house: 301 (numero civico).
- street: Via di Centocelle (nome della via o strada).
- city: Roma (città o comune).
- state: Lazio (stato o provincia).
- country: Italia (nazione o paese).
- is_residential: 0 (classificazione del luogo: 0=non residenziale, 1=residenziale).
- latitude: 41869344 (latitudine in formato E6, intero in micro-gradi 106: 41.869344).
- longitude: 12557257 (longitudine in formato E6, intero in micro-gradi 106: 12.557257).
- created_time: 1781407793 (timestamp della creazione del record in Unix Epoch: 14 giugno 2026 03:29:53).
- venue_id: googlePlaces.ChIJX_i2HixjLxMRBJxXbrMEBJA (identificatore univoco globale utilizzato da Waze per mappare il punto di interesse).
Posizioni Recenti
Se la cronologia delle ricerche mostra le intenzioni teoriche dell'utente, l'analisi delle destinazioni recenti offre un'evidenza forense ancora più stringente sui viaggi effettivamente intrapresi, avviati o pianificati nel breve periodo. Waze memorizza questa cronologia storica all'interno della tabella RECENTS del database user.db.
SELECT
R.id AS "R_id",
P.id AS "P_id",
datetime(R.access_time, 'unixepoch') AS "access_time",
CASE R.type
WHEN -1 THEN 'N/A'
WHEN 0 THEN 'User Search'
WHEN 1 THEN 'Advertising'
WHEN 2 THEN 'Map Interaction'
WHEN 3 THEN 'Shared'
WHEN 4 THEN 'Navigation History'
ELSE CAST(R.type AS TEXT)
END AS "entry_type",
coalesce(R.name, P.name) AS "name",
P.house,
P.street,
P.city,
P.state,
P.country,
CAST((CAST(P.latitude AS REAL) / 1000000) AS TEXT) AS "latitude",
CAST((CAST(P.longitude AS REAL) / 1000000) AS TEXT) AS "longitude",
datetime(R.created_time, 'unixepoch') AS "created_time",
datetime(R.waypoint_access_time, 'unixepoch') AS "waypoint_access_time",
R.string_context,
R.image_id,
P.venue_id
FROM RECENTS AS "R"
LEFT JOIN PLACES AS "P" ON (R.place_id = P.id)
ORDER BY R.access_time DESC
Esempio di record (R_id=2):
- id: 2 (chiave primaria).
- access_time: 1781407706 (timestamp dell'ultimo inserimento o della selezione della rotta verso quella specifica destinazione in Unix Epoch: 14 giugno 2026 03:28:26).
- type: 0 (tipo di origine della destinazione: 0=User Search, 1=Advertising, 2=Map Interaction, 3=Shared, 4=Navigation History).
- name: IH Hotels Milano Lorenteggio (denominazione del punto di arrivo).
- created_time: 1781407706 (timestamp dell'ultima ricerca in Unix Epoch: 14 giugno 2026 03:28:26).
- waypoint_access_time: 0 (timestamp associato all'accesso a un eventuale punto di passaggio intermedio o waypoint della rotta in Unix Epoch).
- string_context: NULL (metadato testuale di contesto addizionale fornito dall'applicazione).
- image_id: NULL (identificatore dell'eventuale icona, brand o immagine di anteprima associata al punto di interesse).
- place_id: 5 (foreign key del luogo → PLACES.id).
📌 Nota: La classificazione dei valori numerici del campo type è il risultato di un'analisi empirica condotta sui tracciamenti e non discende da documentazione ufficiale Waze.
Posizioni Preferite
II Preferiti identificano i luoghi salvati esplicitamente dall'utente (es. Casa, Lavoro o mete frequenti). L'applicazione gestisce queste informazioni memorizzandole sia all'interno della tabella FAVORITES del database SQLite user.db, sia nel file protobuf di sincronizzazione cloud cached_data.
Questa nuova versione dei Preferiti introduce proprio l'analisi del protobuf cached_data e migliora l'output della query eseguita sul database locale, integrando e normalizzando i dati per offrire una visibilità completa sui luoghi salvati.
SELECT F.id, P.id, datetime(F.access_time, 'unixepoch') AS "access_time",
CASE f.type WHEN -1 THEN 'N/A' WHEN 0 THEN 'Custom' WHEN 1 THEN 'Home' WHEN 2 THEN 'Work' WHEN 3 THEN 'Events' WHEN 4 THEN 'Saved POI' ELSE CAST(f.type AS TEXT) END AS "entry_type", F.name AS "title", P.name, P.house, P.street, P.city, P.state, P.country, CAST((CAST(P.latitude AS REAL) / 1000000) AS TEXT) AS "latitude", CAST((CAST(P.longitude AS REAL) / 1000000) AS TEXT) AS "longitude", datetime(F.created_time, 'unixepoch') AS "created_time",
datetime(F.modified_time, 'unixepoch') AS "modified_time",
datetime(F.waypoint_access_time, 'unixepoch') AS "waypoint_access_time",
F.rank, F.server_id, P.venue_id FROM FAVORITES AS "F" LEFT JOIN PLACES AS "P" ON (F.place_id = P.id)
Esempio di record (F.id=1):
- F.id: 1 (chiave primaria).
- access_time: 0 (timestamp dell'ultimo accesso al preferito; se valorizzato a 0 indica che la entry non è stata selezionata di recente).
- type: 2 (tipo di preferito: 1=Home, 2=Work, 0=Custom, ecc.).
- name: Lavoro (etichetta personalizzata visualizzata dall'utente).
- created_time: 1781407793 (timestamp di creazione in Unix Epoch: 14 giugno 2026 03:29:53).
- modified_time: 1781407793 (timestamp dell’ultima modifica in Unix Epoch: 14 giugno 2026 03:29:53).
- waypoint_access_time: 0 (timestamp dell'ultimo instradamento calcolato verso questo specifico punto in Unix Epoch).
- rank: 256 (indice di priorità o ordinamento interno utilizzato dall'interfaccia grafica di Waze per mostrare i preferiti in elenco).
- server_id: 3158801773746466685 (identificatore univoco assegnato dal cloud di Waze).
- place_id: 1 (foreign key del luogo → PLACES.id).
Nel file protobuf cached_data, l'alberatura completa dei luoghi salvati dall'utente e sincronizzati con il server è ospitata all'interno della radice del tag 1.5 (saved_places_root).
La figura seguente illustra la struttura dei luoghi salvati del file cached_data una volta decodificato mediante dfDataViewer.
Lo schema (message type) utilizzato da blackboxprotobuf per la decodifica non viene riportato in questa sede ed è consultabile direttamente nel codice waze.py.
Parallelamente, nel file protobuf cached_data, l'intera alberatura dei luoghi salvati e sincronizzati risiede sotto la radice del tag 1.5 (saved_places_root), da cui il parser estrae in modo speculare i seguenti dettagli:
- 5.2.1: 3158801773746466685 (identificatore univoco del server cloud).
- 5.2.1.2: coordinate del luogo in formato E6 (interi in micro-gradi 106)
- 101: 12557257 (longitudine: 12.557257).
- 102: 41869344 (latitudine: 41.869344).
- 5.2.1.3: Segretariato Generale della Difesa e Direzione Nazionale Armamenti (nome esteso del punto geografico memorizzato).
- 5.2.1.4: Via di Centocelle (nome della via o strada).
- 5.2.1.5: Roma (città o comune).
- 5.2.1.6: Lazio (stato o provincia).
- 5.2.1.7: Italia (nazione o paese).
- 5.2.1.8: 301 (numero civico).
- 5.2.1.9: googlePlaces.ChIJX_i2HixjLxMRBJxXbrMEBJA (identificatore univoco globale utilizzato da Waze per mappare il punto di interesse).
- 5.2.1.10: 1781407793 (timestamp dell'ultima modifica in Unix Epoch: 14 Giugno 2026 03:29:53).
- 5.2.2: Lavoro (etichetta assegnata dall'utente).
- 5.2.3: 2 (tipo di preferito: 1=Home, 2=Work, 0=Custom, ecc.).
Posizioni Condivise
Questo artefatto traccia le coordinate geografiche e la cronologia temporale di posizioni o interi itinerari che l'utente ha condiviso con terzi o ha ricevuto. L'analisi del campo owner_id è fondamentale a livello investigativo per determinare la direzione del flusso dell'informazione (chi ha originato la condivisione).
SELECT SP.id AS "SP_id", P.id AS "P_id", datetime(SP.share_time, 'unixepoch') AS "share_time", coalesce(SP.name, P.name) AS "name", P.house, P.street, P.city, P.state, P.country, CAST((CAST(P.latitude AS REAL) / 1000000) AS TEXT) AS "latitude", CAST((CAST(P.longitude AS REAL) / 1000000) AS TEXT) AS "longitude", datetime(SP.created_time, 'unixepoch') AS "created_time", datetime(SP.modified_time, 'unixepoch') AS "modified_time", datetime(SP.access_time, 'unixepoch') AS "access_time", SP.owner_id, SP.shared_id, P.venue_id FROM SHARED_PLACES AS "SP" LEFT JOIN PLACES AS "P" ON (SP.place_id = P.id)
Esempio di record (SP_id=1):
- id: 1 (chiave primaria).
- share_time: 1776004019 (timestamp di condivisione in Unix Epoch: 12 Aprile 2026 14:26:59).
- name: Centro Commerciale Latina Fiori (punto di interesse oggetto della condivisione).
- created_time: 1776004019 (timestamp di creazione in Unix Epoch: 12 Aprile 2026 14:26:59).
- modified_time: 0 (timestamp dell'ultima modifica in Unix Epoch).
- access_time: 1776004019 (timestamp dell'ultimo accesso in Unix Epoch: 12 Aprile 2026 14:26:59).
- owner_id: 1|global|2278204xxx (identificatore globale).
- shared_id: I1H-iFkz-yn4de9HaQ-sd (identificatore della condivisione).
- place_id: 4 (foreign key del luogo → PLACES.id).
Eventi Pianificati
L'analisi degli Eventi consente di identificare i viaggi pianificati in anticipo dall'utente o sincronizzati automaticamente con i calendari nativi del dispositivo (es. iOS Calendar). Waze memorizza queste informazioni all'interno della tabella EVENTS_PLACES del database user.db.
SELECT
E.id AS "E_id",
P.id AS "O_id",
OP.id AS "OP_id",
datetime(E.created_time, 'unixepoch') AS "created_time",
CASE
WHEN E.type = 1 THEN 'Calendar'
WHEN E.type = 2 THEN 'Partner'
WHEN E.type = 6 THEN 'Reservation'
ELSE coalesce(CAST(E.type AS TEXT), 'N/A')
END AS "event_type",
E.name,
datetime(E.start_time, 'unixepoch') AS "start_time",
datetime(E.end_time, 'unixepoch') AS "end_time",
CASE
WHEN E.all_day = 0 THEN 'No'
WHEN E.all_day = 1 THEN 'Yes'
ELSE coalesce(CAST(E.all_day AS TEXT), 'N/A')
END AS "all_day",
E.image_url,
P.name,
P.house,
P.street,
P.city,
P.state,
P.country,
CAST((CAST(P.latitude AS REAL) / 1000000) AS TEXT) AS "latitude",
CAST((CAST(P.longitude AS REAL) / 1000000) AS TEXT) AS "longitude",
OP.name AS "origin_name",
P.venue_id,
E.event_id
FROM EVENTS_PLACES AS "E"
LEFT JOIN PLACES AS "P" ON (E.place_id = P.id)
LEFT JOIN PLACES AS "OP" ON (E.origin_place_id = OP.id)
ORDER BY E.created_time DESC
Esempio di record (E_id=1):
- id: 1 (chiave primaria).
- created_time: 1781407673 (timestamp di creazione dell'evento in Unix Epoch: 14 giugno 2026 03:27:53).
- type: 6 (tipo di evento: 1=Calendar, 2=Partner, 6=Reservation).
- name: IH Hotels Milano Lorenteggio (titolo o descrizione dell'evento).
- start_time: 1781614800 (timestamp di inizio dell'evento pianificato in Unix Epoch: 16 giugno 2026 13:00:00).
- end_time: 1781618400 (timestamp di fine dell'evento pianificato in Unix Epoch: 16 giugno 2026 14:00:00).
- all_day: 0 (flag che indica se l'evento è configurato per durare l'intera giornata).
- image_url: NULL (URL dell'immagine associata all'evento).
- event_id: WMXCN0DTKDJob (identificatore univoco dell'evento).
- place_id: 7 (foreign key del luogo di destinazione → PLACES.id).
- origin_place_id: 8 (foreign key del luogo di origine stimato o impostato → PLACES.id).
📌 Nota: La classificazione dei valori numerici del campo type è il risultato di un'analisi empirica condotta sui tracciamenti e non discende da documentazione ufficiale Waze.
Text-To-Speech Navigation
Il database tts.db, situato nel percorso <ADC>/Library/Caches/tts/, contiene la cache delle trascrizioni testuali generate e pronunciate dall'assistente vocale durante la navigazione stradale attiva.
A differenza degli altri database, tts.db non possiede un'unica tabella centralizzata, bensì crea una tabella distinta per ciascuna voce dell'assistente configurata o testata dall'utente (es. Jane, Ben, Sarah, ecc.).
Poiché lo schema delle colonne è identico per ogni tabella, il parser interroga dinamicamente il database applicando la medesima struttura di query:
SELECT T.ROWID AS "T_ID", datetime(T.update_time, 'unixepoch') AS "update_time",
CASE WHEN T.text_type = 0 THEN 'Prompt' WHEN T.text_type = 1 THEN 'Maneuver' WHEN T.text_type = 2 THEN 'Route' WHEN T.text_type = 3 THEN 'Alert' ELSE COALESCE(CAST(T.text_type AS TEXT), 'N/A') END AS "text_type", T.text FROM Jane AS "T"
Esempio di record (T_ID=100):
- ROWID: 100 (chiave primaria).
- update_time: 1781407797 (timestamp in cui l'istruzione vocale è stata elaborata e riprodotta in Unix Epoch: 14 giugno 2026 03:29:57).
- text_type: 3 (tipo di istruzione corrispondente a un avviso stradale o di navigazione: 0=Prompt, 1=Maneuver, 2=Route, 3=Alert).
- text: Turn right onto Via di Centocelle (trascrizione esatta della frase pronunciata dall'assistente vocale).
📌 Nota: I valori sopra riportati sono forniti a scopo illustrativo della struttura delle tabelle; nel database reale analizzato non è presente alcun record con T_ID=100.
📌 Nota: La classificazione dei valori numerici del campo text_type è il risultato di un'analisi empirica condotta sui tracciamenti e non discende da documentazione ufficiale Waze.
iLEAPP/LAVA 💖
Anche per questo importante aggiornamento, lo script waze.py è stato pienamente integrato e rilasciato all'interno del progetto open-source iLEAPP (iOS Logs, Events, And Plists Parser) di Alexis Brignoni.
Sfruttando le potenzialità della nuova architettura del framework e l'interfaccia di LAVA (LEAPP Artifact Viewer App), di seguito vengono mostrati alcuni screenshot dei risultati ottenuti dal modulo durante l'analisi e la visualizzazione degli artefatti estratti.












