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

Статья Обфускация С/С++ кода с помощью Python и libclang

Пожалуйста, обратите внимание, что пользователь заблокирован
никто не думал создать свой компилятор, да может-быть сложно,
Пробовали, давно еще слышал такое; надо генерить бинарник очень правильный, иначе аверы локнут даже на хелловорде (как они делают с бинарниками на экзотических асмах или на С-- каком-нибудь).
Ну и да, очень сложно. Знал людей (партнерка), что планировали выкупить 1 паблик компилер, но чето не выгорело у них.
Почитай книгу "Редкая профессия", автор Зуев Евгений (есть в паблике), там технической инфы нет как такой, но в целом интересное чтиво.
 
иначе аверы локнут даже на хелловорде
Это в целом очень забавно кстати, ловить детекты на абсолютно белом коде. Нахер такое удовольствие. Вот серьезно, хз как нейтив для малвари может быть тру с учетом хотя бы этого нюанса. Ну вот задача например, на лин серверах крутится проект в докере, допустим я хочу сделать автоморф сорцов + компиляцию(билдер в вебе, new build+obfuscation per install). Есть mingw компилер, позволяющий билдить с под линухи для винды. Но этот компиль даже на хэлловорлде обосрался на 15 детектов. Каков выход?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Это в целом очень забавно кстати, ловить детекты на абсолютно белом коде. Нахер такое удовольствие. Вот серьезно, хз как нейтив для малвари может быть тру с учетом хотя бы этого нюанса.
Ну код отличается от стандартного, всякие маргинальные компиляторы, которые сами генерируют нативный код (не через LLVM или GIMPLE), типа PureBasic'а или Red'а постоянно имеют проблемы с ложным срабатыванием аверов. Авер ожидает увидеть нативный код в определенном виде, а получает какую-то нестандартную херню. Вот и орет.
 
Ну код отличается от стандартного, всякие маргинальные компиляторы, которые сами генерируют нативный код (не через LLVM или GIMPLE), типа PureBasic'а или Red'а постоянно имеют проблемы с ложным срабатыванием аверов. Авер ожидает увидеть нативный код в определенном виде, а получает какую-то нестандартную херню. Вот и орет.
Ну вот я отредактировал выше. Mingw вроде на слуху. Тем не менее...
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но этот компиль даже на хэлловорлде обосрался на 15 детектов
Уже лет 8 собираю софт с помощью MinGW, детектов не имею, что у меня не так с руками?
 
Уже лет 8 собираю софт с помощью MinGW, детектов не имею, что у меня не так с руками?
С под линукса для винды? Если да, то хз что ответить. В 2017-18 тестил, чёт хреново все шло...
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
С под линукса для винды? Если да, то хз что ответить. В 2017-18 тестил, чёт хреново все шло, я и забил на нейтив вектор априори, под вдохновением PS Empire, если ты понимаешь о чем я
Да, с Линукса, ну давай протестим:
C:
#include <stdio.h>

int main(int argc, char** argv) {
    puts("Hello World!");
    return 0;
}
Код:
i686-w64-mingw32-gcc   -o main32.exe -O3 -Os -static -s -flto main.c
x86_64-w64-mingw32-gcc -o main64.exe -O3 -Os -static -s -flto main.c
Код:
[kycb@kycb-manjaro AVCheck]$ i686-w64-mingw32-gcc --version
i686-w64-mingw32-gcc (GCC) 10.2.0

[kycb@kycb-manjaro AVCheck]$ x86_64-w64-mingw32-gcc --version
x86_64-w64-mingw32-gcc (GCC) 10.2.0
По одному аверу из 71 психанули.
 
Да, с Линукса, ну давай протестим:
C:
#include <stdio.h>

int main(int argc, char** argv) {
    puts("Hello World!");
    return 0;
}
Код:
i686-w64-mingw32-gcc   -o main32.exe -O3 -Os -static -s -flto main.c
x86_64-w64-mingw32-gcc -o main64.exe -O3 -Os -static -s -flto main.c
Код:
[kycb@kycb-manjaro AVCheck]$ i686-w64-mingw32-gcc --version
i686-w64-mingw32-gcc (GCC) 10.2.0

[kycb@kycb-manjaro AVCheck]$ x86_64-w64-mingw32-gcc --version
x86_64-w64-mingw32-gcc (GCC) 10.2.0
По одному аверу из 71 психанули.
Интересно девки пляшут... точно помню что у меня такое было, я ещё сгорел с этого тогда, а такое не забывается.
В теории, из-за старой версии компилятора могло, как считаешь?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В теории, из-за старой версии компилятора могло, как считаешь?
Не знаю, у аверов вообще бывает странное представление о легитимном коде. Может из-за старой версии, может из-за каких-то настроек оптимизации или их отсутствия, может из-за дебажной информации формата dwarf, которая по-умолчанию дописывается в оверлей PE-файла.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Это в целом очень забавно кстати, ловить детекты на абсолютно белом коде. Нахер такое удовольствие. Вот серьезно, хз как нейтив для малвари может быть тру с учетом хотя бы этого нюанса.
Когда начинал кодить на асме, тоже поначалу удивлялся, как прога с 1 мессаджебоксом детектится, причем не абы как, а именно как Троян. Потом смирился, что уж. Аверы ленивые, и то, что не подпадает под стандарты (небольшой размер, нет иконки, манифеста, и т.д.) автоматом детектится. Все самопальные упаковщики тоже давно нелегитимны в глазах аверлабов.
А щас еще и облако, т.е. рейтинг файла, если его не запускали нигде - тот же смартскрин локнет или еще какой evo-gen.
Почему аверы не могут закодить нормальные движки, те же эмуляторы и проактивки, а полагаются на устаревшую морально эвристику - фиг знает. Нам еще ладно, а вот белые разрабы на разных масмах/си постоянно пишут аверам жалобы на фолс позитив, часто безрезультатно.

а с шарпом что, лучше ситуация? Т.е. если я возьму и соберу хелловорлд, допустим, 2003 / 5 студией, вот тупо мессаджебокс/екзит, что будет на виртотале?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В теории, из-за старой версии компилятора могло, как считаешь?
Да Haunt, все из-за компилятора, тестил когда-то. Ты тогда на чем под че собирал?
Я помню, 2019 студия давала больше детектов на месседжбокс нежели 12 года. Очень странно себя ведет. Скорее всего компилятор оставляет фингерпринты под которые детектят, а именно под какую-то студию собрали большее кол-во малвари с опредленными параметрами компиляции.
Еще вродь есть ли файл манифеста, отклад инфа и т.п. тоже чекается.
хз насчёт шарпа.
Вот удивительно бро, не подскажешь почему пш те же инвоки не инвоки, запуск в памяти делает без той боли, что я делаю на нейтиве (меньше детектов). По сути пш на шарпе написан, а все по сути склоняется к тем же самым апишкам, которые я вызываю в VC++. Я предпологаю, что под пш мало пишут малвари (ситуация как с питоном когда-то) и нету каких-то сигнатур и т.п. Подумываю приглянуться к пешэ)
 
Почему аверы не могут закодить нормальные движки, те же эмуляторы и проактивки, а полагаются на устаревшую морально эвристику - фиг знает.
Потому-что аверы уже давно не развиваются и в целом им пофиг на пользователей...

Взять тот-же Др. веб, столько там багов, фолсов и т.д.

А писать в тп. бесполезно, там какие-то боты похоже сидят, вообще думаю все уже поняли что в будущем наверное и смысла в антивирусах не будет, т.к. защиты они практически не дают, мне кажется если у кого новая бесятка, стандартных средств вполне достаточно...

Единственное они не такие удобные, антивирусы может-быть более удобные и гибкие в настройках, это единственное их преимущество сейчас, перед штатными средствами винды.

Для андроида вообще нет смысла в антивирусах, если только там не плохие средства типо блокировка устройства в случае потери, слежение за местоположением и т.д.)
 
Но вообще я знал людей, которые писали проект по морфингу из под студии, модифицируя их компилятор. Так и не завершили, кстати говоря.
Есть технические подробности?
Покрутил код, увидел следующее

Чтобы получить obj cl.exe динамически подгружает c1.dll - frontend для C или c1xx.dll - frontend для C++ и c2.dll - backend для кодогенерации
все они экспортируют InvokeCompilerPassW() с одинаковым прототипом (из главного это количество передаваемых аргументов-ключей и сами ключи)
на каждую компилируемую единицу frontend в %temp% создает файлы (IL) с суффиксами sy (LocalSymbolIL), gl (GlobalSymbolIL), ex (ilsExp), in (ilsInit), db (ilsDB), далее их обрабатывает backend и генерирует obj
студийный морфер в моем понимании есть манипуляция этим самым IL
Имена модулей и одноименный экспорт наводит на мысль что есть недок. способ подгрузить свои c3/c4/c5, но это ерунда-вопрос, главное описать формат IL
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Сорян за некропостинг, но небольшое дополнение по статье. Эта статья использует libclang для парсинга Плюсов и обхода AST, но недавно я в качестве эксперимента попробовал библиотеку tree-sitter для того же. В принципе для целей обфускации на мой взгляд сейчас она подходит получше в том плане, что не требует заранее обрабатывать исходники препроцессором. Поэтому процесс обфускации сорсов проходит существенно быстрее. Возможно, некоторые анализы с ее помощью в сравнении с либшлангом не удастся провести (например, отличать вызов функции от вызова конструктора и тому подобное), но вопрос в том, нужно ли это в ваших обфускаторах. Кроме того, "сидельщик на дереве" может и в другие языки программирования, так что на его базе можно сделать обфускатор сразу для нескольких разных языков программирования. В Петухоне есть готовые сборки для разных языков: "pip install tree-sitter-builds" и пошуршали. Но как обычно, имейте ввиду, что "сидельщик на дереве" - это Цэшная библиотека, а сборка сторонняя (насколько я понял), так что в теории ничто не помешает автору этой сборки сделать атаку на цепочку поставок, будьте с этим аккуратнее.
 
Я хотел еще впилить демонстрационный пример control flow flattening, но уже вышло овер 20к символов без учета кода, подумал, что никто не будет такую длинную статью читать)
Я изучаю этот вопрос и мне очень нужны документы или сопутствующая полезная информация. Мы с нетерпением ждем вашего обмена
 
Сорян за некропостинг, но небольшое дополнение по статье. Эта статья использует libclang для парсинга Плюсов и обхода AST, но недавно я в качестве эксперимента попробовал библиотеку tree-sitter для того же. В принципе для целей обфускации на мой взгляд сейчас она подходит получше в том плане, что не требует заранее обрабатывать исходники препроцессором. Поэтому процесс обфускации сорсов проходит существенно быстрее. Возможно, некоторые анализы с ее помощью в сравнении с либшлангом не удастся провести (например, отличать вызов функции от вызова конструктора и тому подобное), но вопрос в том, нужно ли это в ваших обфускаторах. Кроме того, "сидельщик на дереве" может и в другие языки программирования, так что на его базе можно сделать обфускатор сразу для нескольких разных языков программирования. В Петухоне есть готовые сборки для разных языков: "pip install tree-sitter-builds" и пошуршали. Но как обычно, имейте ввиду, что "сидельщик на дереве" - это Цэшная библиотека, а сборка сторонняя (насколько я понял), так что в теории ничто не помешает автору этой сборки сделать атаку на цепочку поставок, будьте с этим аккуратнее.
Не нашел ни в одной из упомянутых в треде либ возможность получить cfg на уровне AST. В llvm есть метод для дампа Cfg на уровне сорцов https://clang.llvm.org/docs/InternalsManual.html#conditional-control-flow, но не АСТ. Парсить basic блоки вручную это единственный выход?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Парсить basic блоки вручную это единственный выход?
Что значит парсить в ручную? AST - это дерево, считай, что все statement'ы дети блока с кодом являются базовыми блоками внутри родителя. Или я не понял, что тебе нужно?
 
Что значит парсить в ручную? AST - это дерево, считай, что все statement'ы дети блока с кодом являются базовыми блоками внутри родителя. Или я не понял, что тебе нужно?
Мне нужно получить Control flow graph для AST.

так cfg выглядит для сорцов.
1735059665015.png


cfg для IR.
1735059794685.png


Мне нужно тоже самое для AST. В AST нет CF блоков. Это просто сорцы в древовидном виде. Мне нужно, чтобы все стейтменты были разбиты на cf блоки с successors и predecessors.

Парсить вручную - значит нет готового решения под мой запрос и нужно вручную смотреть все cf стейтменты if/goto/while... и разбивать на блоки, потом строить связи между ними, или брать source level cfg и соотносить с AST.
 


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