
Piccolo modello linguistico che assegna nomi e descrive funzioni in binari x86-64 privati delle informazioni di simboli, con un dataset aperto, baseline ed esperimenti di fine-tuning LoRA.
Inglese · Turco
Un piccolo modello linguistico che esamina una funzione in un binario stripped e le assegna un nome significativo e una breve descrizione.
Il dataset v4 contiene 228.177 funzioni provenienti da 341 progetti su 5 livelli di ottimizzazione ed è pubblicato su Hugging Face con la configurazione v4. Lo script Ghidra è pronto. Il miglior modello piccolo finora, Qwen3-8B + LoRA addestrato sui dati v5 (prima la descrizione, poi il nome), raggiunge un name F1 di 0,124 sul campione di test fisso v4 e 0,155 su eval_115; il miglior modello grande con contesto delle chiamate ottiene 0,167 sullo stesso campione di test. Vedi Risultati, sezione 6. Il modello scrive una descrizione di una frase in inglese e in turco insieme al nome. L'adapter è su Hugging Face: krxi123/asmsense-qwen3-8b-lora.
Apri un programma stripped in Ghidra o IDA e vedrai centinaia di funzioni chiamate FUN_00401a30. Gran parte del reverse engineering consiste nel comprendere e nominare queste funzioni una per una. Questo progetto mira a insegnare a un modello quel primo passo:
input (stripped x86-64) target output
───────────────────────────── ──────────────────────────────────────────────
movzx eax, byte ptr [rsi] name: adler32_update
lea rdx, [rdi + rax] description: Computes the Adler-32 checksum
cmp rdx, 0xfff1 ← 65521 over the bytes of a buffer.
... # TR: Tampondaki baytlar üzerinden Adler-32
# sağlama toplamı hesaplar.
I grandi modelli general-purpose possono gestire questo compito in una certa misura, ma sono lenti, costosi e ospitati nel cloud. L'obiettivo è rispondere a questa domanda:
Può un modello piccolo addestrato su dati creati ad hoc eguagliare o persino superare i grandi modelli su questo compito—pur girando su un laptop?
Tre livelli vengono valutati sullo stesso set di test:
| Livello | Modello | Ruolo |
|---|---|---|
| Tetto | Grandi modelli aperti (DeepSeek, GLM, MiMo, Gemma, Qwen) | Il meglio attualmente ottenibile con modelli off-the-shelf |
| Baseline | Modello piccolo aperto, prima del fine-tuning | Punto di partenza |
| Questo progetto | Lo stesso modello piccolo + LoRA su questo dataset | Il contributo del progetto |
Generazione dei dati (cikar.py): Progetti C open-source vengono compilati per x86-64 a diversi livelli di ottimizzazione (-O0, -O2). L'assembly di ogni funzione viene estratto. La ground truth—il nome originale della funzione—proviene direttamente dal sorgente, quindi non serve etichettatura manuale. projeler.json registra il commit e i flag del compilatore usati per ogni progetto.
Simulazione di un binario stripped: L'output assomiglia a ciò che Ghidra mostra per una funzione in un binario stripped:
sub_01a3, e i dati globali diventano dat_0042 (i numeri sono rimescolati, con namespace separati per -O0 e -O2),loc_1 e loc_2,memcpy, __stack_chk_fail) e i letterali stringa (; -> "out of memory") rimangono visibili perché sono visibili anche in un binario reale.Se il nome reale della funzione appare nel suo stesso assembly—per esempio, in un messaggio di errore—la riga viene marcata sizinti ed esclusa dal set di test.
Valutazione (taban.py): Il modello riceve solo l'assembly e gli viene chiesto di predire un nome. Le predizioni vengono valutate tramite sovrapposizione di token (F1), quindi risposte vicine come crc32_update e update_crc ricevono credito parziale.
loc_6:
movzx r9d, byte ptr [rsi + rdx]
add rdi, r9 ← adler32_z (-O2), as the model sees it
add rcx, rdi
inc rdx
cmp rax, rdx
jne loc_6
| Progetti | Funzioni (-O0 + -O2) | |
|---|---|---|
| Addestramento | zlib, libpng, sqlite, lua, mbedtls, zstd, libsodium, expat, brotli, jansson, lz4, libyaml, xxhash, cJSON | 16.804 |
| Test (resistente alla memorizzazione) | tomlc17, cyaml, mu_json_x, sajs, picomatch | 777 → set di valutazione 115 |
Il dataset è disponibile su Hugging Face: krxi123/asmsense (16.804 esempi di addestramento, 777 esempi di test, il set di valutazione eval_115 e i testi delle licenze). È inoltre replicato su Kaggle: krxiii/asmsense.
Progetti C con licenza permissiva (MIT, BSD, Apache-2.0, ISC, zlib) selezionati da GitHub con olcekle.py sono stati compilati a -O0/-O1/-O2/-O3/-Os usando cikar_bin.py (dylib reale + strip -x). Gli script di build dei progetti non sono stati eseguiti; i file sono stati compilati singolarmente con clang, e i file o i progetti che non riuscivano a compilare sono stati saltati. Le righe sono state deduplicate tramite hash dell'assembly normalizzato. Le righe con assembly identico ai dati di validazione/test sono state rimosse dall'addestramento, mentre le copie vendored le cui coppie (file, name) comparivano nell'addestramento sono state rimosse da validazione/test. Ogni riga ha un campo lisans.
| Split | Progetti | Righe | Funzioni sorgente uniche |
|---|---|---|---|
| Addestramento | 290 | 196.117 | 72.179 |
| Validazione | 23 | 19.770 | 6.667 |
| Test (poco noti, ≤200 stelle, 2024+) | 28 | 12.290 | 4.685 |
Su 473 progetti, 352 hanno prodotto righe e 120 non sono riusciti a compilare (codice kernel, embedded o dipendente dalla piattaforma). È stato usato solo clang. I dati sono tenuti fuori da Git e possono essere rigenerati con python3 aday_bul.py e python3 olcekle.py hepsi.
La suddivisione addestramento/test è rigorosamente a livello di progetto: nessuna funzione di un progetto può comparire su entrambi i lati. I progetti di test sono stati scelti deliberatamente tra quelli poco noti (2-190 stelle), e la maggior parte è stata avviata nel 2024-2025, rendendo molto meno probabile che i modelli di grandi dimensioni li abbiano incontrati durante l'addestramento rispetto a una libreria come zlib. Licenze: veri/LISANSLAR.md.
Eccezione nota: codice vendored. Un audit indipendente dei dati v6 rilasciati (rapor/arastirma/V6_VERI_DENETIMI.md, veri_denetim_v6.py) ha confermato che nessun progetto, id o (project, file, name) compare su entrambi i lati, ma il progetto di test snkv incorpora SQLite sotto i propri nomi di file mentre sqlite è un progetto di addestramento. Nel campione di test fisso di 2.000 righe, 217 righe (10,85%) hanno un nome identico a una funzione di addestramento di SQLite. Ogni modello ottiene punteggi più bassi su quelle righe, quindi non gonfiano i risultati; restringono invece il divario tra piccolo e grande (vedi Risultati, sezione 6). Il campione di validazione valid_300 contiene 16 righe simili (5,3%).
F1 medio sui nomi (1,0 = corrispondenza esatta). Nella colonna "F1 con prefisso rimosso", il prefisso comune del nome di ciascun progetto (cyaml_, mu_, sajs_) viene rimosso da entrambi i lati; il modello non può inferire questo prefisso dall'assembly.