
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.