Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Протекторы —› Неизвестная защита
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 29 августа 2017 11:24 · Поправил: Boostyq
· Личное сообщение · #1

Всем привет,
Сейчас разбираю анти-чит от одной игры
Сам экзешник тоже запакован, я просто запустила и сняла дамп, для статического анализа хватает
Но! Ни один анализатор не определяет что это за защита, пишет что вообще ничего нет
Не определяет и ладно, но изучая я вскоре поняла что все важные функции либо запакованы либо под виртуальной машиной
Я пыталась в ручную трассировать разбирая куда уходит код, но потом он начинает так ветвится что не могу уследить
Сам исполняемый код после дампа нормальный, но самое важное уходит под защиту
Защищенный код явно обфусцирован, особенно переходы, весь код раздроблен на мелкие части и переплетается
Code:
  1. .text:129BD4BE 008                 push    offset loc_111DD847 ; прыжок вот сюда
  2. .text:129BD4C8 010                 lea     esp, [esp+4]
  3. .text:129BD4CC 00C                 jmp     [esp+0Ch+var_10]

Code:
  1. .text:109DE915 000                 push    offset loc_10F80E69 
  2. .text:109DE91A                     push    offset sub_1198EFF5 ; прыжок вот сюда
  3. .text:109DE91F                     retn

Code:
  1. text:12DA06C8 038                 push    offset loc_1293BC3F ; вариант 1
  2. .text:12DA06CD 03C                 push    edx
  3. .text:12DD3179 040                 push    ebx
  4. .text:12DD317A 044                 mov     edx, [esp+8]
  5. .text:12DD317E 044                 mov     ebx, offset loc_12DEA44B ; вариант 2
  6. .text:12DD3183 044                 cmovge  edx, ebx ; прыжок через условное перемещение
  7. .text:10A19BA4 000                 mov     [esp+arg_4], edx
  8. .text:10A19BA8 000                 pop     ebx
  9. .text:10A19BA9 000                 pop     edx
  10. .text:10A19BAA 000                 retn

Вот листинг (начала!) защищенной функции
Как я поняла, в начале собираются параметры для функции которую нужно распаковать
Или может быть это контекст виртуалки
Code:
  1. .text:10A1B515                     inc     dword_121705F0
  2. .text:109DE915 000                 push    offset loc_10F80E69 ; 2 not useful
  3. .text:1198EFF5 000                 push    offset loc_11470CD3 ; 3 some return
  4. .text:10D24EA5 000                 push    offset sub_116A17E0 ; 4 some func or vm
  5. .text:109EF0F6 000                 push    ebx
  6. .text:109EF0F7 00C                 push    esi
  7. .text:109EF0F8 010                 push    eax
  8. .text:109EF0F9 014                 push    edx
  9. .text:109EF0FA 018                 push    edi
  10. .text:10BA95A5 01C                 push    offset sub_10BA1A37 ; 5 тут переход к какому то ксору
  11. .text:129BAA03 020                 mov     [esp+var_4], ebp
  12. .text:129BAA07 018                 lea     esp, [esp-4]
  13. .text:129BAA0B 01C                 mov     ebp, esp
  14. .text:1291DBBA 000                 sub     esp, 54h
  15. .text:1291DBBD 034                 mov     eax, ds:dword_10C2C329 ; 0x354FE113
  16. .text:1291DBC2 034                 mov     [ebp-28h], eax
  17. .text:12DAEF84 038                 mov     ecx, ds:off_116F7D2A ; func ptr
  18. .text:12DAEF8A 038                 mov     [ebp-14h], ecx
  19. .text:12946093 034                 mov     [ebp-18h], edx ; edx = 1C6DBAB
  20. .text:12946096 034                 mov     eax, [ebp-14h]
  21. .text:12946099 034                 add     eax, [ebp-18h]
  22. .text:1294609C 034                 mov     [ebp-14h], eax ; eax = 133658D5 ???
  23. .text:12D8137C 034                 mov     ecx, ds:dword_118E609A ; func idx 7
  24. .text:12D81382 034                 mov     edx, ds:off_1122DC0A ; func ptr
  25. .text:129B8E57 034                 mov     [ebp+ecx*4+8], edx
  26. .text:129B8E5B 034                 mov     dword ptr [ebp-24h], offset byte_1285B02F ; может зашифрованный код
  27. .text:129B8E62 034                 lea     eax, [ebp-40h]
  28. .text:12D83B91 034                 mov     [ebp-1Ch], eax
  29. .text:12D83B94 034                 mov     ecx, [ebp-1Ch]
  30. .text:129C5AE7 034                 mov     [ebp-8], ecx
  31. .text:129C5AEA 034                 mov     dword ptr [ebp-30h], 0
  32. .text:12DFCA0A 038                 mov     dword ptr [ebp-0Ch], 0
  33. .text:12DFCA11 038                 mov     dword ptr [ebp-20h], offset byte_128850A7 ; func list (qword list)
  34. .text:12DFCA18 038                 mov     edx, [ebp-20h]
  35. .text:12DFCA1B 038                 mov     eax, [edx]
  36. .text:1295E192 034                 mov     ecx, [edx+4]
  37. .text:1295E195 034                 mov     dword ptr [ebp-54h], eax ; qword
  38. .text:12DF91AE 038                 mov     dword ptr [ebp-50h], ecx
  39. .text:12DF91B1 038                 mov     dword ptr [ebp-4Ch], 0
  40. .text:12DF91B8 038                 mov     dword ptr [ebp-48h], 0
  41. .text:12DF91BF 038                 mov     dword ptr [ebp-38h], offset dword_12932F5C ; some data
  42. .text:11283413 004                 lea     eax, [ebp-4Ch]
  43. .text:11283416 004                 lea     esp, [esp-4]
  44. .text:12DCBB7A -20                 mov     [esp+0], eax
  45. .text:12DCBB7D -20                 lea     ecx, [ebp-38h]
  46. .text:12E30B17 -20                 mov     [esp-4], ecx
  47. .text:12E30B1B -20                 lea     esp, [esp-4]
  48. .text:10B2D224 000                 push    offset sub_1290BA8D ; 6 идет дальше
  49. .text:12869B13 008                 mov     ecx, esp
  50. .text:12869B15 008                 add     ecx, 0FFFFFFFCh
  51. .text:12869B1B 008                 mov     esp, ecx
  52. .text:12869B1D 008                 mov     [esp+8+var_8], ebp
  53. .text:128646E9 008                 push    esp
  54. .text:12D97A00 -20                 pop     ebp
  55. .text:12D97A01 -20                 sub     esp, 1Ch
  56. .text:12DF319E -04                 mov     dword ptr [ebp-4], 0
  57. .text:12DF31A5 -04                 mov     dword ptr [ebp-8], 0
  58. .text:12DF31AC -04                 mov     dword ptr [ebp-0Ch], 0

Code:
  1. Псевдо-код:
  2. *(_DWORD *)(a1 - 40) = 0x48B73BBE;
  3.   *(_DWORD *)(a1 - 20) = &_ImageBase;
  4.   *(_DWORD *)(a1 - 24) = &loc_12E2C172;
  5.   *(_DWORD *)(a1 - 24) -= dword_10A24728[0];
  6.   *(_DWORD *)(a1 - 20) += *(_DWORD *)(a1 - 24);
  7.   *(_DWORD *)(a1 + 40) = sub_129628A2;
  8.   *(_DWORD *)(a1 - 36) = &byte_1297A65B;
  9.   *(_DWORD *)(a1 - 28) = a1 - 64;
  10.   *(_DWORD *)(a1 - 8) = *(_DWORD *)(a1 - 28);
  11.   *(_DWORD *)(a1 - 48) = 0;
  12.   *(_DWORD *)(a1 - 12) = 0;
  13.   *(_DWORD *)(a1 - 32) = &byte_12E0BD83;
  14.   v2 = *(_DWORD *)(a1 - 32);
  15.   v1 = *(_DWORD *)(v2 + 4);
  16.   *(_DWORD *)(a1 - 84) = *(_DWORD *)v2;
  17.   *(_DWORD *)(a1 - 80) = v1;
  18.   *(_DWORD *)(a1 - 76) = 0;
  19.   *(_DWORD *)(a1 - 72) = 0;
  20.   *(_DWORD *)(a1 - 56) = &word_129B4FBE;


Дальше выполняется операция shl в цикле
Code:
  1. .text:12DEA44B 044                 mov     eax, [ebp+8]
  2. .text:12DEA44E 044                 mov     ecx, [eax]
  3. .text:12DEA450 044                 movzx   edx, byte ptr [ecx]
  4. .text:12DEA453 044                 and     edx, 7Fh
  5. .text:12E47515 044                 mov     ecx, [ebp-4]
  6. .text:12E47518 044                 shl     edx, cl
  7. .text:12E4751A 044                 mov     [ebp-10h], edx
  8. .text:12E4751D 044                 mov     eax, [ebp-8]
  9. .text:12904F06 05C                 add     eax, [ebp-10h]
  10. .text:12904F09 05C                 mov     [ebp-8], eax
  11. .text:12904F0C 05C                 mov     ecx, [ebp-4]
  12. .text:12872E3C 05C                 add     ecx, 7
  13. .text:12872E3F 05C                 mov     [ebp-4], ecx
  14. .text:12872E42 05C                 mov     edx, [ebp+8]
  15. .text:12872E45 05C                 mov     eax, [edx]
  16. .text:12DEBFFC 034                 movzx   ecx, byte ptr [eax]
  17. .text:12DEBFFF 034                 mov     [ebp-14h], ecx
  18. .text:12DACFA7 040                 mov     edx, [ebp+8]
  19. .text:12922D81 034                 mov     eax, [edx]
  20. .text:12922D83 034                 add     eax, 1
  21. .text:12922D86 034                 mov     ecx, [ebp+8]
  22. .text:12DA06BF 038                 mov     [ecx], eax
  23. .text:12DA06C1 038                 cmp     dword ptr [ebp-14h], 80h
  24. .text:12DA06C8 038                 push    offset loc_1293BC3F ; start deshifting 2
  25. .text:12DA06CD 03C                 push    edx
  26. .text:12DD3179 040                 push    ebx
  27. .text:12DD317A 044                 mov     edx, [esp+8]
  28. .text:12DD317E 044                 mov     ebx, offset loc_12DEA44B ; continue deshifting 1
  29. .text:12DD3183 044                 cmovge  edx, ebx
  30. .text:10A19BA4 000                 mov     [esp+arg_4], edx
  31. .text:10A19BA8 000                 pop     ebx
  32. .text:10A19BA9 000                 pop     edx
  33. .text:10A19BAA 000                 retn

Code:
  1. псевдо код:
  2.  *(_DWORD *)(a1 - 4) = 0;
  3.   do
  4.   {
  5.     *(_DWORD *)(a1 - 24) = (***(_BYTE ***)(a1 + 8) & 0x7F) << *(_DWORD *)(a1 - 4);
  6.     *(_DWORD *)(a1 - 12) += *(_DWORD *)(a1 - 24);
  7.     *(_DWORD *)(a1 - 4) += 7;
  8.     *(_DWORD *)(a1 - 28) = *(_BYTE *)(**(_DWORD **)(a1 + 8))++;
  9.   }
  10.   while ( *(_DWORD *)(a1 - 28) >= 128 );
  11.   *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4) = *(_DWORD *)(a1 - 12);


Далее все уходит к xor в цикле и так далее, очень запутанно
Code:
  1. Псевдо-код части:
  2. if ( *(_DWORD *)(a1 - 8) == *(_DWORD *)(a1 - 28) )
  3.   {
  4.     *(_DWORD *)(a1 - 8) = a1 - 68;
  5.     **(_DWORD **)(a1 - 8) = **(_DWORD **)(a1 - 36) ^ *(_DWORD *)(a1 - 40);
  6.     *(_DWORD *)(a1 - 36) += 4;
  7.     result = **(_DWORD **)(a1 - 8) + *(_DWORD *)(a1 - 40);
  8.     *(_DWORD *)(a1 - 40) = result;
  9.   }


Сама ида путается, она вообще не умеет такие прыжки обрабатывать
Клиент собран в 2014 году, хотя может защита прилинкована позже
Все функции вызываются примерно одинаково: собирается контекст и далее распаковка
Но нет единой vm_entry или чего-го похожего
Может быть кто-то узнает что нибудь знакомое?
Заранее спасибо

-----
В облачке многоточия




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

Создано: 29 августа 2017 11:42 · Поправил: VodoleY
· Личное сообщение · #2

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

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


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


Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 29 августа 2017 11:50 · Поправил: Boostyq
· Личное сообщение · #3

VodoleY пишет:

вангую что там вмпрот


Секции названы абсолютно нормально, у меня есть лицензия третий версии и там есть выбор имени секций - всех сразу, а тут все названы по разному
Вот ссылка на экзешник, если нужен любой другой хостинг или доп.файлы скажите, я просто не знаю на какой лучше
https://mega.nz/#!Uk9zzYyS!zsJcn3vJUBtuavH-47Sr9WUhjO_sd8oMgID60KfRw7E
Так же разработчики не русские и я не думаю, что вмпрот настолько популярен за рубежом
Кроме этого, если это виртуальная машина, то она здесь децентрализованная, ни как в темиде push + jmp на vm_entry, а тут один и тот же код ветвится и дублируется множество раз
Даже приаттачиться не могу, в x64dbg игра закидывает исключениями, cheat engine просто крашит процесс игры, хоть через Windows хоть через Veh

-----
В облачке многоточия





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 29 августа 2017 12:48
· Личное сообщение · #4

Boostyq
самопал какой-то. вроде не сложный

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





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

Создано: 29 августа 2017 12:52 · Поправил: difexacaw
· Личное сообщение · #5

Boostyq

> весь код раздроблен на мелкие части и переплетается

А вы уверены что это именно протектор, а не приложение инфицировано, уж сильно описание и те несколько примеров кода, что вы привели похожи на макро морф.

Виртуальная машина не может быть децентр. по определению, так в ней должен быть цикл выборки-трансляции-эмуляции. Если же такого цикла нет, то это не вм, а типичный обфускатор(морф).

3-й ваш код есть ничто иное, как отморфленное условное ветвление(Jge), так как адреса не передаются непосредственно в данный стаб, а статически слинкованы. Если бы адреса передавались аргументом, то была бы необходима эмуляция, те цикл вм.

-----
vx


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


Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 29 августа 2017 13:02
· Личное сообщение · #6

Хорошо, доспустим это обфускатор
Как мне действовать тогда?
Может быть и не сложный, просто у меня нет в этом опыта, это же мое хобби

-----
В облачке многоточия




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

Создано: 29 августа 2017 13:05
· Личное сообщение · #7

Короче OEP тут:
Code:
  1. 10B34FB6  /> >E8 6680BA00   CALL 116DD021
  2. 10B34FBB  \. |E9 5573BA00   JMP 116DC315

Секция кода вроде чистая, анти-дебага нет, ничего особенного...разве что dll'лок для запуска с ексешником нет))
Дампите, фиксите таблицу импорта - если запускается без проблем, забудьте за это навесное говно (скорее всего, обычный пакер и не более того). Правда, там ещё steam есть.




Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 29 августа 2017 16:01
· Личное сообщение · #8

ELF_7719116 пишет:
Секция кода вроде чистая, анти-дебага нет, ничего особенного...разве что dll'лок для запуска с ексешником нет))
Дампите, фиксите таблицу импорта - если запускается без проблем, забудьте за это навесное говно (скорее всего, обычный пакер и не более того). Правда, там ещё steam есть.

Спасибо за ответ, но это мне уже известно
У меня нет проблем с кодом игры, как я сказала ранее - я уже сдампила и восстановила импорт, для статического анализа
Проблема в доп. секции по адресу 0x12846000, сразу в ней видны массивы байт, которые, как я думаю есть защищенные функции
1) 12846000
2) 12846610
3) 12847210
...и так далее
Я думаю эта секция пришита пакером, в чем в принципе и задача - опознать его
Вот начала некоторых защищенных функций:
1) 10C42E34 - не используется, или может быть используется после распаковки какой-нибудь другой функции
2) 109EF0F6 - в теории должна быть функция записи скриншота с фронт-буфера рендеринга от анти-чита
3) 112EBAF4 - в теории должна быть функция записи скриншота с бэк-буфера рендеринга от анти-чита
...и так далее
Все начинаются с сохранения состояния
Code:
  1. .text:112EBAF4 000                 pushf
  2. .text:112EBAF5 004                 push    ebx
  3. .text:112EBAF6 008                 push    edi
  4. .text:112EBAF7 00C                 push    eax
  5. .text:112EBAF8 010                 push    edx
  6. .text:112EBAF9 014                 push    esi

Но в разных вариациях
Интерес распаковать именно защищенные функции
Вообще нет проблемы скрыться от анти-чита, но хочется знать именно что он делает

-----
В облачке многоточия




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

Создано: 29 августа 2017 17:21
· Личное сообщение · #9

Boostyq
Всё увидел. Выложите, пожалуйста, распакованный ексешник с dll'ками, которые в папке - там их штук 7 должно быть. Хочу уточнить главное тогда - распакованный файло запускается??



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 29 августа 2017 17:54 · Поправил: vden
· Личное сообщение · #10

На вмпрот не похоже, больше похож на enigma. Хотя высока вероятность, что это какой-то кастом.




Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 29 августа 2017 18:47 · Поправил: Boostyq
· Личное сообщение · #11

ELF_7719116 пишет:
Всё увидел. Выложите, пожалуйста, распакованный ексешник с dll'ками, которые в папке - там их штук 7 должно быть. Хочу уточнить главное тогда - распакованный файло запускается??

Дело в том, что как я и сказала, у меня только дамп с исправленной таблицей импорта, я думаю он не работоспособен - мне только для статического анализа с идой
Но вот ссылка на архив со всеми бинарниками игры
Без ресурсов она вряд ли заработает, но для запуска хватит
https://mega.nz/#!Yw8mDDZL!9ql0J4qQO3yaj0DFsvdsiEeEmjGFkXpllFUuDH_b2Uw
Так же добавила APB_dump.exe это дампленый файл, который я изучала, в иду подгрузится, импорт есть

Добавлено спустя 4 часа 47 минут
Попробовала в ручную протрассировать одну функцию по адресу 0x109EF0F6
Там где смогла на автомате пропустила прыжки и т.п.
Все таки имеется конечное число ответвлений, максимальная глубина 9
Чем больше островков добавляешь, тем чаще встречается переход одного в другой
Вроде бы нашла все которые используются в этой функции

ea64_30.08.2017_EXELAB.rU.tgz - tracetest.txt

-----
В облачке многоточия





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

Создано: 30 августа 2017 02:00 · Поправил: difexacaw
· Личное сообщение · #12

Boostyq

А зачем это дампить что бы потом запустить, если оно каждый раз запускается и без всяких дампов и правок ?

Подпилить что бы под иду ?

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

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

-----
vx





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 30 августа 2017 08:52 · Поправил: ajax
· Личное сообщение · #13

difexacaw
90%, если не более, занимаются конкретной задачей. при хорошей базе работают на AV и тп, а не тусят здесь. если есть наработки - конкретизируйте. а по теории и так полно (около)научных студенческих статей MIT и т.п.

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 30 августа 2017 11:09 · Поправил: Boostyq
· Личное сообщение · #14

Все ковыряюсь с той трассой
Перенесла в функцию чтобы скомпилить
Убираю понемногу обфускационные прыжки
Code:
  1. _asm push    offset loc_1146E671 ; known
  2. _asm push    ecx
  3. _asm push    edx
  4. _asm mov     ecx, [esp+8]
  5. _asm mov     edx, offset sub_109352F4 ; known
  6. _asm cmovnz  ecx, edx
  7. _asm mov     [esp+8], ecx
  8. _asm pop     edx
  9. _asm pop     ecx
  10. _asm retn
  11.  
  12. _asm jnz     sub_109352F4
  13. _asm jmp     loc_1146E671


И тому подобное, но не знаю верно ли
Но не знаю чем заменить вот такое
Code:
  1. _asm mov     ebp, [esp+0] //это вообще зачем?
  2. _asm lea     esp, [esp+4] //add esp, 4 ?
  3. _asm lea     esp, [esp+4] //add esp, 4 ?
  4. _asm jmp     [esp-4] //retn но со смещением или нет?
  5.  
  6. _asm mov ebp, [esp]
  7. _asm add esp, 4
  8. _asm retn


Вообщем собрала и отдала иде
На выходе получилось что-то, но мне кажется это фуфло xD
Code:
  1. do
  2.   {
  3.     v8 += (*(_BYTE *)*v11 & 0x7F) << v9;
  4.     v9 += 7;
  5.     v5 = *(_BYTE *)*v11;
  6.     *v11 = (char *)*v11 + 1;
  7.   }
  8.   while ( v5 >= 128 );
  9.   *(_DWORD *)v12 += *(_DWORD *)(v12 + 4) + v8;
  10.   if ( *(_DWORD *)v12 != -1 )
  11.   {
  12.     v6 = *(_BYTE *)*v11 & 0x7F;
  13.     v7 = *(_BYTE *)*v11;
  14.     *v11 = (char *)*v11 + 1;
  15.     *(_DWORD *)(v12 + 4) = v6;
  16.   }


-----
В облачке многоточия




Ранг: 19.9 (новичок), 16thx
Активность: 0.040.01
Статус: Участник

Создано: 30 августа 2017 11:21
· Личное сообщение · #15

Code:
  1. _asm mov     ebp, [esp+0] //это вообще зачем?

на сях это указатель, типа такого
ebp = *esp;
на асме его исправить на такое
Code:
  1. mov ebp, [esp] // "+0" добавила ида, или там опкод такой - 8B 6C 24 00 или такой 8B AC 24 00 00 00 00

Code:
  1. _asm lea     esp, [esp+4] //add esp, 4 ?

да, тоесть получается так
esp = esp+4;
esp = esp+4;
esp = esp-4;
jmp esp
если упростить получается
jmp [esp+4];
и весь этот кусок будет
Code:
  1. mov ebp, [esp]
  2. jmp [esp+4];





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 30 августа 2017 11:26 · Поправил: Boostyq
· Личное сообщение · #16

Попробовала прогуглить кусочки кода
Первая часть похожа на функцию decodeULEB128
Code:
  1. inline uint64_t decodeULEB128(const uint8_t *p, unsigned *= 0) {
  2.   const uint8_t *orig_p = p;
  3.   uint64_t Value = 0;
  4.   unsigned Shift = 0;
  5.   do {
  6.     Value += (*& 0x7f) << Shift;
  7.     Shift += 7;
  8.   } while (*p++ >= 128);
  9.   if (n)
  10.     *= (unsigned)(- orig_p);
  11.   return Value;
  12. }

Взято отсюда https://hackage.haskell.org/package/LibClang-3.4.0/src/llvm/include/llvm/Support/LEB128.h
Но зачем оно здесь вообще, это типо декомпрессия сжатого числа, но тут речь должна быть о функции

-----
В облачке многоточия





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 30 августа 2017 11:57
· Личное сообщение · #17

Boostyq
кто-то с кодекэйвами и джамподелалкой поигрался прикольно. не встречал ранее. плюс, часть кода запихали в доп секцию. из-за нелинейности процедур и есть проблема анализа. трассу делать по каждой ветке, асмить и сворачивать, если нужны какие-то алго. обфускацию, как таковую, не вижу.
мож clerk что-то дельное подскажет.

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 30 августа 2017 12:04
· Личное сообщение · #18

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

-----
В облачке многоточия





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

Создано: 30 августа 2017 13:44
· Личное сообщение · #19

ajax

Так а что подсказать, сворачивать нужно - выделить базовые макро и свернуть автоматикой. Из текста #11 можно элементарно выделить следующее:

Code:
  1. .text:1288866A                     push    offset sub_115CBF05 ; known
  2. .text:1288866F                     lea     esp, [esp-4]
  3. .text:12888673                     mov     [esp], eax
  4. .text:12888676                     mov     [esp-4], ecx
  5. .text:1288867A                     lea     esp, [esp-4]
  6. .text:1288867E                     mov     eax, [esp+8]
  7. .text:12888682                     mov     ecx, offset loc_128D0E9F ; known
  8. .text:12888687                     cmovge  eax, ecx
  9. .text:1288868A                     mov     [esp+8], eax
  10. .text:1288868E                     mov     ecx, [esp]
  11. .text:12888691                     lea     esp, [esp+4]
  12. .text:12888695                     mov     eax, [esp]
  13. .text:12888698                     lea     esp, [esp+4]
  14. .text:1288869C                     lea     esp, [esp+4]
  15. .text:128886A0                     jmp     dword ptr [esp-4]


Это отморфленное условное ветвление в виде макро, обратите внимание что до этой вставки переменные адресуются нормальным способом(ebp). На входе условие и два адреса, если условие верно, то переход на второй адрес без изменения контекста.

Code:
  1. .text:10AEC275 000                 push    offset loc_11269431 ; known
  2. .text:10AEC27A 004                 push    ebx
  3. .text:1286783F 008                 push    eax
  4. .text:12867840 00C                 mov     ebx, [esp+0Ch+var_4]
  5. .text:1297EF0E 00C                 mov     eax, offset loc_10BB2837 ; known
  6. .text:1297EF13 00C                 cmovz   ebx, eax
  7. .text:1297EF16 00C                 mov     [esp+0Ch+var_4], ebx
  8. .text:10BBA968 008                 pop     eax
  9. .text:10BBA969 004                 pop     ebx
  10. .text:10BBA96A 000                 retn


- то же самое, условное ветвление. Макро в данном случае легко находятся по esp-адресации и обращению ниже стека, остальной код вроде как нормальный. Отморфленный leave/ret:

Code:
  1. text:12D7B650 034                 mov     [esp-4], ebp
  2. text:12908520 05C                 lea     esp, [esp-4]
  3. text:12908524 060                 pop     esp
  4. text:12908525 05C                 lea     esp, [esp+4]
  5. text:12908529 058                 mov     ebp, [esp+58h+var_5C]
  6. text:109CD607 000                 lea     esp, [esp+4]
  7. text:109CD60B 000                 jmp     dword ptr [esp-4]


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

-----
vx





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 30 августа 2017 15:06 · Поправил: ajax
· Личное сообщение · #20

Boostyq
не вижу вм. она должна занимать место. тут его занятого нет. могу ошибаться, смотрел поверхностно.
difexacaw
автоматикой... не представляю. нейросеть?

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 30 августа 2017 16:38 · Поправил: Boostyq
· Личное сообщение · #21

Немного разобралась
Растрассировала другую функцию, на этот раз я прямо на ходу деобфусцировала прыжки
Далее я поняла, что в прошлый раз упустила ответвление
Следующим открытием было то, что конструкция
Code:
  1. push addr1
  2. push addr2
  3. retn

Ни что иное как call, а addr1 это адрес возврата
Таким образом, всего на самом деле 3 функции внутри
А поняла это через инструкции sub esp, xxx - они не обфусцированы
Итого первая функция это просто враппер, сохраняет регистры и флаги в разном порядке во всех функциях
В конце возвращает все назад в обратном порядке
Code:
  1. .text:10DEB024 000                 push    edx
  2. .text:10DEB025 004                 push    ecx
  3. .text:10DEB026 008                 push    eax
  4. .text:10DEB027 00C                 push    ebx
  5. .text:10DEB028 010                 pushf
  6. .text:10DEB029 014                 push    edi
  7. .text:10DEB02A 018                 push    esi
  8.  
  9. .text:10E4DF55 01C                 push    offset sub_109BBBC7 ; здесь адрес возврата
  10. .text:10E4DF5A 020                 push    offset sub_128F5CF3 ; прыжок на вторую функцию
  11. .text:10E4DF5F 024                 retn ; вместе это просто вызов второй функции
  12.  
  13. .text:109BBBC7 000                 lea     esp, [esp+4]
  14. .text:129C66E2 -08                 mov     esi, [esp-4]
  15. .text:128F8103 -08                 mov     edi, [esp]
  16. .text:128F8106 -08                 lea     esp, [esp+4]
  17. .text:128F810A -0C                 popf
  18. .text:128F810B -10                 mov     ebx, [esp]
  19. .text:12DBCC1E -10                 lea     esp, [esp+4]
  20. .text:12DBCC22 -14                 lea     esp, [esp+4]
  21. .text:128CBEFA -04                 mov     eax, [esp-4]
  22. .text:128CBEFE -04                 mov     ecx, [esp]
  23. .text:128CBF01 -04                 lea     esp, [esp+4]
  24. .text:128CBF05 -08                 mov     edx, [esp]
  25. .text:1098DB27 000                 lea     esp, [esp+4]
  26. .text:11378C98                     retn

Далее вторая функция именно та, которую я упустила в первый раз
Это главный расшифровщик, как я полагаю
И она вызывает ту функцию, которую я нашла в самом начале
Та первая это, как я и думала, функция decodeULEB128
Итого загрузила все в иду
Code:
  1. void __usercall TT2_1(char _CF@<cf>, char _ZF@<zf>, char _SF@<sf>, char _OF@<of>, int a5@<ebp>)
  2. {
  3.   __asm { pushfw }
  4.   TT2_2(a5);
  5.   __asm { popfw }
  6. }
  7. void __usercall TT2_2(int a1@<ebp>)
  8. {
  9.   int v1; // edx@1
  10.   int v2; // ecx@1
  11.   int v3; // ecx@12
  12.   int v4; // eax@12
  13.   int v5; // edx@14
  14.   int v6; // ST10_4@21
  15.   int v7; // edx@22
  16.   void *v8; // [sp+4h] [bp-5Ch]@21
  17.   int v9; // [sp+8h] [bp-58h]@21
  18.   unsigned int v10; // [sp+Ch] [bp-54h]@0
  19.  
  20.   *(_DWORD *)(a1 - 40) = dword_10CE94DA;
  21.   *(_DWORD *)(a1 - 20) = off_10C362CA;
  22.   *(_DWORD *)(a1 - 24) = TT2_2;
  23.   *(_DWORD *)(a1 - 24) -= off_10B78378;
  24.   *(_DWORD *)(a1 - 20) += *(_DWORD *)(a1 - 24);
  25.   *(_DWORD *)(a1 + 4 * dword_10AB8EF9 + 8) = off_111F4E59;
  26.   *(_DWORD *)(a1 - 36) = &byte_12E40699;
  27.   *(_DWORD *)(a1 - 28) = a1 - 64;
  28.   *(_DWORD *)(a1 - 8) = *(_DWORD *)(a1 - 28);
  29.   *(_DWORD *)(a1 - 48) = 0;
  30.   *(_DWORD *)(a1 - 12) = 0;
  31.   *(_DWORD *)(a1 - 32) = &qword_1291794D;
  32.   v1 = *(_DWORD *)(a1 - 32);
  33.   v2 = *(_DWORD *)(v1 + 4);
  34.   *(_DWORD *)(a1 - 84) = *(_DWORD *)v1;
  35.   *(_DWORD *)(a1 - 80) = v2;
  36.   *(_DWORD *)(a1 - 76) = 0;
  37.   *(_DWORD *)(a1 - 72) = 0;
  38.   *(_DWORD *)(a1 - 56) = &dword_12DF63CE;
  39.   do
  40.   {
  41.     TT2_3((_BYTE **)(a1 - 56), a1 - 76);
  42.     if ( *(_DWORD *)(a1 - 76) == -1 )
  43.     {
  44.       *(_DWORD *)(a1 + 4 * dword_10BBEA8A + 8) = off_11428CC9;
  45.       dword_113096AA = dword_10A916AE;
  46.       *(_DWORD *)(a1 + 4 * dword_113BCE9A + 8) = off_113DEEC9;
  47.       return;
  48.     }
  49.     *(_DWORD *)(a1 - 16) = *(_DWORD *)(a1 - 76) + *(_DWORD *)(a1 - 20);
  50.     *(_DWORD *)(a1 - 52) = *(_DWORD *)(a1 - 72) + *(_DWORD *)(a1 - 76) + *(_DWORD *)(a1 - 20);
  51.   }
  52.   while ( *(_DWORD *)(a1 - 16) == *(_DWORD *)(a1 - 52) );
  53.   if ( *(_DWORD *)(a1 - 8) == *(_DWORD *)(a1 - 28) )
  54.   {
  55.     *(_DWORD *)(a1 - 8) = a1 - 68;
  56.     **(_DWORD **)(a1 - 8) = **(_DWORD **)(a1 - 36) ^ *(_DWORD *)(a1 - 40);
  57.     *(_DWORD *)(a1 - 36) += 4;
  58.     *(_DWORD *)(a1 - 40) += **(_DWORD **)(a1 - 8);
  59.   }
  60.   *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 52) - *(_DWORD *)(a1 - 16);
  61.   if ( *(_DWORD *)(a1 - 28) - *(_DWORD *)(a1 - 8) < *(_DWORD *)(a1 - 4) )
  62.     *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 28) - *(_DWORD *)(a1 - 8);
  63.   if ( !*(_DWORD *)(a1 - 12) && *(_DWORD *)(a1 - 24) )
  64.   {
  65.     if ( !*(_DWORD *)(a1 - 48) )
  66.     {
  67.       v3 = *(_DWORD *)(a1 - 32);
  68.       v4 = *(_DWORD *)(v3 + 4);
  69.       *(_DWORD *)(a1 - 84) = *(_DWORD *)v3;
  70.       *(_DWORD *)(a1 - 80) = v4;
  71.       *(_DWORD *)(a1 - 32) += 8;
  72.       *(_DWORD *)(a1 - 48) = 1;
  73.     }
  74.     if ( *(_DWORD *)(a1 - 84) != -1 )
  75.     {
  76.       v5 = *(_DWORD *)(a1 - 84) + *(_DWORD *)(a1 - 20) - *(_DWORD *)(a1 - 16);
  77.       *(_DWORD *)(a1 - 44) = v5;
  78.       if ( v5 )
  79.       {
  80.         if ( *(_DWORD *)(a1 - 44) < *(_DWORD *)(a1 - 4) )
  81.           *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 44);
  82.       }
  83.       else
  84.       {
  85.         *(_DWORD *)(a1 - 12) = 4;
  86.       }
  87.     }
  88.   }
  89.   if ( *(_DWORD *)(a1 - 12) )
  90.   {
  91.     if ( *(_DWORD *)(a1 - 12) < *(_DWORD *)(a1 - 4) )
  92.       *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 12);
  93.     v6 = *(_DWORD *)(a1 - 4);
  94.     v10 = *(_DWORD *)(a1 - 8);
  95.     v9 = a1 - 56 - *(_DWORD *)(a1 - 12);
  96.     v8 = &loc_45AD19;
  97.   }
  98.   else
  99.   {
  100.     v9 = *(_DWORD *)(a1 - 4);
  101.     v8 = *(void **)(a1 - 8);
  102.     v7 = *(_DWORD *)(a1 - 16);
  103.   }
  104.   while ( v10 >= 4 )
  105.   {
  106.     *(_DWORD *)v8 = *(_DWORD *)v9;
  107.     v10 -= 4;
  108.     v8 = (char *)v8 + 4;
  109.     v9 += 4;
  110.   }
  111.   qmemcpy(v8, (const void *)v9, v10);
  112. }
  113. void __cdecl TT2_3(_BYTE **a1, int a2)
  114. {
  115.   signed int v2; // ST08_4@2
  116.   signed int v3; // ST00_4@5
  117.   int v4; // [sp+10h] [bp-Ch]@1
  118.   int v5; // [sp+14h] [bp-8h]@1
  119.   int v6; // [sp+18h] [bp-4h]@1
  120.   int v7; // [sp+18h] [bp-4h]@4
  121.  
  122.   v6 = 0;
  123.   v5 = 0;
  124.   v4 = 0;
  125.   do
  126.   {
  127.     v5 += (**a1 & 0x7F) << v6;
  128.     v6 += 7;
  129.     v2 = *(*a1)++;
  130.   }
  131.   while ( v2 >= 128 );
  132.   *(_DWORD *)a2 += *(_DWORD *)(a2 + 4) + v5;
  133.   if ( *(_DWORD *)a2 != -1 )
  134.   {
  135.     v7 = 0;
  136.     do
  137.     {
  138.       v4 += (**a1 & 0x7F) << v7;
  139.       v7 += 7;
  140.       v3 = *(*a1)++;
  141.     }
  142.     while ( v3 >= 128 );
  143.     *(_DWORD *)(a2 + 4) = v4;
  144.   }
  145. }

Так же прилагаю файл из которого это все получилось
Там полная трасса и разбитый на функции код

25ef_30.08.2017_EXELAB.rU.tgz - tracetest2.h

Полагаю, что для каждой функции код одинаковый, вначале собирается контекст
Затем идет расшифровка и наверное прыжок на расшифрованную функцию, но пока не знаю точно

Добавлено спустя 18 минут
А нет, там не 3, а 4
Просто одну вложенную матрешку я не заметила

-----
В облачке многоточия





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 30 августа 2017 17:07
· Личное сообщение · #22

Так что финальный код будет такой
Code:
  1. void __usercall TT2_2(int a1@<ebp>)
  2. {
  3.   int v1; // edx@1
  4.   int v2; // ecx@1
  5.   int v3; // ecx@13
  6.   int v4; // eax@13
  7.   int v5; // edx@15
  8.   int v6; // ST10_4@22
  9.   int v7; // edx@22
  10.   unsigned int v8; // [sp+14h] [bp-4Ch]@0
  11.  
  12.   *(_DWORD *)(a1 - 40) = dword_10CE94DA;
  13.   *(_DWORD *)(a1 - 20) = off_10C362CA;
  14.   *(_DWORD *)(a1 - 24) = TT2_2;
  15.   *(_DWORD *)(a1 - 24) -= off_10B78378;
  16.   *(_DWORD *)(a1 - 20) += *(_DWORD *)(a1 - 24);
  17.   *(_DWORD *)(a1 + 4 * dword_10AB8EF9 + 8) = off_111F4E59;
  18.   *(_DWORD *)(a1 - 36) = &byte_12E40699;
  19.   *(_DWORD *)(a1 - 28) = a1 - 64;
  20.   *(_DWORD *)(a1 - 8) = *(_DWORD *)(a1 - 28);
  21.   *(_DWORD *)(a1 - 48) = 0;
  22.   *(_DWORD *)(a1 - 12) = 0;
  23.   *(_DWORD *)(a1 - 32) = &qword_1291794D;
  24.   v1 = *(_DWORD *)(a1 - 32);
  25.   v2 = *(_DWORD *)(v1 + 4);
  26.   *(_DWORD *)(a1 - 84) = *(_DWORD *)v1;
  27.   *(_DWORD *)(a1 - 80) = v2;
  28.   *(_DWORD *)(a1 - 76) = 0;
  29.   *(_DWORD *)(a1 - 72) = 0;
  30.   *(_DWORD *)(a1 - 56) = &dword_12DF63CE;
  31.   while ( 1 )
  32.   {
  33.     TT2_3((_BYTE **)(a1 - 56), a1 - 76);
  34.     if ( *(_DWORD *)(a1 - 76) == -1 )
  35.       break;
  36.     *(_DWORD *)(a1 - 16) = *(_DWORD *)(a1 - 76) + *(_DWORD *)(a1 - 20);
  37.     *(_DWORD *)(a1 - 52) = *(_DWORD *)(a1 - 72) + *(_DWORD *)(a1 - 76) + *(_DWORD *)(a1 - 20);
  38.     while ( *(_DWORD *)(a1 - 16) != *(_DWORD *)(a1 - 52) )
  39.     {
  40.       if ( *(_DWORD *)(a1 - 8) == *(_DWORD *)(a1 - 28) )
  41.       {
  42.         *(_DWORD *)(a1 - 8) = a1 - 68;
  43.         **(_DWORD **)(a1 - 8) = **(_DWORD **)(a1 - 36) ^ *(_DWORD *)(a1 - 40);
  44.         *(_DWORD *)(a1 - 36) += 4;
  45.         *(_DWORD *)(a1 - 40) += **(_DWORD **)(a1 - 8);
  46.       }
  47.       *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 52) - *(_DWORD *)(a1 - 16);
  48.       if ( *(_DWORD *)(a1 - 28) - *(_DWORD *)(a1 - 8) < *(_DWORD *)(a1 - 4) )
  49.         *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 28) - *(_DWORD *)(a1 - 8);
  50.       if ( !*(_DWORD *)(a1 - 12) && *(_DWORD *)(a1 - 24) )
  51.       {
  52.         if ( !*(_DWORD *)(a1 - 48) )
  53.         {
  54.           v3 = *(_DWORD *)(a1 - 32);
  55.           v4 = *(_DWORD *)(v3 + 4);
  56.           *(_DWORD *)(a1 - 84) = *(_DWORD *)v3;
  57.           *(_DWORD *)(a1 - 80) = v4;
  58.           *(_DWORD *)(a1 - 32) += 8;
  59.           *(_DWORD *)(a1 - 48) = 1;
  60.         }
  61.         if ( *(_DWORD *)(a1 - 84) != -1 )
  62.         {
  63.           v5 = *(_DWORD *)(a1 - 84) + *(_DWORD *)(a1 - 20) - *(_DWORD *)(a1 - 16);
  64.           *(_DWORD *)(a1 - 44) = v5;
  65.           if ( v5 )
  66.           {
  67.             if ( *(_DWORD *)(a1 - 44) < *(_DWORD *)(a1 - 4) )
  68.               *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 44);
  69.           }
  70.           else
  71.           {
  72.             *(_DWORD *)(a1 - 12) = 4;
  73.           }
  74.         }
  75.       }
  76.       if ( *(_DWORD *)(a1 - 12) )
  77.       {
  78.         if ( *(_DWORD *)(a1 - 12) < *(_DWORD *)(a1 - 4) )
  79.           *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 12);
  80.         v6 = *(_DWORD *)(a1 - 4);
  81.         TT2_4((void *)(a1 - 56 - *(_DWORD *)(a1 - 12)), *(const void **)(a1 - 8), v8);
  82.         v7 = *(_DWORD *)(a1 - 12) - *(_DWORD *)(a1 - 4);
  83.         *(_DWORD *)(a1 - 12) = v7;
  84.         if ( !v7 )
  85.         {
  86.           **(_DWORD **)(a1 - 16) = *(_DWORD *)(a1 - 24) + *(_DWORD *)(a1 - 60);
  87.           *(_DWORD *)(a1 - 48) = 0;
  88.           *(_DWORD *)(a1 - 16) += 4;
  89.         }
  90.       }
  91.       else
  92.       {
  93.         TT2_4(*(void **)(a1 - 16), *(const void **)(a1 - 8), *(_DWORD *)(a1 - 4));
  94.         *(_DWORD *)(a1 - 16) += *(_DWORD *)(a1 - 4);
  95.       }
  96.       *(_DWORD *)(a1 - 8) += *(_DWORD *)(a1 - 4);
  97.     }
  98.   }
  99.   *(_DWORD *)(a1 + 4 * dword_10BBEA8A + 8) = off_11428CC9;
  100.   dword_113096AA = dword_10A916AE;
  101.   *(_DWORD *)(a1 + 4 * dword_113BCE9A + 8) = off_113DEEC9;
  102. }


-----
В облачке многоточия





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

Создано: 31 августа 2017 01:25
· Личное сообщение · #23

Boostyq

> Так что финальный код будет такой

Code:
  1.  *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 52) - *(_DWORD *)(a1 - 16);
  2. 48.      if ( *(_DWORD *)(a1 - 28) - *(_DWORD *)(a1 - 8) < *(_DWORD *)(a1 - 4) )
  3. 49.        *(_DWORD *)(a1 - 4) = *(_DWORD *)(a1 - 28) - *(_DWORD *)(a1 - 8);
  4. 50.      if ( !*(_DWORD *)(a1 - 12) && *(_DWORD *)(a1 - 24) )


Стесняюсь спросить, вы что понимаете в этом мусоре/рандоме что то ?

ajax

> автоматикой... не представляю. нейросеть?

Какие есчо сети, пример был в теме про вмпрот. Можно всё это весь просто обработать, только для построения графа(те покрытия всего кода) нужно свернуть макросы, так как конструктор не проходит по константам, так как не известно что это - данные, указатель, указатель на данные или код.

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 31 августа 2017 01:44
· Личное сообщение · #24

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




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

Создано: 31 августа 2017 01:53 · Поправил: difexacaw
· Личное сообщение · #25

shellstorm

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

Та мат экзотика на которую вы ссылаетесь малопригодна в реале, это всё матчасть и бесполезный POC. Покажите пример как это юзать.

Добавлено спустя 7 минут
shellstorm

> загоняют такой код в промежуточный язык

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

-----
vx




Ранг: 0.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 августа 2017 02:03 · Поправил: iNOTaDUMPERasYOU
· Личное сообщение · #26

OEP: 10B34FB6
дампим вм+доп проверки патчим+импорт и все чисто
ps: это из игры All point bulletin, там стоит самописный античит накрытый вмкой самодельной




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

Создано: 31 августа 2017 02:09
· Личное сообщение · #27

iNOTaDUMPERasYOU

Покажите цикл вм. EP можно найти по инициализации среды, те сервисному логу и его каллстеку.

-----
vx





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

Создано: 31 августа 2017 08:45
· Личное сообщение · #28

difexacaw пишет:
Покажите цикл вм.

А его может и не быть, сейчас в моде безцикловые вм.

-----
Everything is relative...




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

Создано: 31 августа 2017 09:46
· Личное сообщение · #29

iNOTaDUMPERasYOU
За OEP уже выяснили. Кстати, Boostyq, в Вашем дампе нужно корректно эту EP в хидере прописать, там нуль стоит.
Я ещё обратил внимание, что много указателей в космос смотрят:
Code:
  1. 10A8D5C4  |.  8B13          MOV EDX,DWORD PTR DS:[EBX] 
  2. 10A8D5C6  |.  8B0F          MOV ECX,DWORD PTR DS:[EDI]
  3. 10A8D5C8  |>  3911          /CMP DWORD PTR DS:[ECX],EDX //космос
  4. ...
  5. 109013FB  |> \8B0D D8C75612 MOV ECX,DWORD PTR DS:[1256C7D8] //тут прям видно откуда берется
  6. 10901401  |.  6A 08         PUSH 8
  7. 10901403  |.  8B11          MOV EDX,DWORD PTR DS:[ECX] //космос
  8. 10901405  |.  03C0          ADD EAX,EAX

по крайней мере, если дампилось в OEP, тогда очевидно, что запутанный код до OEP выполняет их инициализацию.

Вообще на вм это не очень похоже - как-то "обфускация" здесь больше подходит.




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

Создано: 31 августа 2017 10:19
· Личное сообщение · #30

ELF_7719116 пишет:
Секция кода вроде чистая, анти-дебага нет, ничего особенного...разве что dll'лок для запуска с ексешником нет))
Дампите, фиксите таблицу импорта - если запускается без проблем, забудьте за это навесное говно (скорее всего, обычный пакер и не более того). Правда, там ещё steam есть

Да конечно можно забыть про это часть прыжков
Code:
  1. 1090106B   JMP 128C5DC1
  2. 109014BB   JMP 128F7C5F
  3. 109015BB   JMP 12DB304B
  4. 109015F6   CALL 128724CE
  5. 10901605   CALL 12DD96DD
  6. 1090178B   JMP 12952003
  7. 109017BB   JMP 12E246DB
  8. 10901D8B   JMP 12E48639
  9. 1090208B   JMP 128DD589



0ed4_31.08.2017_EXELAB.rU.tgz - jmp code.txt

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



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


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