
Небольшая языковая модель, которая присваивает имена и описывает функции в бинарных файлах x86-64 без символов, с открытым набором данных, базовыми решениями и экспериментами по тонкой настройке LoRA.
English · Türkçe
Небольшая языковая модель, которая смотрит на функцию в бинарном файле без символов и даёт ей осмысленное имя и краткое описание.
Набор данных v4 содержит 228 177 функций из 341 проекта на 5 уровнях оптимизации и опубликован на Hugging Face в конфигурации v4. Скрипт для Ghidra готов. Лучшая небольшая модель на данный момент — Qwen3-8B + LoRA, обученная на данных v5 (сначала описание, затем имя), — достигает F1 по именам 0.124 на фиксированной тестовой выборке v4 и 0.155 на eval_115; лучшая большая модель с контекстом вызовов набирает 0.167 на той же тестовой выборке. См. раздел 6 «Результаты». Модель пишет описание в одно предложение на английском и турецком вместе с именем. Адаптер доступен на Hugging Face: krxi123/asmsense-qwen3-8b-lora.
Откройте программу без символов в Ghidra или IDA, и вы увидите сотни функций с именами вида FUN_00401a30. Значительная часть реверс-инжиниринга состоит в том, чтобы понять и назвать эти функции одну за другой. Этот проект нацелен на то, чтобы обучить модель этому первому шагу:
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.
Большие универсальные модели в какой-то степени справляются с этой задачей, но они медленные, дорогие и работают в облаке. Цель — ответить на вопрос:
Может ли маленькая модель, обученная на специально подготовленных данных, сравняться с большими моделями или даже превзойти их в этой задаче — при этом работая на ноутбуке?
На одном и том же тестовом наборе оцениваются три уровня:
| Уровень | Модель | Роль |
|---|---|---|
| Потолок | Большие открытые модели (DeepSeek, GLM, MiMo, Gemma, Qwen) | Лучшее, что достижимо на данный момент с готовыми моделями |
| Базовая линия | Маленькая открытая модель до дообучения | Отправная точка |
| Этот проект | Та же маленькая модель + LoRA на этом датасете | Вклад проекта |
Генерация данных (cikar.py): Открытые C-проекты компилируются для x86-64 на разных уровнях оптимизации (-O0, -O2). Ассемблерный код каждой функции извлекается. Эталонный ответ — исходное имя функции — берётся напрямую из исходного кода, поэтому ручная разметка не требуется. projeler.json фиксирует коммит и флаги компилятора, использованные для каждого проекта.
Имитация stripped-бинарника: Результат напоминает то, что Ghidra показывает для функции в stripped-бинарнике:
sub_01a3, а глобальные данные — dat_0042 (числа перемешаны, с отдельными пространствами имён для -O0 и -O2),loc_1 и loc_2,memcpy, __stack_chk_fail) и строковые литералы (; -> "out of memory") остаются видимыми, поскольку они также видны в реальном бинарнике.Если настоящее имя функции встречается в её собственном ассемблерном коде — например, в сообщении об ошибке — строка помечается sizinti и исключается из тестового набора.
Оценка (taban.py): Модель получает только ассемблерный код и должна предсказать имя. Предсказания оцениваются по пересечению токенов (F1), поэтому близкие ответы, такие как crc32_update и update_crc, получают частичный зачёт.
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
| Проекты | Функции (-O0 + -O2) | |
|---|---|---|
| Обучение | zlib, libpng, sqlite, lua, mbedtls, zstd, libsodium, expat, brotli, jansson, lz4, libyaml, xxhash, cJSON | 16 804 |
| Тест (устойчивый к запоминанию) | tomlc17, cyaml, mu_json_x, sajs, picomatch | 777 → оценочный набор 115 |
Набор данных доступен на Hugging Face: krxi123/asmsense (16 804 обучающих примера, 777 тестовых примеров, оценочный набор eval_115 и тексты лицензий). Также зеркалирован на Kaggle: krxiii/asmsense.
C-проекты с разрешительными лицензиями (MIT, BSD, Apache-2.0, ISC, zlib), отобранные с GitHub с помощью olcekle.py, были скомпилированы на уровнях -O0/-O1/-O2/-O3/-Os с использованием cikar_bin.py (реальная dylib + strip -x). Скрипты сборки проектов не запускались; файлы компилировались по отдельности с помощью clang, а файлы или проекты, которые не скомпилировались, пропускались. Строки дедуплицировались по нормализованному хешу ассемблера. Строки, ассемблер которых совпадал с данными валидации/теста, удалялись из обучения, а вендорные копии, пары (файл, имя) которых встречались в обучении, удалялись из валидации/теста. Каждая строка имеет поле lisans.
| Разбиение | Проекты | Строки | Уникальные исходные функции |
|---|---|---|---|
| Обучение | 290 | 196 117 | 72 179 |
| Валидация | 23 | 19 770 | 6 667 |
| Тест (малоизвестные, ≤200 звёзд, 2024+) | 28 | 12 290 | 4 685 |
Из 473 проектов 352 дали строки, а 120 не скомпилировались (код ядра, встраиваемых систем или платформозависимый код). Использовался только clang. Данные хранятся вне Git и могут быть восстановлены с помощью python3 aday_bul.py и python3 olcekle.py hepsi.
Разбиение на обучение/тест строго на уровне проектов: ни одна функция из проекта не может появиться по обе стороны. Тестовые проекты были намеренно выбраны малоизвестными (2-190 звёзд), и большинство из них начаты в 2024-2025 годах, что делает гораздо менее вероятным, что крупные модели встречали их во время обучения, чем такую библиотеку, как zlib. Лицензии: veri/LISANSLAR.md.
Известное исключение: вендорный код. Независимый аудит выпущенных данных v6 (rapor/arastirma/V6_VERI_DENETIMI.md, veri_denetim_v6.py) подтвердил, что ни один проект, id или (проект, файл, имя) не появляется по обе стороны, но тестовый проект snkv встраивает SQLite под своими собственными именами файлов, тогда как sqlite является обучающим проектом. В исправленной тестовой выборке из 2 000 строк 217 строк (10,85%) имеют имя, идентичное обучающей функции SQLite. Каждая модель набирает меньше баллов на этих строках, поэтому они не завышают результаты; вместо этого они сужают разрыв между малыми и большими моделями (см. Результаты, раздел 6). Выборка валидации valid_300 содержит 16 похожих строк (5,3%).
Средний F1 по именам (1,0 = точное совпадение). В столбце «F1 без префикса» общий префикс имён каждого проекта (cyaml_, mu_, sajs_) удаляется с обеих сторон; модель не может вывести этот префикс из ассемблера.