
IDA Pro-Plugin zum Filtern von Funktionen nach Assembly-Mustern, Byte-Sequenzen, String-/Namensreferenzen und Größenbeschränkungen, mit regelbasierter Suche und erweitertem binärem Kopieren.
FindFunc ist ein IDA Pro Plugin zum Auffinden von Code-Funktionen, die ein bestimmtes Assembly- oder Byte-Muster enthalten, auf einen bestimmten Namen oder String verweisen oder verschiedene andere Einschränkungen erfüllen.
FindFunc belegte den dritten Platz im 2022 HexRays IDA Pro Plugin Contest!

Die Hauptfunktion von FindFunc besteht darin, dem Benutzer die Angabe einer Reihe von "Regeln" oder Einschränkungen zu ermöglichen, die eine Code-Funktion in IDA Pro erfüllen muss. FF findet und listet dann alle Funktionen auf, die ALLE Regeln erfüllen (derzeit befinden sich also alle Regeln in einer UND-Verknüpfung). Ausnahme: Regeln können "invertiert" werden, um negative Übereinstimmungen zu erzielen. Solche Regeln entsprechen also "AND NOT".
FF plant die Regeln in einer intelligenten Reihenfolge, um die Verarbeitungszeit zu minimieren. Funktionsübersicht:
Schaltfläche "Find Functions" löscht vorhandene Ergebnisse und startet eine neue Suche, "Refine Results" berücksichtigt nur Ergebnisse der vorherigen Suche.
Eine sekundäre Funktion von FF ist die Option, die binäre Darstellung von Instruktionen mit den folgenden Optionen zu kopieren:
Details siehe Abschnitt "Erweitertes Kopieren" unten. Diese Funktion ergänzt die Byte-Muster-Regel hervorragend!
FindFunc ist ein IDA Pro Python-Plugin ohne externe Paketabhängigkeiten. Es kann installiert werden, indem das Repository heruntergeladen und die Datei 'findfuncmain.py' sowie der Ordner 'findfunc' in das IDA Pro Plugin-Verzeichnis kopiert werden. Für IDA 9.0+ kann das Repository auch direkt in das Plugin-Verzeichnis geklont werden. In beiden Fällen ist kein Bauen erforderlich.
Voraussetzungen: IDA Pro 8.x (8.3+) mit python3-Umgebung. FindFunc ist nur für die x86/x64-Architektur ausgelegt. Getestet mit IDA 8.3 - 9.2, Python 3.11 unter Windows 10 + 11
Derzeit sind die folgenden sechs Regeln verfügbar. Sie sind hier von schwer zu leicht hinsichtlich der Leistungsauswirkung sortiert. Bei großen Datenbanken ist es eine gute Idee, zuerst die Kandidatenfunktionen mit einer günstigen Regel zu reduzieren, bevor man z. B. mit Code-Regeln eine aufwändige Prüfung durchführt. FF plant die Regeln automatisch intelligent.
Regel zum Filtern von Funktionen basierend darauf, dass sie einen bestimmten Assembly-Code-Ausschnitt enthalten. Dies ist KEINE Textsuche nach der textuellen Disassembly-Darstellung von IDA, sondern führt eine erweiterte Übereinstimmungsprüfung der zugrunde liegenden Instruktion durch. Der Ausschnitt kann viele aufeinanderfolgende Instruktionen enthalten, eine pro Zeile. Funktions-Chunks werden unterstützt. Unterstützt spezielle Wildcard-Übereinstimmungen, zusätzlich zur direkten Assembly:
Weitere Beispiele:
mov r64, [r32 * 8 + 0x100]
mov r, [r * 8 - 0x100]
mov r64, [r32 * 8 + imm]
pass
mov r, word [eax + r32 * 8 - 0x100]
any r64, r64
push imm
push any
Achtung: Seien Sie vorsichtig beim Kopieren von Assembly aus IDA. IDA mischt lokale Variablennamen und andere Informationen in die Instruktion, was zu fehlgeschlagenen Übereinstimmungen führt. Außerdem werden Labels nicht unterstützt ("call sub_123456").
Beachten Sie, dass Code-Muster die teuerste Regel ist. Wenn nur Code-Regeln vorhanden sind, bleibt FF keine andere Wahl, als die gesamte Datenbank zu disassemblieren. Dies kann bei sehr großen Binärdateien bis zu mehreren Minuten dauern. Siehe Hinweise zur Leistung unten.
Die Funktion muss den angegebenen Immediate-Wert mindestens einmal an einer beliebigen Position enthalten. Ein Immediate-Wert ist ein in der binären Darstellung der Instruktion fest codierter Wert. Beispiele für Instruktionen, die dem Immediate-Wert 0x100 entsprechen:
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100
Immediates können direkt aus der Zwischenablage in die Liste der Regeln eingefügt werden. Hinweis: IDA führt eine umfassende Übereinstimmungsprüfung jeder Größe und Position des Immediate-Werts durch. Wenn Sie wissen, dass er eine bestimmte Breite von 4 oder 8 Bytes hat, kann ein Byte-Muster schneller sein (kann aber Fehlalarme verursachen).
Die Funktion muss das angegebene Byte-Muster mindestens einmal enthalten. Das Muster hat das gleiche Format wie die binäre Suche von IDA und unterstützt daher Wildcards - die perfekte Ergänzung zur erweiterten Kopierfunktion!
Beispiele:
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? kann jedes Byte sein
Byte-Muster können direkt aus der Zwischenablage in die Liste der Regeln eingefügt werden. Hinweis: Der Mustervergleich ist recht schnell und ein guter Kandidat, um Übereinstimmungen schnell zu reduzieren!
Die Funktion muss mindestens einmal auf den angegebenen String verweisen. Der String wird gemäß dem 'fnmatch'-Modul von Python abgeglichen und unterstützt daher wildcard-ähnliche Übereinstimmungen. Der Abgleich erfolgt ohne Berücksichtigung der Groß-/Kleinschreibung. Folgende String-Formate werden berücksichtigt: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (dies kann in der Config-Klasse geändert werden).
Beispiele:
Hinweis: Der String-Abgleich ist schnell und eine gute Wahl, um Kandidaten schnell zu reduzieren!
Die Funktion muss mindestens einmal auf den angegebenen Namen/das Label verweisen. Der Name/das Label wird gemäß dem 'fnmatch'-Modul von Python abgeglichen und unterstützt daher wildcard-ähnliche Übereinstimmungen. Der Abgleich erfolgt ohne Berücksichtigung der Groß-/Kleinschreibung.
Beispiele:
Hinweis: Der Namensabgleich ist sehr schnell und ideal, um Kandidaten schnell zu reduzieren!
Die Größe der Funktion muss innerhalb des angegebenen Bereichs liegen: "min <= funktionsgröße <= max". Daten werden als Zeichenfolge der Form "min,max" eingegeben. Die Größe einer Funktion umfasst alle ihre Chunks.
Hinweis: Der Abgleich der Funktionsgröße ist sehr schnell und ideal, um Kandidaten schnell zu reduzieren!
Zur einfachen Handhabung kann FF mit den folgenden Tastaturkürzeln verwendet werden:
Weitere GUI-Nutzung
Häufig möchten wir nach binären Mustern von Assembly suchen, jedoch ohne fest codierte Adressen und Werte (Immediates), oder sogar nur die tatsächlichen Opcodes der Instruktion. FindFunc macht dies einfach, indem es drei Kopieroptionen zum Disassembly-Kontextmenü hinzufügt:
Kopiert alle Instruktionsbytes als Hex-String in die Zwischenablage, zur Verwendung in einer Byte-Muster-Regel (oder der binären Suche von IDA).
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
wird kopiert als
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70
Kopiert Instruktionsbytes für die angegebene Instruktion und blendet dabei alle Immediate-Werte aus. Beispiel:
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
wird kopiert als
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??
Kopiert alle Instruktionsbytes als Hex-String in die Zwischenablage und blendet dabei alle Bytes aus, die nicht der tatsächliche Opcode sind (einschließlich SIB, ModRM, aber unter Beibehaltung von Legacy-Präfixen).
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
wird kopiert als
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??
Eine Kombination, die Opcode und Immediates beibehält, aber z. B. mod r/m ausblendet. Beachten Sie, dass Opcodes auch dann beibehalten werden, wenn sie bestimmte Register vorschreiben, z. B.
B8 44332211 mov eax,11223344
behält den Opcode B8.
Hinweis: Dies ist ein "Best-Effort" unter Verwendung der IDA-API, daher kann es in wenigen Fällen vorkommen, dass es nur teilweise funktioniert. Für eine 100% korrekte Lösung müssten wir eine dedizierte x86-Disasm-Bibliothek mitliefern.
Ähnliche Ergebnisse können mit Code-Muster-Regeln erzielt werden, aber dies kann schneller sein, sowohl für die Benutzerinteraktion als auch für die eigentliche Suche.
Kopiert die ausgewählte Disassembly so, wie sie in IDA erscheint, in die Zwischenablage.
Ein kurzes Wort zur Leistung: