
Un plugin interattivo per il patching binario per IDA Pro

Modificare il codice assembly per alterare il comportamento di un programma esistente non è raro nell'analisi malware, nel reverse engineering del software e in ambiti più ampi della ricerca sulla sicurezza. Questo progetto estende il popolare disassemblatore IDA Pro per creare un flusso di lavoro di patching binario interattivo più robusto, progettato per iterazioni rapide.
Questo progetto è attualmente basato su un fork minore del diffuso Keystone Engine, che supporta il patching di x86/x64 e Arm/Arm64, con l'intenzione di abilitare le restanti architetture di Keystone in una versione futura.
Un ringraziamento speciale a Hex-Rays per il supporto allo sviluppo di questo plugin.
Questo plugin richiede IDA 7.6 e Python 3. Supporta Windows, Linux e macOS.
Si noti che le versioni precedenti di IDA (8.2 e inferiori) non sono compatibili con Python 3.11 e successive.
Esegui la seguente riga nella console di IDA per installare automaticamente il plugin:
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py').read())
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py', cafile='/etc/ssl/cert.pem').read())
In alternativa, il plugin può essere installato manualmente scaricando il pacchetto plugin distribuibile per la propria piattaforma dalla pagina releases e decomprimendolo nella propria cartella dei plugin.
È fortemente consigliato installare questo plugin nella directory dei plugin utente di IDA:
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
Il plugin di patching si carica automaticamente per le architetture supportate (x86/x64/Arm/Arm64) e inietta le azioni di patching pertinenti nel menu contestuale del tasto destro delle viste di disassemblaggio di IDA:

Un elenco completo delle azioni di patching contestuali è descritto nelle sezioni seguenti.
La finestra di dialogo principale per il patching può essere lanciata tramite l'azione Assemble nel menu contestuale del tasto destro. Simula una vista di disassemblaggio di base di IDA che può essere utilizzata per modificare una o più istruzioni in rapida successione.

La riga di assembly è un campo modificabile che può essere utilizzato per modificare le istruzioni in tempo reale. Premere Invio confermerà (applicherà la patch) l'istruzione inserita nel database.
La posizione corrente (ovvero il cursore) sarà sempre evidenziata in verde. Le istruzioni che verranno sovrascritte a causa della patch/modifica verranno evidenziate in rosso prima di applicare la patch.

Infine, i tasti freccia SU e GIÙ possono essere utilizzati mentre si è ancora concentrati sul campo di testo assembly modificabile per spostare rapidamente il cursore verso l'alto e verso il basso nella vista di disassemblaggio senza usare il mouse.
L'azione di patching più comune è quella di NOPare una o più istruzioni. Per questo motivo, l'azione NOP sarà sempre visibile nel menu del tasto destro per un accesso rapido.

È possibile NOPare singole istruzioni, così come un intervallo selezionato di istruzioni.
Forzare un salto condizionale a eseguire sempre un percorso 'buono' è un'altra azione di patching comune. Il plugin mostra questa azione solo quando si fa clic destro su un'istruzione di salto condizionale.

Se non si vuole mai che un salto condizionale venga preso, si può semplicemente NOParlo!
Le patch possono essere salvate (applicate) a un eseguibile selezionato tramite il sottomenu di patching in qualsiasi momento. L'azione di applicazione rapida rende ancora più veloce il salvataggio di patch successive utilizzando le stesse impostazioni.

Il plugin farà anche uno sforzo attivo per conservare un backup (.bak) dell'eseguibile originale che utilizza per applicare 'pulitamente' il set corrente di patch del database durante ogni salvataggio.
Infine, se non si è soddisfatti di una patch, è sufficiente fare clic destro sui blocchi di istruzioni patchati (gialli) per ripristinarli al valore originale.

Sebbene sia 'facile' ripristinare i byte al loro valore originale, può essere 'difficile' ripristinare l'analisi allo stato precedente. Il ripristino di una patch potrebbe occasionalmente richiedere ulteriori correzioni manuali.
Tempo e motivazione permettendo, i lavori futuri potrebbero includere:
xor eax, eax; ret;)Pretty: mov [rsp+48h+dwCreationDisposition], 3
Raw: mov [rsp+20h], 3
Accetto contributi esterni, segnalazioni di problemi e richieste di funzionalità. Per favore, invia qualsiasi pull request al branch develop di questo repository se desideri che vengano considerate per una versione futura.