Шифрование строк времени компиляции

Discussion in 'WASM.BEGINNERS' started by piligmindo, Jan 1, 2019.

  1. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Доброго времени суток, форумцы!

    Озадачился сабжем, нашел такую штуку, как ADVobfuscator и что то не могу понять, как это должно работать. Я думал, что сабж должен как то скрывать строки в программе, но этого не происходит. В IDA строки видны на вкладке Strings. Почему так?
     
  2. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Попробую апнуть тему
     
  3. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    попробуй нормально вопросы задавать...
     
  4. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Попробую.

    Есть проект 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 минуту...
     
  5. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
  6. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Visual Studio 2017, поддержка современных языков есть.
     
  7. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    визуалстудия 2017 вижуалстудии 2017 рознь:
    [​IMG]

    тут используется только расширенный констекспр и переодичные шаблоны, насколько я понимаю:
    https://github.com/andrivet/ADVobfuscator/blob/master/Lib/MetaString.h
    --- Сообщение объединено, Jan 6, 2019 ---
    какое же ублюдочное метапрограммирование в плюсах, я уж и забыл совсем...
     
  8. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Ничего себе! Я это не знал. У меня версия 15.9.4. Но все равно не работает.
     
  9. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    не, я не знаю... кроме того, что не поддерживается какие-то фичи стандарта, типа костекспр выполняется не на этапе компиляции больше ничего в голову не приходит... а копаться и дебажить эту кучу шаблонного гуано в плюсах - не простая задача...
     
  10. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Дело в том, что уже второй или третий подобный проект на гитхабе смотрю - и одно и то же у всех.
     
  11. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    у плюсов ужасное метапрограммирование, шаблоны - это по сути унылая версия Хаскелла, когда пытаешься их использовать на этапе компиляции... констэкспр по сути должен быть реализацией CTFE, но по факту он далеко не всегда работает как предполагали авторы подобных обфускаторов... и при всем при этом, даже если это работает, то это все равно будет существенно тормозить сборку проекта... я рекомендую забить и сделать какой-нить простой препроцессор для сорсов на базе AST, или регулярками, если надо только строки шифровать... все, что сделано на базе уродского метапрограммирования на плюсах, всегда будет костылем, а не нормальным решением...
    --- Сообщение объединено, Jan 6, 2019 ---
    я знаю, о чем тут говорю, я был одним из первопроходцев этого гуано, когда студия еще ничего из этого не саппортила: http://www.rohitab.com/discuss/topic/39611-malware-related-compile-time-hacks-with-c11/ (сюда тож постил версию на русском языке, но чет не могу найти в поиске)...
     
    piligmindo likes this.
  12. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Спасибо за код, буду смотреть!
     
  13. SadKo

    SadKo Владимир Садовников

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Мне кажется, проще решить задачу так:
    1. Прогнать исходники через препроцессор.
    2. Прогнать препроцессированный код через обфускатор строк.
    3. Скомпилировать обфусцированный код.
    Всё это метапрограммирование, мягко говоря,
    полное говно и костыли
    .
     
    piligmindo likes this.
  14. ECk

    ECk Member

    Blog Posts:
    0
    Joined:
    Apr 9, 2004
    Messages:
    454
    Location:
    Russia
    На мой взгляд, самый достойный внимания метод - создание рандомных значений препроцессором и компиляция с созданными рандомными значениями (особенно хорошо работает на скрытии кода по поиску api по значению хешей - которые все все равно продолжают оставлять статическими). И последующее применение в двух или трех фазном шеллкоде с упаковкой второй части aplib и динамической распаковки в процессе работы первой фазы кода, плюс использование PIC сишного кода на порядок упрощают задачу как отладки, так и разработки шеллкодов любой сложности. Имхо, 99,9 процентов детектов в памяти обязаны своим происхождением именно поиску адресов по хешам...
     
    piligmindo and sl0n like this.
  15. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    интересная книжка по сабжу метапрограммирования, правда про более развитый в этом аспекте язык - D...
     

    Attached Files:

    piligmindo likes this.
  16. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Спасибо за советы, я воспользовался решением от HackingTeam, которое превращает строки в такую штуку:

    unsigned char obf_string[] = "\xd6\x07\xd7\xab\xb1\xab\xae\xbd\xc5";
    ./obfuscate "system"
    А далее используется деобфускатор к последовательности.

    А можно какой нибудь пример кода? Я не вполне понимаю: есть строка имени АПИ функции "харамамбуру_апи". Если получить с нее хеш - он будет определенный. Можно сделать рандом seed хеша, и всякий раз, например, заполнять таблицу хешей - но что бы перехешировать каждый раз с рандомным seed - все равно нужна строка
    "харамамбуру_апи", которую нужно где то хранить, что бы взять хеш.

    Это почему? Из за того, что значения хешей в вируных базах?
     
  17. ECk

    ECk Member

    Blog Posts:
    0
    Joined:
    Apr 9, 2004
    Messages:
    454
    Location:
    Russia
    Под поиском api имеется в виду получение через peb списка модулей и парсинг таблицы экспорта на предмет соответствия хеша имени экспортируемой функции заранее посчитанному хешу. И проблема в том, что эти посчитанные значения суть константы и при наличии их в памяти(а после работы первоначального декриптора код для получения api остается в памяти неизменным) можно даже при наличии более чем одной такой константы ставить вердикт suspicious (heur) и уже с пристрастием контролировать поведение или ругаться... Но, если константы определены как 0xXXXXXXXX ^ RUNTIME_RAND и в процедуре сравнения хешей результат вычисления перед сравнением ксорится с RUNTIME_RAND - ни одного совпадения констант уже нет, а RUNTIME_RAND на то и рандомное, чтобы не повторяться - его как критерий уже не проверишь.
     
  18. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    ECk, я только что убедился, что я тупой.

    Это ясно-понятно.

    Имеем хеш MessageBoxA 0x12345678. Что бы превратить 0x12345678 в строку для сравнения(или наоборот), используем функцию hash_fu(0x12345678), результат работы которой будет строка MessageBoxA для сравнения экспорта. Но если мы изменим хеш рандомом
    0xXXXXXXXX ^ RUNTIME_RAND - то в результате работы hash_fu(0x12345678 ^ RUNTIME_RAND) будет что угодно, но не MessageBoxA, ведь хеш изменен. Я ничего не понимаю:dntknw:

    UPD

    А, все, понял. Ксорится два раза.
     
    Last edited: Jan 9, 2019
  19. M0rg0t

    M0rg0t Well-Known Member

    Blog Posts:
    0
    Joined:
    Oct 18, 2010
    Messages:
    1,585
    piligmindo, гуглите "долой импорт", статья такая из "хакера", там и сорцы на Си и сам концепт.
     
  20. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Там есть современнее статья.

    ECk, и все равно я не понимаю. Если использовать препроцессор, например _TIMESTAMP_, то все равно хеши будут меняться не от запуска к запуску приложения, а от компиляции к компиляции. Верно? А если верно, то можно использовать хеш алгоритм с вектором начальной инициализации и изменив его, перехешировать все хеши одним махом и ctrl C crtl V вставить в исходник. Или я опять не то понял?