Сейчас на форуме: tyns777, cppasm, dutyfree (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Подскажите инструменты для деобфускации.
Посл.ответ Сообщение

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 20 октября 2017 17:48 · Поправил: Kuzya69
· Личное сообщение · #1

Распаковал одну жертву. Хотел подглядеть алгоритм регистрации. Но весь важный код запротекчен. Не могу назвать сам протектор, он ничем не определяется. Смысл там в том, что из основного кода идет call в зону протектора. Причем этот call всегда передает управление в одно и то-же место протектора. Код протектора вычисляет адрес возврата и по таблице определяет место куда далее передать управление. Тут как-бы все просто. Но сам запротекченный код уж очень сильно обфусцирован. Я попробовал вручную разобрать один участок. Взял самый короткий, но с трудом пополам разобрал. Если браться за остальные участки, то боюсь это займет много времени. Привлек к работе коде-доктор, но тот уж очень сильно косячит, да и в местах где есть мусорные условные переходы(которых немало в коде) просто бессилен.
Хотелось-бы какой-нибудь посерьезнее инструмент.
Подскажите, пожалуйста, какие еще есть инструменты, для деобфускации? (неплохо было-бы ссылку или саму программу сюда выложить).




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 20 октября 2017 19:42 · Поправил: difexacaw
· Личное сообщение · #2

Kuzya69

> Причем этот call всегда передает управление в одно и то-же место протектора. Код протектора вычисляет адрес возврата и по таблице определяет место куда далее передать управление.

Так у вас не обфускация, а виртуальная машина. В одно и тоже место" - это цикл вм(вход в неё). Далее происходит трансляция и эмуляция, естественно что там таблицы - case-таблицы трансляции.

В общем же если вы видите подобный цикл, то лучше закрыть отладчик.

-----
vx




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 20 октября 2017 19:53
· Личное сообщение · #3

Ну на ВМ Ореанс или ВМПротект не похоже. Я пока не встретил ни в одном из двух запротекченных участках, обрабатываемых мною, внутреннего цикла (так сказать возврат в MainHandler) и нет ленты пи-кода. Хотя частичное (не все) сохранение и в конце восстановление регистров есть. Но такая работа с регистрами возможна и в любом коде.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 20 октября 2017 20:03
· Личное сообщение · #4

Kuzya69
а имена секций, их содержание и размеры?
Покажите хотя бы кусок кода с характерной обфускацией.
Code:
  1. Смысл там в том, что из основного кода идет call в зону протектора

Аргументы какие нибудь передаются вместе с вызовом?



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 20 октября 2017 20:13 · Поправил: Kuzya69
· Личное сообщение · #5

Вот примерный код входа в обфускацию. Примерный, потому-что я пропустил проверку на распакованность кода протектора, ну и соответственно саму распаковку, а также показал работу с абсолютными адресами, когда на самом деле используются адреса относительно ImageBase:
Code:
  1. // Зона сновного кода
  2. call @Protect
  3. // Зона протектора
  4. @Protect:
  5. pushfd
  6. push esi
  7. call @Addr
  8. @Addr:
  9. pop esi
  10. sub esi, 15B
  11. mov dw[esi+4], esi
  12. push edi
  13. push eax
  14. lea edi, dword[esi+14]
  15. mov eax, dword[esp+10]
  16. sub eax,5
  17. @Cycle:
  18. add edi,8
  19. cmp dword[edi], eax
  20. jnz @Cycle
  21. mov eax, dword[edi+4]
  22. mov dword[esp+10], eax
  23. pop eax
  24. pop edi
  25. pop esi
  26. popfd
  27. retn

Ну а далее идет просто обфусцированный код. В нем нет признаков ВМ, которые я описАл выше.

Добавлено спустя 3 минуты
ELF_7719116
Аргументы какие нибудь передаются вместе с вызовом?
Нет. Только вызов call. Этот вызов и является аргументом, вернее его адрес возврата. А сразу за вызовом call, мусорные байты, ну типа затерли основной код.

А вот примерная таблица (я не стал прибавлять ImageBase, оставил как в оригинале):
Code:
  1. esi+1C: 0x00081232, 0x21123233
  2. esi+24: 0x00032514, 0x21124561
  3. ............................................
  4. esi+17C: 0x00125621, 0x21256313

Если к первым dword-ам таблицы прибавить ImageBase(0x400000), то получим адреса в основном коде, где как раз и стоят эти CALL-ы, ведущие в зону протектора.
Ну а прибавив ImageBase ко вторым dword-ам таблицы, получим адреса начала запротекченных (обфусцированных) кодов.
То-есть сравниваем адрес возрата (минус 5) со значением первого члена в таблице, ищем равный. Когда найдем, то переходим по адресу второго члена.

Добавлено спустя 48 минут
ELF_7719116
а имена секций, их содержание и размеры?
Секций три.
0). - 0040000, 1000, "пусто", PEheader
1). - 0040100, 215????? ".text", SFX,code
2). - 219?????, 00008000, ".rsrc", import,resource
Прошу прощения за вопросики(каждый вопросик это цифра), в том что я написАл. Пишу по памяти, сейчас проги нет под рукой (я и код-то по памяти написал, так что извините если где ошибся).
Покажите хотя бы кусок кода с характерной обфускацией.
Это позже, сейчас не могу по памяти.
Помню только что там в начале несколько rdtc-команд между push pop и безусловные переходы, путающие логику, но по сути мусорные.




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 21 октября 2017 01:21
· Личное сообщение · #6

Kuzya69 пишет:
А сразу за вызовом call, мусорные байты

Ну так поставь железку на чтение исполнения в середине мусора может что произойдёт

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 21 октября 2017 01:37 · Поправил: Kuzya69
· Личное сообщение · #7

Ничего не произойдет и не происходит. Это обычный мусор. По call-у уходит в зону протекта. А потом возвращается за этим мусором . Я трассировал, и ставил MemoryBP на доступ в область секции кода. Правда иногда выходит в обычный код, как-бы выполняя внутреннюю команду call. Короче я разобрал этот код досконально. Осталось найти деобфускатор, который может справиться с запутанным (не ВМ) кодом.
Наверное нужен такой, который в процессе выполнения деобфусцирует. Т.к. в коде есть команды типа "jmp R32", значение регистра которой вычисляется прямо внутри этого-же кода. Или придется кусками до этих "jmp R32" деобфусцировать.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 21 октября 2017 02:01 · Поправил: dosprog
· Личное сообщение · #8

В hiew поиск с заменой не помогает?



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 21 октября 2017 02:06
· Личное сообщение · #9

Не понял, можно поразвернутее объяснить?



Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 21 октября 2017 02:57
· Личное сообщение · #10

Kuzya69 пишет:
неплохо было-бы ссылку или саму программу сюда выложить

Вот это вы правильно подметили

Kuzya69 пишет:
Не могу назвать сам протектор, он ничем не определяется

У вас не определяется, а у кого-то может и определится.

В случае кастома для сокращения монотонной ручной работы можно всегда написать скрипт конкретно под этот случай.



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 21 октября 2017 03:09 · Поправил: Kuzya69
· Личное сообщение · #11

VOLKOFF
написать скрипт
Какой скрипт? Скрипт с искусственным интеллектом? Я даже не представляю, как можно написать скрипт деобфускатора. Тут полноценным плагином пахнет. Скриптом еще может можно разбить поморфленный код на части, ну там сократить push-pop комбинации, ну еще несколько простеньких вариантов. Но все это в голове быстрее можно сделать. А вот учесть всякие там команды типа "cmp xchg" "push const + retn".. , помоему вообще не реально. Или какой-нибудь переход внутрь мусорных байт.




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 21 октября 2017 03:15
· Личное сообщение · #12

Kuzya69
Выложил бы саму программу так гадать до вечера можно

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 21 октября 2017 03:19 · Поправил: Kuzya69
· Личное сообщение · #13

Там вес приличный получится. В распакованном виде она весит 533мб (в запакованном 6 с копейками), но еще надо рядом оригинальный файл держать (итого 12 метров). Проверка FileSize тоже покриптована.
Скажи куда удобнее, выложу.
Только не понимаю, чего гадать-то? Мне как-бы не важно, какой протектор применен. Мне важно покриптованные функции восстановить. Поэтому и спрашиваю, может кто знает инструмент какой, чтобы от обфускации избавиться.




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 21 октября 2017 03:19
· Личное сообщение · #14

Kuzya69 пишет:
Распаковал одну жертву. Хотел подглядеть алгоритм регистрации. Но весь важный код запротекчен

и что был за протектор?

Добавлено спустя 1 минуту
Kuzya69
Программы нет в свободном доступе?

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 21 октября 2017 03:29 · Поправил: Kuzya69
· Личное сообщение · #15

ClockMan пишет:
и что был за протектор?

PE-Compact. Но до него еще какой-то протектор навесили.
Программы нет в свободном доступе?
Есть, "OP-COM Professional 150406d En"




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 21 октября 2017 04:40 · Поправил: difexacaw
· Личное сообщение · #16

Kuzya69

> в процессе выполнения деобфусцирует.

Логика работы мусора может быть сколь угодно запутанной, она формируется автоматикой(компилером) и так же должна сниматься, но никак не ручным анализом.

Всегда следует исходить из общих принципов и соображений. Есть инструкция для исполнения, соответственно должна быть её выборка и исполнение. Даже если инструкция разложена путём морфа(обфускации), то пайлод её остаётся, например выборка данных(DF). Она обнаруживается через останов на память.

Свернуть же мусор весьма сложно, для этого нужны сложные инструменты. Обычно в этом смысла нет, достаточно следить за потоком инструкций(IF). Так как вся работа апп сводится к вызову ядерных сервисов и передачи в них аргументов, то именно это должно быть основой для анализа, так как сервисный вызов нельзя никак модифицировать.

-----
vx





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 21 октября 2017 06:20
· Личное сообщение · #17

Kuzya69 пишет:
Ну на ВМ Ореанс

Oreans 90%
1.
Code:
  1. /*B2145A*/  MOV EAX,EAX
  2. /*B2145C*/  MOV ESI,ESI
  3. /*B2145E*/  MOV EAX,EAX
  4. /*B21460*/  MOV EBX,EBX
  5. /*B21462*/  MOV ESI,ESI
  6. /*B21464*/  MOV EDI,EDI
  7. /*B21466*/  MOV EBX,EBX
  8. /*B21468*/  MOV ESI,ESI
  9. /*B2146A*/  MOV ESI,ESI

вместо
push XXXXXXXX
jmp XXXXXXXX
2.
поиск в массиве
Code:
  1. /*2102DC18*/  CMP [ESI],EAX
  2. /*2102DC1A*/  JE SHORT 2102DC21
  3. /*2102DC1C*/  ADD ESI,8
  4. /*2102DC1F*/  JMP SHORT 2102DC18
  5. /*2102DC21*/  MOV EAX,[ESI+4]
  6. /*2102DC24*/  POP ESI

ну и конечно сама виртуальная машина обфусцирована

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.


| Сообщение посчитали полезным: difexacaw

Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 21 октября 2017 09:02
· Личное сообщение · #18

Для Oreans попробуйте Олли плагин OreansUnVirtualizer


 eXeL@B —› Вопросы новичков —› Подскажите инструменты для деобфускации.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати