• XSS.stack #1 – первый литературный журнал от юзеров форума

libclang, LLVM, etc

xChimera

Malware...
Пользователь
Регистрация
19.08.2024
Сообщения
781
Реакции
551
Гарант сделки
2
Депозит
0.0282
Занимаюсь разработкой полноценного морфера, морфлю си так как софт весь на нем

Использую шланг и питон под эти цели, но сталкиваюсь с разными нюансами, из за которых приходится создавать велосипеды

Работал чуть чуть с ллвм, инструмент мощный, но сложный, при сборке паса нужно ждать пока пересоберется куча файлов

В общем хочу узнать актуальную информацию о том, что лучше использовать, как, в какой конфигурации и среде

А также хотелось бы услышать опыт людей
 
Понимаю что все готовятся к новому году, но все же поднимаю тему
 
Привет, с наступающим!
при сборке паса нужно ждать пока пересоберется куча файлов
Пересобираются не все файлы, а только те что изменились (если в конфигурации ничего не менял).
С самим LLVM IR не очень удобно работать с помощью Си-апи, много чего нет по сравнению с плюсовым апи.
Сам морфер/обфускатор не обязательно делать в виде плагина, можно слинковаться с LLVM и юзать Си-апи, дописывая свои обёртки над плюсовым апи, или же пойти совсем по другому пути: реализовать парсер LLVM IR (text или binary) и свою структуру in-memory модуля, апи к нему. Я пошёл по этому же пути - синтаксис у LLVM IR достаточно простой, соотв. распарсить не составит труда (см. llvm/lib/AsmParser/LLParser.cpp), чуть труднее правильно спроектировать саму структуру модуля, на расте в 15к строк кода уместилось всё вместе. Из плюсов - нет гемора с FFI, можно написать на любом удобном тебе языке, можешь вертеть IR как душе угодно.
 
С наступившим)
не обязательно делать в виде плагина, можно слинковаться с LLVM и юзать Си-апи
Не совсем понял, как это реализовать

по поводу си апи - на плюсах я писать умею, но возникли сложности с понимаем апи ллвм

читал пасы ОЛЛВМ и некоторых других обфускаторов, логика понятна, но не ясно как писать это самому


или же пойти совсем по другому пути: реализовать парсер LLVM IR (text или binary)
Спасибо за идею! Звучит очень интересно...

на расте в 15к строк кода уместилось всё вместе
... и несколько пугающе)
 
Не совсем понял, как это реализовать
Создаёшь контекст LLVMContextCreate, создаёшь MemoryBuffer LLVMCreateMemoryBufferWithContentsOfFile, создаёшь сам модуль LLVMModuleCreateWithName, ну и парсишь с помощью LLVMParseIRInContext - далее проделываешь нужные операции с модулем. Как это сделать в плюсом апи - не помню.
Чтоб быстро вкатиться в LLVM IR - пиши код на Си, clang -S -emit-llvm some_code.c и смотри как он выглядит в IR, читай лэнгреф.
читал пасы ОЛЛВМ и некоторых других обфускаторов, логика понятна, но не ясно как писать это самому
Не верный подход. Сначала думай что тебе нужно сделать, потом думай как - для начала можешь вручную написать какой-либо код - расшифровать (предварительно её зашифровав вручную) глобальную переменную, к примеру. Создай буфер на стэке, напиши цикл, который дешифрует каждый элемент из глобальной переменной и сохраняет в созданном буфере, замени по месту использования на свой буфер. Как получится сделать это вручную - думай как это можно автоматизировать. Проходимся по каждой глобальной переменной, смотрим подходит ли она для шифрования, собираем всех пользователей этой GV, вставляем декриптор по месту использования.
 
Не верный подход. Сначала думай что тебе нужно сделать, потом думай как - для начала можешь вручную написать какой-либо код - расшифровать (предварительно её зашифровав вручную) глобальную переменную, к примеру. Создай буфер на стэке, напиши цикл, который дешифрует каждый элемент из глобальной переменной и сохраняет в созданном буфере, замени по месту использования на свой буфер. Как получится сделать это вручную - думай как это можно автоматизировать. Проходимся по каждой глобальной переменной, смотрим подходит ли она для шифрования, собираем всех пользователей этой GV, вставляем декриптор по месту использования.
С помощью либкланг как раз таки у меня реализовано шифрование чисел, строк
 
Создаёшь контекст LLVMContextCreate, создаёшь MemoryBuffer LLVMCreateMemoryBufferWithContentsOfFile, создаёшь сам модуль LLVMModuleCreateWithName, ну и парсишь с помощью LLVMParseIRInContext - далее проделываешь нужные операции с модулем. Как это сделать в плюсом апи - не помню.
llvm::LLVMContext, MemoryBuffer::getFile, parseIR funcs in llvm::IRReader -> unique_ptr<llvm::Module>
С помощью либкланг как раз таки у меня реализовано шифрование чисел, строк
17.jpg
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх