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

Тема в разделе "WASM.BEGINNERS", создана пользователем piligmindo, 1 янв 2019.

  1. piligmindo

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Доброго времени суток, форумцы!

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

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Попробую апнуть тему
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    2.062
    попробуй нормально вопросы задавать...
     
  4. piligmindo

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Попробую.

    Есть проект 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

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    2.062
  6. piligmindo

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Visual Studio 2017, поддержка современных языков есть.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    2.062
    визуалстудия 2017 вижуалстудии 2017 рознь:
    [​IMG]

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

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Ничего себе! Я это не знал. У меня версия 15.9.4. Но все равно не работает.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    2.062
    не, я не знаю... кроме того, что не поддерживается какие-то фичи стандарта, типа костекспр выполняется не на этапе компиляции больше ничего в голову не приходит... а копаться и дебажить эту кучу шаблонного гуано в плюсах - не простая задача...
     
  10. piligmindo

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Дело в том, что уже второй или третий подобный проект на гитхабе смотрю - и одно и то же у всех.
     
  11. Rel

    Rel Well-Known Member

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

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Спасибо за код, буду смотреть!
     
  13. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.516
    Адрес:
    г. Санкт-Петербург
    Мне кажется, проще решить задачу так:
    1. Прогнать исходники через препроцессор.
    2. Прогнать препроцессированный код через обфускатор строк.
    3. Скомпилировать обфусцированный код.
    Всё это метапрограммирование, мягко говоря,
    полное говно и костыли
    .
     
    piligmindo нравится это.
  14. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    417
    Адрес:
    Russia
    На мой взгляд, самый достойный внимания метод - создание рандомных значений препроцессором и компиляция с созданными рандомными значениями (особенно хорошо работает на скрытии кода по поиску api по значению хешей - которые все все равно продолжают оставлять статическими). И последующее применение в двух или трех фазном шеллкоде с упаковкой второй части aplib и динамической распаковки в процессе работы первой фазы кода, плюс использование PIC сишного кода на порядок упрощают задачу как отладки, так и разработки шеллкодов любой сложности. Имхо, 99,9 процентов детектов в памяти обязаны своим происхождением именно поиску адресов по хешам...
     
    piligmindo и sl0n нравится это.
  15. Rel

    Rel Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    2.062
    интересная книжка по сабжу метапрограммирования, правда про более развитый в этом аспекте язык - D...
     

    Вложения:

    piligmindo нравится это.
  16. piligmindo

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Спасибо за советы, я воспользовался решением от HackingTeam, которое превращает строки в такую штуку:

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

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

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

    ECk Member

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

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    ECk, я только что убедился, что я тупой.

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

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

    UPD

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

    M0rg0t Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    503
    piligmindo, гуглите "долой импорт", статья такая из "хакера", там и сорцы на Си и сам концепт.
     
  20. piligmindo

    piligmindo New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    26
    Там есть современнее статья.

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