
Un plugin interactif de patching binaire pour IDA Pro

Modifier du code assembleur pour changer le comportement d'un programme existant n'est pas rare dans l'analyse de malwares, le rétro-ingénierie logicielle, et les domaines plus larges de la recherche en sécurité. Ce projet étend le célèbre désassembleur IDA Pro pour créer un flux de travail de correction interactive de binaires plus robuste, conçu pour une itération rapide.
Ce projet est actuellement propulsé par un fork mineur du célèbre Keystone Engine, prenant en charge la correction pour x86/x64 et Arm/Arm64, avec des projets d'activer les architectures Keystone restantes dans une future version.
Un merci spécial à Hex-Rays pour avoir soutenu le développement de ce plugin.
Ce plugin nécessite IDA 7.6 et Python 3. Il prend en charge Windows, Linux et macOS.
Veuillez noter que les versions plus anciennes d'IDA (8.2 et inférieures) ne sont pas compatibles avec Python 3.11 et supérieur.
Exécutez la ligne suivante dans la console IDA pour installer automatiquement le 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())
Alternativement, le plugin peut être installé manuellement en téléchargeant le paquet distribuable du plugin pour votre plateforme respective depuis la page des versions et en le décompressant dans votre dossier plugins.
Il est fortement recommandé d'installer ce plugin dans le répertoire utilisateur des plugins d'IDA :
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
Le plugin de correction se charge automatiquement pour les architectures prises en charge (x86/x64/Arm/Arm64) et injecte les actions de correction pertinentes dans le menu contextuel du clic droit des vues de désassemblage d'IDA :

Une liste complète des actions de correction contextuelles est décrite dans les sections suivantes.
La boîte de dialogue principale de correction peut être lancée via l'action Assemble dans le menu contextuel du clic droit. Elle simule une vue de désassemblage de base d'IDA qui peut être utilisée pour éditer une ou plusieurs instructions en succession rapide.

La ligne d'assembly est un champ éditable qui peut être utilisé pour modifier les instructions en temps réel. Appuyer sur Entrée valide (corrige) l'instruction saisie dans la base de données.
Votre emplacement actuel (c'est-à-dire votre curseur) sera toujours surligné en vert. Les instructions qui seront écrasées suite à votre correction/édition seront surlignées en rouge avant de valider la correction.

Enfin, les touches fléchées HAUT et BAS peuvent être utilisées lorsqu'on est encore concentré sur le champ de texte d'assembly éditable pour déplacer rapidement le curseur vers le haut et vers le bas dans la vue de désassemblage sans utiliser la souris.
L'action de correction la plus courante est de NOPer (remplacer par des NOP) une ou plusieurs instructions. Pour cette raison, l'action NOP sera toujours visible dans le menu du clic droit pour un accès rapide.

Des instructions individuelles peuvent être NOPées, ainsi qu'une plage d'instructions sélectionnées.
Forcer un saut conditionnel à toujours exécuter un chemin 'bon' est une autre action de correction courante. Le plugin n'affichera cette action que lorsqu'on clique avec le bouton droit sur une instruction de saut conditionnel.

Si vous ne voulez jamais qu'un saut conditionnel soit pris, vous pouvez simplement le NOPer à la place !
Les corrections peuvent être sauvegardées (appliquées) à un exécutable sélectionné via le sous-menu de correction à tout moment. L'action d'application rapide permet de sauvegarder plus rapidement les corrections suivantes en utilisant les mêmes paramètres.

Le plugin fera également un effort actif pour conserver une sauvegarde (.bak) de l'exécutable original qu'il utilise pour appliquer 'proprement' l'ensemble actuel des corrections de la base de données lors de chaque sauvegarde.
Enfin, si vous n'êtes jamais satisfait d'une correction, vous pouvez simplement cliquer avec le bouton droit sur les blocs d'instructions corrigés (jaunes) pour les rétablir à leur valeur d'origine.

Bien qu'il soit 'facile' de rétablir les octets à leur valeur d'origine, il peut être 'difficile' de restaurer l'analyse à son état précédent. L'annulation d'une correction peut parfois nécessiter des ajustements humains supplémentaires.
Si le temps et la motivation le permettent, les travaux futurs pourraient inclure :
xor eax, eax; ret;)Pretty: mov [rsp+48h+dwCreationDisposition], 3
Raw: mov [rsp+20h], 3
J'accueille favorablement les contributions externes, les signalements de problèmes et les demandes de fonctionnalités. Veuillez faire toute demande de tirage (pull request) vers la branche develop de ce dépôt si vous souhaitez qu'elle soit considérée pour une future version.