Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
FindFunc — 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. | Kitploit
Tools/GitHubGitHub/felixber/findfunc
Statische AnalyseCode-AnalyseReverse EngineeringDebuggerBinäranalyse
GitHubfelixber/findfunc

FindFunc

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.

Repository anzeigen
36236vor 9 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

FindFunc: Erweiterte Filterung/Suche von Funktionen in IDA Pro

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!

ffmain

Filtern mit Regeln

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:

  • Derzeit 6 Regeln verfügbar, siehe unten
  • Unterstützt Funktions-Chunks (function chunks)
  • Intelligente Planung der Regeln für die Leistung
  • Speichern/Laden von Regeln in/von einer Datei im einfachen ASCII-Format
  • Mehrere unabhängige Tabs für Experimente
  • Kopieren von Regeln zwischen Tabs über die Zwischenablage (gleiches Format wie das Dateiformat)
  • Speichern der gesamten Sitzung (alle Tabs) in einer Datei
  • Erweitertes Kopieren von Befehlsbytes (alle, Opcodes nur, alle außer Immediates, ...)
  • Klonen von Tabs für schnelle Experimente zur Verfeinerung der Ergebnisse
  • Code-Matching berücksichtigt Adressgrößen-Präfix und Operandengrößen-Präfix

Schaltfläche "Find Functions" löscht vorhandene Ergebnisse und startet eine neue Suche, "Refine Results" berücksichtigt nur Ergebnisse der vorherigen Suche.

Erweitertes binäres Kopieren

Eine sekundäre Funktion von FF ist die Option, die binäre Darstellung von Instruktionen mit den folgenden Optionen zu kopieren:

  • alle kopieren -> alle Bytes in die Zwischenablage kopieren
  • ohne Immediates kopieren -> alle Immediate-Werte in den Instruktionsbytes ausblenden (AA ?? BB)
  • nur Opcode -> blendet alles außer den tatsächlichen Opcode(s) der Instruktion (und Präfixen) aus
  • ...

Details siehe Abschnitt "Erweitertes Kopieren" unten. Diese Funktion ergänzt die Byte-Muster-Regel hervorragend!

Bau und Installation

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

Verfügbare Regeln

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.

Code-Muster (Code Pattern)

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:

  • "pass" -> stimmt mit jeder Instruktion mit beliebigen Operanden überein
  • "mov* any,any" -> stimmt mit Instruktionen überein, deren Mnemonic "mov*" ist (z. B. mov, movzx, ...) und zwei beliebige Argumente hat.
  • "mov eax, r32" -> stimmt mit jeder Instruktion mit Mnemonic "mov", erstem Operandenregister eax und zweitem Operanden, einem 32-Bit-Register, überein.
    • Analog: r für jedes Register, r8/r16/r32/r64 für ein Register einer bestimmten Breite, "imm" für jeden Immediate-Wert
  • "mov r64, imm" -> stimmt mit jeder Bewegung einer Konstanten in ein 64-Bit-Register überein
  • "any r64,r64" -> stimmt mit jeder Operation zwischen zwei 64-Bit-Registern überein
  • mov -> stimmt mit jeder Instruktion des Mnemonic mov überein

Weitere Beispiele:

root@kitploit:~
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.

Immediate-Wert (Konstante)

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:

root@kitploit:~
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).

Byte-Muster (Byte Pattern)

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:

root@kitploit:~
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!

String-Referenz (String Reference)

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:

  • "TestString" -> die Funktion muss mindestens einmal auf den exakten String verweisen (Groß-/Kleinschreibung wird ignoriert)
  • "TestStr*" -> die Funktion muss mindestens einmal auf einen String verweisen, der mit 'TestStr' beginnt (z. B. TestString, TestStrong) (Groß-/Kleinschreibung wird ignoriert)

Hinweis: Der String-Abgleich ist schnell und eine gute Wahl, um Kandidaten schnell zu reduzieren!

Namens-Referenz (Name Reference)

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:

  • "memset" -> die Funktion muss mindestens einmal auf einen Namen "memset" verweisen
  • "mem*" -> die Funktion muss mindestens einmal auf einen Namen verweisen, der mit "mem" beginnt (memset, memcpy, memcmp)

Hinweis: Der Namensabgleich ist sehr schnell und ideal, um Kandidaten schnell zu reduzieren!

Funktionsgröße (Function Size)

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!

Tastaturkürzel & GUI

Zur einfachen Handhabung kann FF mit den folgenden Tastaturkürzeln verwendet werden:

  • Strg+Alt+F -> TabWidget (Haupt-GUI) starten/anzeigen
    • Oder Ansicht->FindFunc
  • Strg+F -> Suche mit den derzeit aktivierten Regeln starten
  • Strg+R -> Vorhandene Ergebnisse mit den derzeit aktivierten Regeln verfeinern
  • Regeln
    • Strg+C -> Ausgewählte Regeln in die Zwischenablage kopieren
    • Strg+V -> Regeln aus der Zwischenablage in den aktuellen Tab einfügen (anhängen)
    • Strg+S -> Ausgewählte Regeln in Datei speichern
    • Strg+L -> Ausgewählte Regeln aus Datei laden (anhängen)
    • Strg+A -> Alle Regeln auswählen
    • Entf -> Ausgewählte Regeln löschen
  • Sitzung speichern
    • Strg+Umschalt+S -> Sitzung in Datei speichern
    • Strg+Umschalt+L -> Sitzung aus Datei laden

Weitere GUI-Nutzung

  • Rechtsklick auf Tab: Option zum Klonen des Tabs
  • Regeln können durch Doppelklick auf die Datenspalte bearbeitet werden
  • Regeln können durch Doppelklick auf die Spalte "Invert Match" invertiert werden (negative Übereinstimmung)
  • Regeln können durch Doppelklick auf die Spalte "Enabled" aktiviert/deaktiviert werden
  • Radklick auf eine beliebige Zelle in Regeln oder Ergebnissen kopiert die Zelle in die Zwischenablage
  • Byte-Muster und Immediates können direkt aus der Zwischenablage in die Regel-Tabelle eingefügt werden
  • Tabs können durch Doppelklick umbenannt werden
  • Sortierung wird sowohl für die Regel-Liste als auch für die Ergebnis-Liste unterstützt
  • Doppelklick auf ein Ergebnis-Element, um in IDA dorthin zu springen
    • Funktionsname: zum Funktionsanfang springen
    • jede andere Spalte: zur Übereinstimmung der zuletzt abgeglichenen Regel springen
  • Kontrollkästchen Profil: Gibt Profilinformationen für die Suche aus
  • Kontrollkästchen Debug: Gibt detaillierte Debug-Ausgabe für den Code-Regelabgleich aus – nur verwenden, wenn nur wenige Funktionen die Code-Prüfregel erreichen, sonst kann es sehr lange dauern!

Erweitertes binäres Kopieren

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:

Alle Bytes kopieren

Kopiert alle Instruktionsbytes als Hex-String in die Zwischenablage, zur Verwendung in einer Byte-Muster-Regel (oder der binären Suche von IDA).

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

wird kopiert als

root@kitploit:~
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70

Nur nicht-immediate Bytes kopieren

Kopiert Instruktionsbytes für die angegebene Instruktion und blendet dabei alle Immediate-Werte aus. Beispiel:

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

wird kopiert als

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??

Nur Opcodes kopieren

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).

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

wird kopiert als

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??

Opcodes + Immediates kopieren

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.

root@kitploit:~
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.

Disasm kopieren

Kopiert die ausgewählte Disassembly so, wie sie in IDA erscheint, in die Zwischenablage.

Leistung

Ein kurzes Wort zur Leistung:

  1. Name, String, Funktionsgröße sind in fast allen Fällen nahezu kostenlos
  2. Byte-Muster ist bei einer Musterlänge > 2 nahezu kostenlos
  3. Immediate ist schwierig: Wir können die idaapi-Suche verwenden, oder wir können die gesamte Datenbank disassemblieren und selbst suchen – das müssen wir möglicherweise ohnehin tun, wenn wir nach Code-Mustern suchen. ABER: Das Scannen nach Code-Mustern ist tatsächlich viel günstiger als das Scannen nach einem Immediate. Eine API-Suche nach allen Übereinstimmungen ist relativ teuer – etwa 1/8 so teuer wie das Disassemblieren der gesamten Datenbank. Wenn wir also zuerst Übereinstimmungen mit günstigen Regeln reduzieren, profitieren wir stark davon, die verbleibenden Funktionen zu disassemblieren und selbst nach dem Immediate zu suchen, insbesondere wenn ohnehin eine Code-Regel vorhanden ist. Wenn jedoch keine günstigen Optionen existieren und wir ohnehin große Teile der Datenbank disassemblieren müssen (aufgrund des Vorhandenseins von Code-Muster-Regeln), kann die Verwendung einer Immediate-Regel als Vorfilter sehr lohnend sein. Die API-Suche nach EINEM Immediate entspricht grob 1/8 der Suche nach beliebig vielen Code-Muster-Regeln – obwohl dies auch von vielen verschiedenen Faktoren abhängt...
  4. Code-Muster sind mit Abstand die teuersten, aber das Prüfen eines Musters im Vergleich zu vielen Mustern ist sehr ähnlich.

Todo (ungeordnet):

  • jcc-Pseudo-Mnemonik
  • Benannte Orte in CodeRules zulassen ('call memset')
  • Regel für Xref in/out hinzufügen
  • Rückgängig/Wiederholen
  • Fortschrittsbalken
  • Mittelklick zum Schließen von Tabs
  • Tab-Menü: alle außer diesem schließen
  • Option 'alle folgenden Operanden ignorieren'
  • Regel für Parameter von API-Aufrufen innerhalb der Funktion
  • Regel für Eltern-/Aufrufstellen-/Kind-Funktionsanforderungen
  • Regel für Funktionsparameter
  • Regex-Regel
  • String/Name: Option für Groß-/Kleinschreibung
  • Immediate-Regeln automatisch in Byte-Muster konvertieren, falls anwendbar?
  • Einstellungen: Groß-/Kleinschreibung, String-Typen, Bereich, ...
  • Hexray-Regeln?
  • ODER-Kombination von Regeln
  • Pythonifizierung des Codes ;)
  • Parallelisierung
  • Automatische Generierung von Regeln zur Identifizierung einer Funktion
Tool herunterladen