/ Модель

Характеристики

Контекст
8 192 токена
Параметры
6,6 млрд
Размер весов
13,5 ГБ
Лицензия
MIT
Архитектура
llama · dense
Опубликована
18 июн 2024

llm4decompile-6.7b-v2

Генерация текстаТекст → текст3 профессии

Производная модели LLM4Binary/llm4decompile-22b-v2. Модель Mistral с 22 млрд параметров, которая переводит инструкции x86 assembly в код на C для задач декомпиляции.

379скачиваний за 30 дней10лайковвеса обновлены25 июн 2024

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Тесты пользователейпока нет

Никто ещё не опубликовал тест этой модели. Соберите бенчмарк из своих задач — результат появится здесь.

  1. Добавьте модель в бенчмарк

    Вместе с другими моделями категории «Текст» — сравнение идёт внутри одной категории.

  2. Опишите свои задачи

    Напишите запросы, при необходимости приложите файлы и эталонные ответы.

  3. Запустите и опубликуйте

    Модели ответят на каждую задачу, судья оценит ответы. Опубликованный результат появится на этой странице.

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

Карточка модели LLM4Binary/llm4decompile-6.7b-v2 на Hugging Face совпадает с карточкой LLM4Binary/llm4decompile-22b-v2, поэтому описание составлено по ней.

LLM4Decompile-22B-v2 — модель семейства Mistral, разработанная проектом LLM4Decompile для преобразования инструкций x86 assembly в исходный код на C. Она предназначена для анализа и восстановления кода из дизассемблированных программ, а также для экспериментов с автоматической декомпиляцией. Модель содержит 22 млрд параметров, использует плотную архитектуру MistralForCausalLM и принимает последовательности длиной до 32 768 токенов по метаданным; в README для серии V2 указан максимальный размер последовательности обучения 4 096 токенов.

В README сообщается об обучении серии V2 на увеличенном наборе данных объёмом 2 млрд токенов и об улучшении результатов относительно предыдущей модели. Приведённые численные сравнения относятся к модели на 6,7 млрд параметров, поэтому их нельзя напрямую считать результатами версии 22B. Репозиторий содержит веса в формате safetensors. Лицензия MIT.

Сценарии применения

  • восстановление исходного кода C из x86 assembly
  • анализ дизассемблированных бинарных программ
  • подготовка чернового кода для обратной разработки
  • эксперименты с автоматической декомпиляцией

Ограничения

Сгенерированный код может не совпадать с исходником и требовать проверки и исправлений. README приводит результаты для версии 6,7B, поэтому по ним нельзя оценить качество именно модели 22B.

Для каких профессий подходит3

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

1. Introduction of LLM4Decompile

LLM4Decompile aims to decompile x86 assembly instructions into C. The newly released V2 series are trained with a larger dataset (2B tokens) and a maximum token length of 4,096, with remarkable performance (up to 100% improvement) compared to the previous model.

2. Evaluation Results

MetricsRe-executability RateEdit Similarity
Optimization LevelO0O1O2O3AVGO0O1O2O3AVG
LLM4Decompile-End-6.7B0.68050.39510.36710.37200.45370.15570.12920.12930.12690.1353
Ghidra0.34760.16460.15240.14020.20120.06990.06130.06190.05470.0620
+GPT-4o0.46950.34150.28660.31100.35220.06600.05630.05670.04990.0572
+LLM4Decompile-Ref-1.3B0.68900.37200.40850.37200.46040.15170.13250.12920.12670.1350
+LLM4Decompile-Ref-6.7B0.74390.46950.47560.42070.52740.15590.13530.13420.12730.1382
+LLM4Decompile-Ref-33B0.70730.47560.43900.41460.50910.15400.13790.13630.13070.1397

3. How to Use

Here is an example of how to use our model (Only for V2. For previous models, please check the corresponding model page at HF).

  1. Install Ghidra Download Ghidra to the current folder. You can also check the page for other versions. Unzip the package to the current folder. In bash, you can use the following:
cd LLM4Decompile/ghidra
wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_11.0.3_build/ghidra_11.0.3_PUBLIC_20240410.zip
unzip ghidra_11.0.3_PUBLIC_20240410.zip
  1. Install Java-SDK-17 Ghidra 11 is dependent on Java-SDK-17, a simple way to install the SDK on Ubuntu:
apt-get update
apt-get upgrade
apt install openjdk-17-jdk openjdk-17-jre

Please check Ghidra install guide for other platforms.

  1. Use Ghidra Headless to decompile binary (demo.py)

Note: Replace func0 with the function name you want to decompile.

Preprocessing: Compile the C code into binary, and disassemble the binary into assembly instructions.

import os
import subprocess
from tqdm import tqdm,trange

OPT = ["O0", "O1", "O2", "O3"]
timeout_duration = 10

ghidra_path = "./ghidra_11.0.3_PUBLIC/support/analyzeHeadless"#path to the headless analyzer, change the path accordingly
postscript = "./decompile.py"#path to the decompiler helper function, change the path accordingly
project_path = "."#path to temp folder for analysis, change the path accordingly
project_name = "tmp_ghidra_proj"
func_path = "../samples/sample.c"#path to c code for compiling and decompiling, change the path accordingly
fileName = "sample"

with tempfile.TemporaryDirectory() as temp_dir:
    pid = os.getpid()
    asm_all = {}
    for opt in [OPT[0]]:
        executable_path = os.path.join(temp_dir, f"{pid}_{opt}.o")
        cmd = f'gcc -{opt} -o {executable_path} {func_path} -lm'
        subprocess.run(
        cmd.split(' '),
        check=True,
        stdout=subprocess.DEVNULL,  # Suppress stdout
        stderr=subprocess.DEVNULL,  # Suppress stderr
        timeout=timeout_duration,
        )

        output_path = os.path.join(temp_dir, f"{pid}_{opt}.c")
        command = [
            ghidra_path,
            temp_dir,
            project_name,
            "-import", executable_path,
            "-postScript", postscript, output_path,
            "-deleteProject",  # WARNING: This will delete the project after analysis
        ]
        result = subprocess.run(command, text=True, capture_output=True, check=True)
        with open(output_path,'r') as f:
            c_decompile = f.read()
        c_func = []
        flag = 0
        for line in c_decompile.split('\n'):
            if "Function: func0" in line:#**Replace** func0 with the function name you want to decompile.
                flag = 1
                c_func.append(line)
                continue
            if flag:
                if '// Function:' in line:
                    if len(c_func) > 1:
                        break
                c_func.append(line)
        if flag == 0:
            raise ValueError('bad case no function found')
        for idx_tmp in range(1,len(c_func)):##########remove the comments
            if 'func0' in c_func[idx_tmp]:
                break
        c_func = c_func[idx_tmp:]
        input_asm = '\n'.join(c_func).strip()

        before = f"# This is the assembly code:\n"#prompt
        after = "\n# What is the source code?\n"#prompt
        input_asm_prompt = before+input_asm.strip()+after
        with open(fileName +'_' + opt +'.pseudo','w',encoding='utf-8') as f:
            f.write(input_asm_prompt)

Ghidra pseudo-code may look like this:

undefined4 func0(float param_1,long param_2,int param_3)
{
  int local_28;
  int local_24;
  
  local_24 = 0;
  do {
    local_28 = local_24;
    if (param_3 <= local_24) {
      return 0;
    }
    while (local_28 = local_28 + 1, local_28 < param_3) {
      if ((double)((ulong)(double)(*(float *)(param_2 + (long)local_24 * 4) -
                                  *(float *)(param_2 + (long)local_28 * 4)) &
                  SUB168(_DAT_00402010,0)) < (double)param_1) {
        return 1;
      }
    }
    local_24 = local_24 + 1;
  } while( true );
}
  1. Refine pseudo-code using LLM4Decompile (demo.py)

Decompilation: Use LLM4Decompile-Ref to refine the Ghidra pseudo-code into C:

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_path = 'LLM4Binary/llm4decompile-6.7b-v2' # V2 Model
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16).cuda()

with open(fileName +'_' + OPT[0] +'.pseudo','r') as f:#optimization level O0
    asm_func = f.read()
inputs = tokenizer(asm_func, return_tensors="pt").to(model.device)
with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=2048)### max length to 4096, max new tokens should be below the range
c_func_decompile = tokenizer.decode(outputs[0][len(inputs[0]):-1])

with open(fileName +'_' + OPT[0] +'.pseudo','r') as f:#original file
    func = f.read()

print(f'pseudo function:\n{func}')# Note we only decompile one function, where the original file may contain multiple functions
print(f'refined function:\n{c_func_decompile}')

4. License

This code repository is licensed under the MIT License.

5. Contact

If you have any questions, please raise an issue.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм

Можно запустить

Подбираем GPU…

Класс архитектуры
LlamaForCausalLM
Ревизия весов
ec74ee7

0 моделей