Доброго времени суток, форумцы! Озадачился сабжем, нашел такую штуку, как ADVobfuscator и что то не могу понять, как это должно работать. Я думал, что сабж должен как то скрывать строки в программе, но этого не происходит. В IDA строки видны на вкладке Strings. Почему так?
Попробую. Есть проект ADVobfuscator , кторый обещает скрывать строки в коде программ. Это я так понял, если я ошибаюсь - ткните носом. Я решил откомпилировать этот проект и проверить, каким образом скрываются строки и обнаружил: .rdata:00000001400201DF db 0 .rdata:00000001400201E0 aBritneySpears db 'Britney Spears',0 ; DATA XREF: sub_140014D50+3B↑o .rdata:00000001400201E0 ; sub_140014D50+75↑o ... .rdata:00000001400201EF db 0 Строка Britney Spears, которая должна быть скрыта, видна в дизассемблере IDA и на нее есть перекрестная ссылка. Я не понимаю, почему так, ведь кажется, что автор обещал, что строки будут шифроваться. Я мог бы прикрепить исполняемый файл, но врятли это нужно, ведь по ссылке есть готовый проект на гитхабе, компиляция и скачивание занимает 1 минуту...
https://github.com/andrivet/ADVobfuscator/blob/master/Examples/ObfuscatedStrings/main.cpp - это штоли? каким компилятором собирал? есть поддержка C++14 в нем? C++17?
визуалстудия 2017 вижуалстудии 2017 рознь: тут используется только расширенный констекспр и переодичные шаблоны, насколько я понимаю: https://github.com/andrivet/ADVobfuscator/blob/master/Lib/MetaString.h --- Сообщение объединено, Jan 6, 2019 --- какое же ублюдочное метапрограммирование в плюсах, я уж и забыл совсем...
не, я не знаю... кроме того, что не поддерживается какие-то фичи стандарта, типа костекспр выполняется не на этапе компиляции больше ничего в голову не приходит... а копаться и дебажить эту кучу шаблонного гуано в плюсах - не простая задача...
у плюсов ужасное метапрограммирование, шаблоны - это по сути унылая версия Хаскелла, когда пытаешься их использовать на этапе компиляции... констэкспр по сути должен быть реализацией CTFE, но по факту он далеко не всегда работает как предполагали авторы подобных обфускаторов... и при всем при этом, даже если это работает, то это все равно будет существенно тормозить сборку проекта... я рекомендую забить и сделать какой-нить простой препроцессор для сорсов на базе AST, или регулярками, если надо только строки шифровать... все, что сделано на базе уродского метапрограммирования на плюсах, всегда будет костылем, а не нормальным решением... --- Сообщение объединено, Jan 6, 2019 --- я знаю, о чем тут говорю, я был одним из первопроходцев этого гуано, когда студия еще ничего из этого не саппортила: http://www.rohitab.com/discuss/topic/39611-malware-related-compile-time-hacks-with-c11/ (сюда тож постил версию на русском языке, но чет не могу найти в поиске)...
Мне кажется, проще решить задачу так: 1. Прогнать исходники через препроцессор. 2. Прогнать препроцессированный код через обфускатор строк. 3. Скомпилировать обфусцированный код. Всё это метапрограммирование, мягко говоря, Spoiler полное говно и костыли .
На мой взгляд, самый достойный внимания метод - создание рандомных значений препроцессором и компиляция с созданными рандомными значениями (особенно хорошо работает на скрытии кода по поиску api по значению хешей - которые все все равно продолжают оставлять статическими). И последующее применение в двух или трех фазном шеллкоде с упаковкой второй части aplib и динамической распаковки в процессе работы первой фазы кода, плюс использование PIC сишного кода на порядок упрощают задачу как отладки, так и разработки шеллкодов любой сложности. Имхо, 99,9 процентов детектов в памяти обязаны своим происхождением именно поиску адресов по хешам...
интересная книжка по сабжу метапрограммирования, правда про более развитый в этом аспекте язык - D...
Спасибо за советы, я воспользовался решением от HackingTeam, которое превращает строки в такую штуку: unsigned char obf_string[] = "\xd6\x07\xd7\xab\xb1\xab\xae\xbd\xc5"; ./obfuscate "system"А далее используется деобфускатор к последовательности. А можно какой нибудь пример кода? Я не вполне понимаю: есть строка имени АПИ функции "харамамбуру_апи". Если получить с нее хеш - он будет определенный. Можно сделать рандом seed хеша, и всякий раз, например, заполнять таблицу хешей - но что бы перехешировать каждый раз с рандомным seed - все равно нужна строка "харамамбуру_апи", которую нужно где то хранить, что бы взять хеш. Это почему? Из за того, что значения хешей в вируных базах?
Под поиском api имеется в виду получение через peb списка модулей и парсинг таблицы экспорта на предмет соответствия хеша имени экспортируемой функции заранее посчитанному хешу. И проблема в том, что эти посчитанные значения суть константы и при наличии их в памяти(а после работы первоначального декриптора код для получения api остается в памяти неизменным) можно даже при наличии более чем одной такой константы ставить вердикт suspicious (heur) и уже с пристрастием контролировать поведение или ругаться... Но, если константы определены как 0xXXXXXXXX ^ RUNTIME_RAND и в процедуре сравнения хешей результат вычисления перед сравнением ксорится с RUNTIME_RAND - ни одного совпадения констант уже нет, а RUNTIME_RAND на то и рандомное, чтобы не повторяться - его как критерий уже не проверишь.
ECk, я только что убедился, что я тупой. Это ясно-понятно. Имеем хеш MessageBoxA 0x12345678. Что бы превратить 0x12345678 в строку для сравнения(или наоборот), используем функцию hash_fu(0x12345678), результат работы которой будет строка MessageBoxA для сравнения экспорта. Но если мы изменим хеш рандомом 0xXXXXXXXX ^ RUNTIME_RAND - то в результате работы hash_fu(0x12345678 ^ RUNTIME_RAND) будет что угодно, но не MessageBoxA, ведь хеш изменен. Я ничего не понимаю UPD А, все, понял. Ксорится два раза.
Там есть современнее статья. ECk, и все равно я не понимаю. Если использовать препроцессор, например _TIMESTAMP_, то все равно хеши будут меняться не от запуска к запуску приложения, а от компиляции к компиляции. Верно? А если верно, то можно использовать хеш алгоритм с вектором начальной инициализации и изменив его, перехешировать все хеши одним махом и ctrl C crtl V вставить в исходник. Или я опять не то понял?