La pizzeria di Christian
118 subscribers
1.5K photos
5 videos
22 files
526 links
Canale pubblico dove scrivo come perdo tempo
@sigma_hub
Download Telegram
Una di quelle che seguono davvero gli standard di come si fanno ste cose come quelle di Pokémon o zelda
(difatti un sacco di sta roba e presa dalla decomp di Zelda botw)
We bellu Stu linucs
🔥1
flammate quanto volete fanatici di wayland ma X11 funziona anche senza avere driver GPU propriamente implementati
👍1
bellissime le community cinesi
Senior dev con la propic anime
sticker di loli animati
rispondono subito con wall of text in cinese su come fixare
La pizzeria di Christian
Ci ho messo un BEL po' a capire come funziona asm-differ ma Ora è finalmente pronto la mia prima vera decompilazione https://GitHub.com/decompfrontier/client
praticamentw questo post sarà lungo e noioso ma spiego un po' cosa vuol dire dando un po' più di contesto

C'è questo videogioco per android chiamato Brave Frontier che è stato chiuso diversi anni fa
Cercando di fare un emulatore del server di gioco ho scoperto che il gioco ha i simboli di debug delle funzioni e ci può dare tantissimo contesto su come funziona internamente il .so (è come avere i PDB su Windows)

Ma cosa vuol dire fare una decomp?
Ecco, io ero convinto che fosse semplicemente decompilare il gioco e farlo funzionare, invece questo non sarebbe un vero canone di reverse 100% legittimo.
Fare una decompilazione vuol dire scrivere/reimplementare del codice per fare un modo che il suo assembly generato matchi 1:1 quello dell'eseguibile già compilato dagli autori, in modo da ripristinare quasi totalmente il sorgente.

per far questo, chiaramente bisogna compilare l'applicazione con lo stesso identico compiler e compiler flags di quello originale (cosa che non facevo prima)

La community ci viene in aiuto con un software che serve per comparare l'assembly di un elf generato e quello di base chiamato asm-differ scritto in Python.

BraveFrontier però, non è un target facile come i giochi del NIntendo 64 o del Nintendo DS per due motivi
Il primo è che è scritto in C++, quindi abbiamo davanti ottimizzazioni inline forti, name demangling e utilizzo della OOP che rende la decomp più difficile.
Il secondo è che utilziza Clang, che non è propriamente supportato da asm-differ.

Girovagando per i progetti di decomp ho scoperto dell'esistenza di quello di Zelda Breath of the Wild 1.5.0 per Switch, utilizzando clang e c++ loro hanno gli stessi identici problemi infrastrutturali che ho io, infatti per risolvere soprattutto il problema dei nomi hanno creato un tool in Rust chiamato viking, che funge da comparatore/wrapper per asm-differ.

Dopo che ci ho messo qualche giorno a capire come funziona il tutto, ho preso in mano anche io viking e lo ho forkato per cambiare giusto un paio di cose (tra cui rendere personalizzabile le build directory, il base address e cosi via).

Viking ha due file .csv, uno per i simboli di esportazioni che abbiamo (data_symbols.csv) e uno con la lista di funzioni da decompilare e se matchano o no (viking_functions.csv)
Il file delle funzione ha bisogno della grandezza di funzioni, offset di dove si trova la func nell'eseguibile e il nome.

Per generare propriamente questo file ho scritto uno schifosissimo script in Python per Idapython per esportare il tutto in formato di viking.
🔥3
Ci ho messo un paio di giorni per capire un po' come funzionava sta infrastruttura (che è Linux/WSL only) ma soddisfacente vedere che la funzione JNI_OnLoad (l'entrypoint di una DLL per Android/JNI) matcha al 100%
🔥1
seguiranno intanto un altra grande serie di matching soprattutto dell'Android NDK (nella speranza che ho beccato compiler, flags e C++ STL giusta),. dell'engine di base (cocos2d-x) che so che è stato forkato, e delle librerie di terze parti (le avrò azzeccate tutte?) oltre che del game code di per se
👍1
chiaramente dropperò in sti giorni un tutorial su come fare e su cosa guardare per capire come si fa/reversa codice C++ con una decomp (again zelda botw ret ha un sacco di info a riguardo se siete interessati) e come fare il match dell'assembly
1
io non mi aspetto che sta roba riuscirò mai a completarla ma vorrei avere almeno la parte infrastrutturale pronta e simile al codice originale che avevo fatto prima di resettare tutto con il comparison delle cose
Tutto questo è iniziato quando cercando di mandare una PR ai creatori di decomp.me (una piattaforma online per fare decompilazioni e matching) per aggiungere la piattaforma Android mi hanno fatto rendere conto che ho sbagliato TOTALMENTE il modo di fare questo progetto
adesso chissa, forse potrei riprovare a fare la PR ma mi hanno detto che serve più interessa che un solo progettino cosi a cazzo, tipo magari 5 persone che contribuiscono e non arves e basta, il che ha senso
NONONONONO ONONONONON


NON
SI
PROGRAMMA
COSI

DIO SANTO
MA COME
VI PERMETTETE
QUESTA ROBA È OSCENA
VERGOGNOSO
NON I PUNTATORI DI C PASSATI CONE OFFSET IN JAVA VIA JNI

MA STIAMO SCHERZANDO SPERO
1👏1
Kys
Non ironicamente
Kys
🔥2
Che bello quando vedi
MATCHING
MATCHING
Si lo so che il target ha una var in più nell'sp ci devo arrivare
Mi sta gasando un sacco fare sta roba, ma non è che mi piace più reversare che devvare ??
👏5🔥32