Сейчас на форуме: (+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 или чего-го похожего
Может быть кто-то узнает что нибудь знакомое?
Заранее спасибо

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





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

Создано: 31 августа 2017 10:31 · Поправил: Boostyq
· Личное сообщение · #2

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

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

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

Суть в том, что он есть лента частей, она зашифрована с через leb128, каждое 64-битное число - это смещение, относительно базы, и размер части
Далее идет цикл, пока указатель не будет равен концу части
Вначале идет перезагрузка и расшифровка буфера, не знаю зачем, он всего 4 байта, может задумывалось несколько вариантов, в любом случае буфер тоже в контексте, в него копируется содержимое из сурса и ксорится ключом, ключ потом модифицируется
Далее идет определение размера части, ограничивается остатком от части и общим размером буфера
Дальше 2 ветвления которые вообще не используются в данном случае, и в конце идет запись расшифрованной части от части по указателю части

Code:
  1. part 1095EE35[11] : ea c2 e9 0f 45 25 56 ba c8 da 16
  2. part 10966255[11] : 34 d2 63 f3 5a a9 59 17 c3 a2 93
  3. part 1099D085[11] : fe 53 91 f2 ea f1 a9 d7 f2 98 5d
  4. part 10A61795[11] : 46 50 ba ab ea 4a f0 ec eb a8 eb
  5. part 10AE1D55[11] : ad af 92 29 a7 04 e8 fe 1d 46 81
  6. part 10B152A3[48] : d2 25 1b ed 67 9d 13 ee fc dc 81 dc c5 b4 45 38 1d c
  7. 96 cc 81 92 5d 36 6e bd 80 8f 53 64 a3 2e 70 49 c2 2b a9 cc 03 8d f3 5a
  8.  d5
  9. part 10B152D4[11] : ac a9 f8 18 f1 d7 fb ff 89 c8 d3
  10. part 10B152E0[6] : ab 76 07 ce ac 60
  11. part 10B152ED[11] : 0a e0 27 17 df 74 39 f7 cb 38 ee
  12. part 10B152F9[11] : 88 a9 b7 50 03 db 1b 77 8a b7 18
  13. part 10B15305[6] : 27 9d 31 95 47 60
  14. part 10B15312[11] : a9 fc 22 80 ec 8c 47 45 9b 19 b2
  15. part 10B1531E[11] : d4 6b a8 3e 7c 93 a3 df 72 8d f8
  16. part 10B1532A[6] : 58 e4 4a 9b 6a 52
  17. part 10B15337[11] : b7 48 24 d2 46 64 96 cb 2d 81 55
  18. part 10B15343[11] : 69 1c cf d2 99 b2 ae 5e 8a 0a 43
  19. part 10B1534F[6] : d5 46 92 37 f5 d3
  20. part 10B1535C[11] : 22 5e 2b eb ed 62 3c cd 46 39 48
  21. part 10B15368[11] : 85 7e b9 c6 53 8e 2f 6b 9c 3f 63
  22. part 10B15374[6] : 31 8c ca 02 69 48
  23. part 10B15381[11] : b5 e9 5b 00 ac 57 5b 82 84 53 d1
  24. part 10B1538D[11] : d2 17 b2 2c d1 5c 1f 44 ee 8b a1
  25. part 10B15399[6] : e1 a1 d6 0e f7 37
  26. part 10B153A6[11] : b1 48 9e 16 18 e7 3a 36 8a 78 c7
  27. part 10B153B2[11] : c7 0a 48 3e b4 2a 14 77 48 75 04
  28. part 10B153BE[6] : 64 00 ac 8d a4 82
  29. part 10B153CB[8] : 84 ef 2e d3 17 4a d3 d2
  30. part 10CE7685[11] : 5c ff bb f1 8b 21 1e 9e d6 0e 09
  31. part 10D7ED95[11] : c8 b1 48 62 e9 18 e7 c2 c9 8a 78
  32. part 10DF32F5[11] : 37 38 02 04 69 01 2d 45 a7 0c 1c
  33. part 10E750D5[11] : d2 87 7f 09 6e 82 72 35 53 82 91
  34. part 110F6389[5] : a5 03 1d 49 1f
  35. part 113AD7A5[11] : 06 32 bc 99 b4 63 b6 c4 62 b0 8c
  36. part 113AE245[11] : 0f b5 a7 70 08 15 dd 2b 39 a9 2e
  37. part 115EFFF5[11] : 70 96 83 b3 8a 54 47 61 ba 0c 16
  38. part 1165B3DA[5] : 75 11 71 60 d0
  39. part 1178BC65[11] : 48 8e 75 01 57 a9 14 d3 92 43 dc
  40. part 11913B45[11] : 8d e5 69 92 63 4b bc fa 77 4c fb


Алгоритм работает, выдает байты от частей, вот только проблема ... ОНИ УЖЕ РАСШИФРОВАНЫ
Ну некоторые из них, в любом случае чаще всего это код-кейвы между функциями, но код не получается валидный, даже когда очевидно, что там должна быть часть функции, часть даже не совпадает по размеру
А определила, что алгоритм верный, т.к. некоторые части уже расшифрованы и совпадают с тем, что выдает моя программа

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

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





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

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

Boostyq пишет:
ак что, было бы неплохо получить распакованный клиент, а дальше не знаю пока

--> Link <-- дерзайте снят на oep но там реализована антидамп система так что надо победить её ещё

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


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


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

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

Вообщем есть как минимум 2 алгоритма, что-то расшифровывается, что-то нет
Так же есть как минимум 474(1) защищенных функций, чтобы подсчитать написала маленький скрипт для иды
Code:
  1. def fft_isPush(val):
  2.          if (val >= 0x50 and val <= 0x57) or val == 0x9C:
  3.                  return 1
  4.          return 0
  5.          
  6. totalCount = 0
  7.          
  8. for ea in Segments():
  9.          cur = SegStart(ea)
  10.          while cur < SegEnd(ea) - 4:
  11.                  curNew = cur
  12.                  while fft_isPush(idc.GetOriginalByte(curNew)):
  13.                         curNew += 1
  14.                  if curNew > cur and curNew - cur >= 4:
  15.                         if idc.GetMnem(curNew) == "jmp" and idc.GetMnem(idc.GetOperandValue(curNew, 0)) == "push":
  16.                               totalCount += 1
  17.                               print "found begin of %u at %x to %x" % (totalCount, cur, idc.GetOperandValue(curNew, 0))
  18.                               cur = curNew
  19.                  cur += 1

Скорее всего нужно писать какой-то трейсер
Мне прям интересно чем это они такое сгенерировали

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



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


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