Как научить ИИ понимать ассемблер

Как научить ИИ понимать ассемблер

LOLZTEAM

Обучаем ИИ понимать ассемблерный код!

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

Больше интересных статей на нашем форуме: https://lolz.live/articles/

Подписывайтесь на канал и делитесь ссылкой на статью с друзьями!


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

Любой, кто занимался анализом программного обеспечения, понимает суть проблемы.

Вы загружаете исполняемый файл в дизассемблер (например, IDA Pro), включаете декомпилятор и сталкиваетесь с крайне сложным для восприятия кодом.

Вместо понятной логики вы видите:

— переменные вида v1, v2, v3

— функции формата sub_403000

— отсутствие комментариев и контекста

Пример типичного результата декомпиляции:

long long func_8048A10()
{
  long long res;
  long long temp_v;
 
  res = internal_call_1(2, 1, 0);
  if ( res < 0 )
    return -1LL;
  temp_v = res;
  *(short *)(res + 2) = helper_transform(8080);
  *(int *)(temp_v + 4) = parse_addr("127.0.0.1");
  if ( (unsigned int)check_status(temp_v, res, 16) < 0 )
  {
    cleanup(temp_v);
    return -1LL;
  }
  return (unsigned int)temp_v;
}

Современные языковые модели способны не просто преобразовывать байткод в текст, а анализировать поведение функции и делать выводы о её назначении.


Механика декомпиляции

Перед интеграцией ИИ необходимо понять, как формируется псевдокод из машинного кода.


1. Дизассемблирование

На начальном этапе у нас есть только массив байтов.

Задача — сопоставить байты с инструкциями процессора.

Часто используется библиотека Capstone Engine, которая поддерживает различные архитектуры.

Пример кода:

from capstone import *

# Срез байтов из исполняемого сегмента файла
raw_payload = b"\x55\x48\x89\xe5\x48\x83\xec\x10"

# Конфигурация движка под 64-битную архитектуру Intel
disassembler = Cs(CS_ARCH_X86, CS_MODE_64)

for instruction in disassembler.disasm(raw_payload, 0x1000):
    print(f"ADDR: 0x{instruction.address:x} | {instruction.mnemonic.upper()} {instruction.op_str}")

Результат — линейный список мнемоник, который можно читать, но логика программы всё ещё скрыта.


2. Реконструкция логики

Программа — это не просто список команд, а структура ветвлений.

Создаётся граф потока управления (CFG):

— инструкции группируются в базовые блоки
— блоки соединяются переходами
— формируются конструкции if/else, циклы, switch-case

3. Промежуточное представление (IR)

Декомпиляция — это не простая замена инструкций.

Существует промежуточный слой — IR (Intermediate Representation).

Ассемблер перегружен флагами:

— нулевой флаг

— перенос

— переполнение

IR упрощает это, делая поведение программы более прозрачным.

Важно: если обучать ИИ на «сыром» ассемблере, он будет тратить ресурсы на понимание архитектуры вместо логики.


4. Генерация C-псевдокода

Финальный этап — преобразование IR в читаемый код:

int function_400000(int arg1) {
    int var_4;
 
    var_4 = arg1;
 
    if (var_4 <= 0) {
        return 0;
    }
 
    return 1;
}

Однако имена переменных остаются неинформативными — здесь и применяется ИИ.


Интеграция искусственного интеллекта

ИИ может:

— определить назначение функции

— предложить осмысленные имена переменных

— добавить комментарии

— восстановить контекст


Выбор модели

Важно учитывать ограничения моделей — например, фильтрацию определённых типов кода.


API-интеграция

Декомпилятор отправляет в модель:

  1. Псевдокод
  2. Контекст
  3. Промпт

Пример реализации:

import requests
import json
import hashlib

class AIDecompiler:
    def __init__(self, api_key, model="gpt-5.2"):
        self.api_key = api_key
        self.model = model
        self.cache = {}
    
    def analyze_function(self, pseudocode, context):
        cache_key = hashlib.sha256(pseudocode.encode()).hexdigest()
        if cache_key in self.cache:
            return self.cache[cache_key]
        
        prompt = self.build_prompt(pseudocode, context)
        
        response = requests.post(
            "https://api.openai.com/v1/chat/completions",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "model": self.model,
                "messages": [
                    {"role": "system", "content": self.get_system_prompt()},
                    {"role": "user", "content": prompt}
                ],
                "temperature": 0.2,
                "response_format": {"type": "json_object"}
            }
        )
        
        result = response.json()
        analysis = json.loads(result['choices'][0]['message']['content'])
        
        self.cache[cache_key] = analysis
        return analysis
    
    def build_prompt(self, code, ctx):
        return f"""Analyze this decompiled function:

```c
{code}
```
Context:
API calls: {', '.join(ctx.get('apis', []))}
Strings: {', '.join(ctx.get('strings', []))}
Constants: {', '.join(map(str, ctx.get('numbers', [])))}
get_system_prompt(self):[/SIZE]
        return "You are an expert reverse engineer. Analyze code and suggest meaningful names based on usage patterns. Output JSON only."

Оптимизируем наш код, добавляя многопоточность

from concurrent.futures import ThreadPoolExecutor

def analyze_all_functions(functions, ai_client):
    results = {}
    
    with ThreadPoolExecutor(max_workers=8) as executor:
        futures = {}
        
        for func in functions:
            future = executor.submit(
                ai_client.analyze_function,
                func.pseudocode,
                func.context
            )
            futures[future] = func
        
        for future in futures:
            func = futures[future]
            try:
                result = future.result()
                results[func.address] = result
            except Exception as e:
                print(f"Failed to analyze {func.name}: {e}")
    
    return results

Результат: анализ ~1000 функций занимает 10–15 минут вместо нескольких часов.


Заключение

Каждый сделает вывод самостоятельно.

На текущий момент ИИ не способен полностью заменить специалиста, однако он значительно упрощает рутинные задачи и ускоряет анализ больших объёмов кода.


На этом всё. Удачи!


Наш форум: https://lolz.live

Наши проекты в Telegram: https://t.me/zelenka_guarantor_robot



Report Page