Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
FindFunc — Plugin per IDA Pro per filtrare funzioni in base a pattern assembly, sequenze di byte, riferimenti a stringhe/nomi e vincoli di dimensione, con ricerca basata su regole e copia binaria avanzata. | Kitploit
Strumenti/GitHubGitHub/felixber/findfunc
Analisi StaticaAnalisi del CodiceReverse EngineeringDebuggerAnalisi di Binari
GitHubfelixber/findfunc

FindFunc

Plugin per IDA Pro per filtrare funzioni in base a pattern assembly, sequenze di byte, riferimenti a stringhe/nomi e vincoli di dimensione, con ricerca basata su regole e copia binaria avanzata.

Vedi Repository
362369 mesi faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

FindFunc: Filtraggio/Ricerca Avanzata di Funzioni in IDA Pro

FindFunc è un plugin per IDA Pro per trovare funzioni che contengono un determinato pattern assembly o di byte, fanno riferimento a un certo nome o stringa, o soddisfano vari altri vincoli.

FindFunc si è classificato terzo nel 2022 HexRays IDA Pro Plugin Contest!

ffmain

Filtraggio con Regole

La funzionalità principale di FindFunc è permettere all'utente di specificare un insieme di "Regole" o vincoli che una funzione in IDA Pro deve soddisfare. FF troverà e elencherà tutte le funzioni che soddisfano TUTTE le regole (quindi attualmente tutte le Regole sono in congiunzione AND). Eccezione: le regole possono essere "invertite" per diventare corrispondenze negative. Tali regole quindi corrispondono a "AND NOT".

FF pianificherà le regole in un ordine intelligente per minimizzare il tempo di elaborazione. Panoramica delle funzionalità:

  • Attualmente 6 Regole disponibili, vedere sotto
  • Consapevole dei chunk delle funzioni
  • Pianificazione intelligente delle regole per le prestazioni
  • Salvataggio/Caricamento delle regole da/a file in formato ASCII semplice
  • Diverse schede indipendenti per esperimenti
  • Copia delle regole tra schede tramite clipboard (stesso formato del file)
  • Salvataggio dell'intera sessione (tutte le schede) su file
  • Copia avanzata dei byte delle istruzioni (tutti, solo opcode, tutti tranne immediati, ...)
  • Clonazione delle schede per esperimenti rapidi con raffinamento dei risultati
  • La corrispondenza del codice rispetta Addressing-Size-Prefix e Operand-Size-Prefix

Il pulsante "Find Functions" cancella i risultati esistenti e avvia una nuova ricerca, "Refine Results" considera solo i risultati della ricerca precedente.

Copia Binaria Avanzata

Una funzionalità secondaria di FF è l'opzione di copiare la rappresentazione binaria delle istruzioni con le seguenti opzioni:

  • copy all -> copia tutti i byte negli appunti
  • copy without immediates -> cancella (AA ?? BB) qualsiasi valore immediato nei byte dell'istruzione
  • opcode only -> cancella tutto tranne l'opcode effettivo dell'istruzione (e i prefissi)
  • ...

Vedere la sezione "copia avanzata" di seguito per i dettagli. Questa funzionalità si integra perfettamente con la regola Byte Pattern!

Costruzione e Installazione

FindFunc è un plugin Python per IDA Pro senza dipendenze da pacchetti esterni. Può essere installato scaricando il repository e copiando il file 'findfuncmain.py' e la cartella 'findfunc' nella directory dei plugin di IDA Pro. Per IDA 9.0+ il repository può anche essere clonato direttamente nella directory dei plugin. In ogni caso non è richiesta alcuna compilazione.

Requisiti: IDA Pro 8.x (8.3+) con ambiente python3. FindFunc è progettato solo per architettura x86/x64. È stato testato con IDA 8.3 - 9.2, python 3.11 su Windows 10 + 11

Regole Disponibili

Attualmente sono disponibili le seguenti sei regole. Sono ordinate qui dalla più pesante alla più leggera in termini di impatto sulle prestazioni. Con database grandi è una buona idea ridurre prima le funzioni candidate con una regola economica, prima di eseguire corrispondenze pesanti tramite es. Regole di codice. FF pianificherà automaticamente le regole in modo intelligente.

Pattern di Codice

Regola per filtrare le funzioni in base al fatto che contengono un dato snippet di codice assembly. NON è una ricerca testuale della rappresentazione testuale del disassembly di IDA, ma esegue una corrispondenza avanzata dell'istruzione sottostante. Lo snippet può contenere molte istruzioni consecutive, una per riga. I chunk delle funzioni sono supportati. Supporta la corrispondenza con wildcard speciali, oltre all'assembly letterale:

  • "pass" -> corrisponde a qualsiasi istruzione con qualsiasi operando
  • "mov* any,any" -> corrisponde a istruzioni con mnemonico "mov*" (es. mov, movzx, ...) e qualsiasi due argomenti.
  • "mov eax, r32" -> corrisponde a qualsiasi istruzione con mnemonico "mov", primo operando registro eax e secondo operando qualsiasi registro a 32 bit.
    • Analogamente: r per qualsiasi registro, r8/r16/r32/r64 per registro di larghezza specifica, "imm" per qualsiasi immediato
  • "mov r64, imm" -> corrisponde a qualsiasi trasferimento di una costante in un registro a 64 bit
  • "any r64,r64" -> corrisponde a qualsiasi operazione tra due registri a 64 bit
  • mov -> corrisponde a qualsiasi istruzione con mnemonico mov

altri esempi:

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

Attenzione: Fare attenzione quando si copia assembly da IDA. IDA mescola nomi di variabili locali e altre informazioni nell'istruzione, portando al fallimento della corrispondenza. Inoltre, le etichette non sono supportate ("call sub_123456").

Nota che i Pattern di Codice sono la Regola più costosa, e se sono presenti solo Regole di Codice, FF non ha altra scelta che disassemblare l'intero database. Questo può richiedere fino a diversi minuti per binari molto grandi. Vedi note sulle prestazioni di seguito.

Valore Immediato (Costante)

La funzione deve contenere l'immediato dato almeno una volta in qualsiasi posizione. Un valore immediato è un valore fissato nella rappresentazione binaria dell'istruzione. Esempi di istruzioni che corrispondono al valore immediato 0x100:

root@kitploit:~
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100

Gli immediati possono essere incollati direttamente dagli appunti nell'elenco delle regole. Nota: IDA esegue una corrispondenza estesa di qualsiasi dimensione e qualsiasi posizione dell'immediato. Se sai che ha una larghezza specifica di 4 o 8 byte, un pattern di byte può essere più veloce (ma può produrre falsi positivi).

Pattern di Byte

La funzione deve contenere il pattern di byte dato almeno una volta. Il pattern è dello stesso formato della ricerca binaria di IDA, e quindi supporta wildcard - la corrispondenza perfetta per la funzione di copia avanzata!

Esempi:

root@kitploit:~
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? può essere qualsiasi byte

I pattern di byte possono essere incollati direttamente dagli appunti nell'elenco delle regole. Nota: La corrispondenza del pattern è abbastanza veloce e un buon candidato per ridurre rapidamente le corrispondenze!

Riferimento a Stringa

La funzione deve fare riferimento alla stringa data almeno una volta. La stringa viene confrontata secondo il modulo 'fnmatch' di Python, e quindi supporta corrispondenza con wildcard. La corrispondenza è case-insensitive. Vengono considerate stringhe dei seguenti formati: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (questo può essere modificato nella classe Config).

Esempi:

  • "TestString" -> la funzione deve fare riferimento esattamente alla stringa (ignorando maiuscole/minuscole) almeno una volta
  • "TestStr*" -> la funzione deve fare riferimento a una stringa che inizia con 'TestStr' (es. TestString, TestStrong) almeno una volta (ignorando maiuscole/minuscole)

Nota: La corrispondenza delle stringhe è veloce e una buona scelta per ridurre rapidamente i candidati!

Riferimento a Nome

La funzione deve fare riferimento al nome/etichetta dato almeno una volta. Il nome/etichetta viene confrontato secondo il modulo 'fnmatch' di Python, e quindi supporta corrispondenza con wildcard. La corrispondenza è case-insensitive.

Esempi:

  • "memset" -> la funzione deve fare riferimento a un nome "memset" almeno una volta
  • "mem*" -> la funzione deve fare riferimento a un nome che inizia con "mem" (memset, memcpy, memcmp) almeno una volta

Nota: La corrispondenza dei nomi è molto veloce e ideale per ridurre rapidamente i candidati!

Dimensione Funzione

La dimensione della funzione deve essere entro il limite dato: "min <= dimensione funzione <= max". I dati vengono inseriti come stringa della forma "min,max". La dimensione di una funzione include tutti i suoi chunk.

Nota: La corrispondenza della dimensione della funzione è molto veloce e ideale per ridurre rapidamente i candidati!

Scorciatoie da Tastiera e GUI

Per facilità d'uso, FF può essere utilizzato tramite le seguenti scorciatoie da tastiera:

  • Ctrl+Alt+F -> avvia/mostra il TabWidget (GUI principale)
    • Oppure Visualizza->FindFunc
  • Ctrl+F -> avvia la ricerca con le regole attualmente abilitate
  • Ctrl+R -> raffina i risultati esistenti con le regole attualmente abilitate
  • Regole
    • Ctrl+C -> copia le regole selezionate negli appunti
    • Ctrl+V -> incolla le regole dagli appunti nella scheda corrente (aggiunge)
    • Ctrl+S -> salva le regole selezionate su file
    • Ctrl+L -> carica le regole selezionate da file (aggiunge)
    • Ctrl+A -> seleziona tutte le regole
    • Canc -> elimina le regole selezionate
  • Salva Sessione
    • Ctrl+Shift+S -> Salva la sessione su file
    • Ctrl+Shift+L -> Carica la sessione da file

Ulteriore utilizzo della GUI

  • Click destro sulla scheda: opzione per clonare la scheda
  • Le regole possono essere modificate facendo doppio click sulla colonna Data
  • Le regole possono essere invertite (corrispondenza negativa) facendo doppio click sulla colonna invert-match
  • Le regole possono essere abilitate/disabilitate facendo doppio click sulla colonna enabled
  • Click con la rotellina su qualsiasi cella in Regole o Risultati copia la cella negli appunti
  • I pattern di byte e gli immediati possono essere incollati direttamente dagli appunti nella tabella delle Regole
  • Le schede possono essere rinominata facendo doppio click su di esse
  • L'ordinamento è supportato sia per l'elenco delle Regole che per l'elenco dei Risultati
  • Doppio click su un elemento dei Risultati per saltarci in IDA
    • nome funzione: salta all'inizio della funzione
    • qualsiasi altra colonna: salta alla corrispondenza dell'ultima regola corrispondente
  • Checkbox Profile: produce informazioni di profilazione per la ricerca
  • Checkbox Debug: Scarica output di debug dettagliato per la corrispondenza delle regole di codice - usalo solo se poche funzioni arrivano alla regola di controllo del codice, altrimenti potrebbe richiedere molto tempo!

Copia Binaria Avanzata

Spesso vogliamo cercare pattern binari di assembly, ma senza indirizzi e valori hardcoded (immediati), o anche solo gli opcode effettivi dell'istruzione. FindFunc semplifica questo aggiungendo tre opzioni di copia al menu contestuale del disassembly:

Copia tutti i byte

Copia tutti i byte dell'istruzione come stringa esadecimale negli appunti, per l'uso in una Regola di Pattern di Byte (o nella ricerca binaria di IDA).

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

verrà copiato come

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

Copia solo byte non immediati

Copia i byte dell'istruzione per l'istruzione data, mascherando eventuali valori immediati. Esempio:

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

verrà copiato come

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

Copia solo opcode

Copia tutti i byte dell'istruzione come stringa esadecimale negli appunti, mascherando qualsiasi byte che non sia l'opcode effettivo (inclusi sib, modrm, ma mantenendo i prefissi legacy).

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

verrà copiato come

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

Copia opcode + immediati

Una combinazione che mantiene opcode e immediati, ma maschera ad esempio mod r/m. Nota che mantiene gli opcode anche se impongono registri specifici, ad esempio

root@kitploit:~
B8 44332211      mov eax,11223344

manterrà l'opcode B8.

Nota: Questo è un "best effort" utilizzando l'API di IDA, quindi potrebbero esserci pochi casi in cui funziona solo parzialmente. Per una soluzione corretta al 100%, dovremmo fornire una libreria di disassemblaggio x86 dedicata.

Risultati simili possono essere ottenuti con le Regole di Pattern di Codice, ma questo potrebbe essere più veloce, sia per l'interazione dell'utente che per la ricerca effettiva.

Copia disassembly

Copia il disassembly selezionato negli appunti, così come appare in IDA.

Prestazioni

Un breve commento sulle prestazioni:

  1. nome, stringa, dimensione funzione sono quasi gratuiti in tutti i casi
  2. pattern di byte è quasi gratuito per lunghezze del pattern > 2
  3. immediato è difficile: Possiamo usare la ricerca idaapi, o possiamo disassemblare l'intero database e cercare noi stessi - potremmo doverlo fare comunque se cerchiamo pattern di codice. MA: la scansione dei pattern di codice è in realtà molto più economica della scansione di un immediato. Una ricerca api per tutte le corrispondenze è relativamente costosa - circa 1/8 del costo di disassemblare l'intero database. Quindi: Se riduciamo le corrispondenze con regole economiche prima, allora traiamo grande vantaggio dal disassemblare le funzioni rimanenti e cercare l'immediato noi stessi, specialmente se è presente anche una regola di codice. Tuttavia: Se non ci sono opzioni economiche e dobbiamo disassemblare grandi parti del database comunque (a causa della presenza di regole di pattern di codice), allora l'uso di una regola immediata come pre-filtro può dare grandi frutti. La ricerca API di UN immediato è approssimativamente equivalente a 1/8 della ricerca di qualsiasi numero di regole di pattern di codice - anche se questo dipende anche da molti fattori diversi...
  4. i pattern di codice sono i più costosi di gran lunga, tuttavia controllare un pattern rispetto a molti è molto simile.

Todo (non ordinato):

  • pseudo-mnemonico jcc
  • Consentire posizioni nominate in CodeRules ('call memset')
  • aggiungere regola xref in/out
  • annulla/ripeti
  • barra di avanzamento
  • click centrale per chiudere le schede
  • menu scheda: chiudi tutte tranne questa
  • opzione 'ignora tutti gli operandi seguenti'
  • Regola per parametri delle chiamate API all'interno della funzione
  • Regola per requisiti funzione genitore/punto di chiamata/figlio
  • Regola per parametri di funzione
  • Regola regex
  • opzione maiuscole/minuscole per stringa/nome
  • convertire automaticamente le regole immediate in pattern di byte se applicabile?
  • impostazioni: sensibilità maiuscole/minuscole, tipi di stringa, intervallo, ...
  • Regole Hexray?
  • combinazione OR di regole
  • Pythonizzazione del codice ;)
  • Parallelizzazione
  • Generazione automatica di regole per identificare una funzione?
Scarica lo strumento