Сейчас на форуме: asfa, _MBK_, Adler (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Что делать дальше, когда деобсфуцировал код хендлеров в ВМ?
Посл.ответ Сообщение

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

Создано: 30 октября 2012 01:30
· Личное сообщение · #1

Вобщем разобрал ВМ. Удалил "мусор" из хендлеров. Запускаешь трассировку, да, размер кода заметно уменьшился. Но мешают остатки от Главного обработчика - main handler (который как раз и вычисляет кому передать управление в следующем цикле ВМ ). Да и все равно даже если не обращать внимание на него, код получается немного запутанный. Трудно понять где условные переходы, хотя можно.
Вобщем подскажите, как полностью очистить код от ВМ, чтоб получился вменяемый ассемблерный код?
Я предполагаю, надо создавать секцию. Помещать туда "чистые" хендлеры в порядке следования на ленте закодированного кода, составлять таблицу хендлеров в зависимости от нового размещения, и уже потом разбираться с переходами?
Хотя мне кажется, что я в корне не прав.



Ранг: 31.0 (посетитель), 70thx
Активность: 0.140
Статус: Участник

Создано: 30 октября 2012 01:43
· Личное сообщение · #2

вм какого прота?




Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 30 октября 2012 01:50
· Личное сообщение · #3

вм-прота походу, не?

-----
-=истина где-то рядом=-




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

Создано: 30 октября 2012 02:52 · Поправил: Kuzya69
· Личное сообщение · #4

Вот такого типа, как я понял, это кодевирт.
Code:
  1. //////// Main Handler
  2. 02FFD34E LODS BYTE PTR [ESI]
  3. 02FFD34F ADD AL,BL
  4. 02FFF9C6 XOR AL,0xd2
  5. 02FFFC9D SUB AL,0xf1
  6. 0300057A ADD BL,AL
  7. 02FFD70B MOVZX EAX,AL
  8. 02FFD70E JMP DWORD PTR [EDI+EAX*4]
  9. ///////////////////////////////////////////////////////////
  10. //////// Virtual Handler 0000
  11. 02FFF6CB POP EAX
  12. 03001335 ADD DWORD PTR [ESP],EAX
  13. 03001338 PUSHFD 
  14. ///////////////////////////////////////////////////////////
  15. //////// Virtual Handler 0001
  16. 030001C9 POP CX
  17. 03000C1A SAR BYTE PTR [ESP],CL
  18. 03000C1D PUSHFD 
  19. /////////////////////////////////////////////////////////// 
  20.  

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



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

Создано: 30 октября 2012 10:02 · Поправил: VodoleY
· Личное сообщение · #5

Кодевирт чтоли?
З.Ы, да очень похож на кодевирт, сначало код посмотрел, потом пост дочитал 2 инструмента есть, OreansUnVirtualizer и Sweper в чем проблема? если примитивы поднял, ищи входы в ВМ и пробуй востанавливать код из лент.

Скопировать хедлы конечно можно, это тот вариант, когда ты не можешь востанавливать сам код, без главного цикла, но тот же Vam-ит в Sweper воссаздает код, OreansUnVirtualizer тоже
@Label_009BFF88
009BFFCD CLI
009BFFE2 PUSH EBP
009C0012 SHL EBP,0x2
009C0079 TEST EDI,EBX
009C00D0 XOR EBP,EAX
009C017F TEST EDX,EDI
009C0210 POP EBP
009C022F PUSH EBX
009C0257 XOR EBX,0xa4
009C02D5 OR BL,BL
примрно так.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





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

Создано: 30 октября 2012 10:20
· Личное сообщение · #6

Themida RISC virtual machine скорее всего.

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




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

Создано: 30 октября 2012 10:44 · Поправил: Kuzya69
· Личное сообщение · #7

Там по крайней мере 4 ВМ. С такими начальными телами. Так что получается это CISC. Я пока только одну ВМ раскурочил "на кубики".
Code:
  1.                       nop
  2.                 nop
  3.                 pusha
  4.                 pushf
  5.                 cld
  6.                 call    $+5
  7.                 pop     edi
  8. loc_570DC6:
  9.                 sub     edi, 11111111h
  10.                 mov     eax, edi
  11. loc_570DCE:
  12.                 add     edi, 11111111h
  13.                 cmp     eax, [edi+2Ch]
  14.                 jnz     short loc_570DDB
  15.                 jmp     short loc_570DEE
  16. loc_570DDB:
  17.                 mov     [edi+2Ch], eax
  18. loc_570DDE:
  19.                 mov     ecx, 11111111h
  20.                 jmp     short loc_570DEA
  21. loc_570DE5:
  22.                 add     [edi+ecx*4+3Ch], eax
  23.                 dec     ecx
  24. loc_570DEA:
  25.                 or      ecx, ecx
  26.                 jnz     short loc_570DE5
  27. loc_570DEE:
  28.                 mov     esi, [esp+24h]
  29.                 mov     ebx, esi
  30.                 add     esi, eax
  31.                 mov     eax, [edi+30h]
  32.                 mov     ecx, 1
  33. loc_570DFE:
  34.                 lock cmpxchg [edi+30h], ecx
  35.                 jz      short loc_570DFE
  36.                 nop
  37.                 nop
  38.                 lodsb
  39.                 movzx   eax, al
  40.                 jmp     dword ptr [edi+eax*4] 
  41.  
  42.  

Нашел здесь-же на форуме
( http://www.exelab.ru/f/action=vthread&forum=13&topic=14863&page=0#14 ), какую-то утиль "depack.asm ". Не могу понять как ей пользоваться, и вообще что она делает?
Насчет Sweper от Vam-ит, я честно признаюсь, я не понимаю, как им пользоваться, хоть-бы какой пример посмотреть.
И что значит этот код, куда его размещать, и как запускать? Я так понимаю, что это "обратный" main handler, верно?



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

Создано: 30 октября 2012 11:22
· Личное сообщение · #8

Kuzya69 очень тяжко куски выдертые из контекста анализировать. по всей видимости ты нашел вход в ВМ, т.е это инициализация, вроде. Попробуй разобраться с OreansUnVirtualizer. суть всех этих плагов след. 1. Сканирование области на вход в ВМ.(там где идет инициализация главного цикла, т.е код ДО НЕГО) 2. запуск распознования главного цикла и кодов примитивов, с их очисткой от мусора и обзывания их, т.е Кто что делает. 3. Востановление оригинального кода.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




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

Создано: 30 октября 2012 11:47 · Поправил: Kuzya69
· Личное сообщение · #9

VodoleY по всей видимости ты нашел вход в ВМ
Да я нашел все входы, во все 4 ВМ, нашел все переходы в ВМ вида
Code:
  1. PUSH const
  2. JMP to VM

По этим "const", определил все цепочки кодированных кодов (ленты пикода). По сигнатурам ВМ вида ...
Code:
  1. SUB edi, const1
  2. MOV eax,edi
  3. ADD edi, const2

определил массивы таблиц хендлеров и регистров.
В одной ВМ деобсфуцировал хендлеры. Но очень трудно выстроить "чистые" хендлеры в правильном порядке, так как заранее трудно просчитать следующий хендлер, особенно для неработающей ветки после условного перехода.
Да и не знаю оптимального решения для внедрения этих "чистых" хендлеров в тело программы.
Хочется понять как это делается руками, чтоб понять смысл, к тому-же автоматы тоже ошибаются иногда, и не зная принципа работы автомата, трудно будет потом разобраться в ошибке.



Ранг: 31.0 (посетитель), 70thx
Активность: 0.140
Статус: Участник

Создано: 30 октября 2012 12:07 · Поправил: schokk_m4ks1k
· Личное сообщение · #10

Kuzya69 пишет:
Насчет Sweper от Vam-ит, я честно признаюсь, я не понимаю, как им пользоваться, хоть-бы какой пример посмотреть.

к свиперу прилагается хелп на русском, там всё довольно ясно написано!




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

Создано: 30 октября 2012 14:08
· Личное сообщение · #11

schokk_m4ks1k пишет:
к свиперу прилагается хелп на русском, там всё довольно ясно написано!

Для VM_Prot

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




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

Создано: 30 октября 2012 15:46
· Личное сообщение · #12

Ну а как раньше этот вопрос решали, без свипера?




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 30 октября 2012 15:55
· Личное сообщение · #13

Kuzya69 пишет:
Ну а как раньше этот вопрос решали, без свипера?

Дампили вм и прикручивали обратно.

-----
Лучше быть одиноким, но свободным © $me




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

Создано: 30 октября 2012 15:59 · Поправил: Veliant
· Личное сообщение · #14

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

Вариант 2 - тупой, но простой. Посмотреть сколько максимально занимает места код после декодирования. Для всех остальных опкодов выравнивать на это же число NOP'ами. Тогда будет проще считать смещение куда прыгать.



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

Создано: 31 октября 2012 02:38 · Поправил: Kuzya69
· Личное сообщение · #15

BoRoV Дампили вм и прикручивали обратно.
Мне так не интересно, я пытаюсь код уменьшить как только можно. Уж слишком много там интересных моментов, которые хочется отследить. Тоесть надо понять всю программу. И повключать все, что скрыто от обывателя.
Veliant ...нужно строить дерево...
Да вот тут уж совсем задачка не для "рук и бумажки". Хотя время меня не ограничивает, для себя делаю.
А вот второй вариант уже прикольнее, когда карту переходов построю, потом можно будет и от НОП-ов избавиться, там проще будет. Главное чтоб какая-нибудь защита не спалила. Но пока вроде спокойно чистил хендлеры в запущенной программе (а заодно и проверял).




Ранг: 154.2 (ветеран), 66thx
Активность: 0.080
Статус: Участник
REVENGE Crew

Создано: 31 октября 2012 03:29
· Личное сообщение · #16

Kuzya69,

если задача разовая (т.е. нет цели написать свой деобфускатор и девиртуалайзер), то можешь восстановить код с помощью OreansUnVirtualizer.

Он только некоторые инструкции немного криво восстанавливает, а в основном все как надо.



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

Создано: 31 октября 2012 11:31 · Поправил: VodoleY
· Личное сообщение · #17

Kuzya69 ну я уважаю то, что ты пытаешся сделать. даже ВАМит писал о том, что свипер, для тех, кто может руками открутить ВМ. т.е. надо понимать как оно работает (свипер тоже не идеален, но хорошо помогает). Итак, смотри. Если ты хочешь попытаться руками востанавливать код тебе надо будет след. вещи. 1. Найти входы в ВМ.. 2 Определить главный цикл, и алго декодирования ленты. 3. найти, почистить, и пообзывать примитивы. 4. ну тут самое интересное, сделать сопоставление стековых переменных с внутренними регистрами ВМ и реальными регистрами. 5. востанавливать исходный код, заменяя команды из ленты (код примитива+параметры ) на исходный асм код.
З.Ы, я год назад юзал OreansUnVirtualizer у него был глюк, некоторые комманды криво востанавливал, так вот руками допиливать и приходилось.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




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

Создано: 31 октября 2012 13:42 · Поправил: Kuzya69
· Личное сообщение · #18

VodoleY
Получается 3 задачи я уже сделал. (для одной ВМ).
Да и машина у меня простая получилась. Не заметил я в ней стековых переменных. Там над таблицей хэндлеров, выделено место (нет хэндлеров с именами 0000-0013h). Туда и размещаются значения виртуальных регистров. Меня такой расклад, даже больше устраивает, при трассировке проще будет, чем с регистрами. Хотя с этим я может и поторопился. Составлю весь код, тогда и точно скажу.
А вот про 5 пунктик вашей цитаты:
востанавливать исходный код, заменяя команды из ленты (код примитива+параметры ) на исходный асм код.
, можно поподробнее, как это делать правильно?
И еще, что значит в этой фразе:
некоторые комманды криво востанавливал
слово "команды"? Хендлеры неправильно деобсфуцировал? Или исходный код неверно составлял?
Этот-же вопрос и к kioresk-у относится. Вы тоже об этом-же написали.




Ранг: 127.3 (ветеран), 44thx
Активность: 0.090
Статус: Участник

Создано: 31 октября 2012 14:44
· Личное сообщение · #19

По идее когда у тебя есть хендлеры, ты декомпилируеш пикод в некий промежуточный код, который потом компилируешь в нормальный.
http://gdtr.wordpress.com/2012/10/03/decv-a-decompiler-for-code-virtualizer-by-oreans/

-----
zzz




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

Создано: 31 октября 2012 14:54 · Поправил: Veliant
· Личное сообщение · #20

zeppe1in пишет:
который потом компилируешь в нормальный.

Есть похожая задача, но ВМ от другого протектора. Поможет ли для чистки мусора и дальнейшей компиляции LLVM? Чтобы очередной велосипед не городить



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

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

zeppe1in я противник промежуточного кода, это скорее вопрос деобфускации а не разбора ленты ВМ.

, можно поподробнее, как это делать правильно?
Например. у тебя есть примитив mov xx,xx в ленте у тебя обязаны быть параметры, откуда и куда. если это регистр-константа(как пример), то можно востановить 1ой командой. логично? это так чтоб ты понял. + все реальные регистры в любой ВМ заменены на стековые, осознай это + регистров ВМ может быть больше чем реальных

Kuzya69 пишет:
слово "команды"? Хендлеры неправильно деобсфуцировал?

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

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




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

Создано: 31 октября 2012 15:56
· Личное сообщение · #22

+ все реальные регистры в любой ВМ заменены на стековые, осознай это
Имеется ввиду, что перед операцией над содержимым виртуальных регистров, это содержимое сначала помещается в стек? Это и так ясно, но место-то, так скажем длительного хранения, все-равно остается не в стеке, на моей ВМ.
Меня интересует момент, как технически подменять пи-код, нормальным кодом?
Тоесть я обработал одну ленту (от входа в ВМ до выхода). Построил эквивалентный ей асм-код. Создал секцию, положил в нее получившееся творение с командой "retn" в конце. Дальше берем "прокладку" (прошу прощение за свою терминологию) вида.
Code:
  1. push const1
  2. jmp const2

const1 - начало декодируемого пи-кода
const2 - адрес входа в ВМ.
Меняем на свое:
Code:
  1. call const3

Где const3 адрес начала нашего творения. Правильно я думаю, или есть более правильные пути?




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

Создано: 31 октября 2012 16:02
· Личное сообщение · #23

VodoleY
я противник промежуточного кода, это скорее вопрос деобфускации а не разбора ленты ВМ.
Ну не скажи, это в простых вм может и так, а в нормальных - кто сказал что один примитив эквивалентен одной инструкции асм кода, даже в CodeVirtualizer не так, не говоря уже про другие вм, где одна реальная инструкция асм кода может состоять из нескольких десятков примитивов, здесь без промкода не обойтись...

-----
Everything is relative...





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 31 октября 2012 16:05
· Личное сообщение · #24

Kuzya69 пишет:
Правильно я думаю, или есть более правильные пути?


Разберись с макросами из ThemidaSDK
CODEREPLACE_START - CODEREPLACE_END;
ENCODE_START - ENCODE_END
VM_START - VM_END
VM_START_WITHLEVEL(x) - VM_END

как их пользуют в коде, которые из них ведут в ВМ, и что делается с заменяемым кодом между этими макросами

-----
127.0.0.1, sweet 127.0.0.1




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

Создано: 31 октября 2012 16:26 · Поправил: VodoleY
· Личное сообщение · #25

Vamit человек пытается разобраться в сути ВМ. автоматизация и оптимизация немножко другая проблиматика. ВЫ во многом правы, но я не считаю промкод оптималным путем решения проблемы. Но это уже в офтоп. ВЫ по крайней мере сделали рабочий продукт и поклон ВАМ.
Kuzya69, по большому счету 2 МБ текстового трейса помещаются в 40 комманд. так доходчиво? и ОКОВ прав. возьми напиши прогу. и накрой пару инструкций КодеВиртом, и посмотри что получится.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 127.3 (ветеран), 44thx
Активность: 0.090
Статус: Участник

Создано: 31 октября 2012 18:31
· Личное сообщение · #26

VodoleY пишет:
человек пытается разобраться в сути ВМ

Суть вм в её девиртуализации
VodoleY пишет:
не считаю промкод оптималным путем решения проблемы

а я не вижу других путей. Слёту восстанавливать код получится только на простой вм.

-----
zzz




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

Создано: 31 октября 2012 18:50
· Личное сообщение · #27

zeppe1in это да. на 100проц. если делать полный самостоятельный инструмент. НО суть работы ВМ перед этим то надо понимать? я писал утлзу, на основ разобранных примитивов свипера, когда он еще спотыкался. декодируя ленту и получая логику.. криво но помогало.. вобщем спорно все это. НО декдодировать примитивы в автомате задачка еше та

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....



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


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