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

 eXeL@B —› Вопросы новичков —› Исследование игры "Казаки - последний довод королей" [StarForce]
Посл.ответ Сообщение

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

Создано: 21 сентября 2013 15:36
· Личное сообщение · #1

Всем привет!
Недавно прочел статью "Star-Force: КАЗАКИ by ASMax", ничего не понял, но идейно вдохновился. Перечитал на форуме кучу оффтопа и понял немного больше - защита очень не из простых. Скачал образ, но к сожалению игра под XP не запустилась, тогда я скачал образ из --> сообщения <-- местного форумчанина и приступил к исследованиям protect.dll. Поначалу все было более-менее понятно:
Антиотладка:
Code:
  1. .text:6900BAAA                 push    offset ModuleName ; "KERNEL32.DLL"
  2. .text:6900BAAF                 call    ds:GetModuleHandleA
  3. .text:6900BAB5                 mov     Kernel32Base, eax
  4. .........
  5. .text:6900BB4F                 mov     ecx, Kernel32Base
  6. .text:6900BB55                 push    offset aIsdebuggerpres ; "IsDebuggerPresent"
  7. .text:6900BB5A                 push    ecx             ; hModule
  8. .text:6900BB5B                 call    ds:GetProcAddress
  9. .text:6900BB61                 mov     [ebp+lpAddress], eax
  10. .........
  11. .text:6900BBC3                 mov     eax, [ebp+lpAddress]
  12. .text:6900BBC6                 test    eax, eax
  13. .text:6900BBC8                 jz      short loc_6900BBD4
  14. .text:6900BBCA                 call    eax             ; IsDebuggerPresent
  15. .text:6900BBCC                 test    eax, eax
  16. .text:6900BBCE                 jnz     Debugger_detected
  17. .text:6900BBD4
  18. .text:6900BBD4 loc_6900BBD4:


Code:
  1. .text:6900BB64                 mov     eax, offset FileName ; "\\.\SICE"
  2. .text:6900BB69                 mov     edx, eax
  3. .text:6900BB6B                 mov     [ebp+var_14], eax
  4. .text:6900BB6E                 test    edx, edx
  5. .text:6900BB70                 mov     [ebp+var_10], offset a_Ntice ; "\\.\NTICE"
  6. .text:6900BB77                 mov     [ebp+var_C], offset a_Winice ; "\\.\WINICE"
  7. .text:6900BB7E                 mov     [ebp+var_8], edi
  8. .text:6900BB81                 jz      short loc_6900BBB7
  9. .text:6900BB83                 mov     ebx, ds:CreateFileA
  10. .text:6900BB89                 lea     esi, [ebp+var_14]
  11. .text:6900BB8C
  12. .text:6900BB8C loc_6900BB8C:
  13. .text:6900BB8C                 push    0               ; hTemplateFile
  14. .text:6900BB8E                 push    0               ; dwFlagsAndAttributes
  15. .text:6900BB90                 push    3               ; dwCreationDisposition
  16. .text:6900BB92                 push    0               ; lpSecurityAttributes
  17. .text:6900BB94                 push    0               ; dwShareMode
  18. .text:6900BB96                 push    80000000h       ; dwDesiredAccess
  19. .text:6900BB9B                 push    eax             ; lpFileName
  20. .text:6900BB9C                 call    ebx ; CreateFileA
  21. .text:6900BB9E                 cmp     eax, 0FFFFFFFFh
  22. .text:6900BBA1                 jnz     short loc_6900BBB0
  23. .text:6900BBA3                 mov     eax, [esi+4]
  24. .text:6900BBA6                 add     esi, 4
  25. .text:6900BBA9                 inc     edi
  26. .text:6900BBAA                 test    eax, eax
  27. .text:6900BBAC                 jnz     short loc_6900BB8C
  28. .text:6900BBAE                 jmp     short loc_6900BBB7
  29. .text:6900BBB0
  30. .text:6900BBB0 loc_6900BBB0:
  31. .text:6900BBB0                 push    eax             ; hObject
  32. .text:6900BBB1                 call    ds:CloseHandle
  33. .text:6900BBB7
  34. .text:6900BBB7 loc_6900BBB7:
  35. .text:6900BBB7                 mov     eax, [ebp+edi*4+var_14]
  36. .text:6900BBBB                 test    eax, eax
  37. .text:6900BBBD                 jnz     Debugger_detected


Проверка целостности:
Code:
  1. .text:6900BBD4                 mov     edx, hInstance
  2. .text:6900BBDA                 or      ecx, 0FFFFFFFFh
  3. .text:6900BBDD                 mov     eax, [edx+3Ch]
  4. .text:6900BBE0                 shr     eax, 2
  5. .text:6900BBE3                 mov     esi, [edx+eax*4+1Ch]
  6. .text:6900BBE7                 lea     eax, [edx+eax*4+18h]
  7. .text:6900BBEB                 test    esi, esi
  8. .text:6900BBED                 jbe     short loc_6900BC12
  9. .text:6900BBEF                 mov     eax, [eax+14h]
  10. .text:6900BBF2                 add     eax, edx
  11. .text:6900BBF4
  12. .text:6900BBF4 loc_6900BBF4:
  13. .text:6900BBF4                 mov     edx, ecx
  14. .text:6900BBF6                 xor     ebx, ebx
  15. .text:6900BBF8                 mov     bl, [eax]
  16. .text:6900BBFA                 and     edx, 0FFh
  17. .text:6900BC00                 xor     edx, ebx
  18. .text:6900BC02                 shr     ecx, 8
  19. .text:6900BC05                 mov     edx, ds:dword_690735A0[edx*4]
  20. .text:6900BC0C                 xor     ecx, edx
  21. .text:6900BC0E                 inc     eax
  22. .text:6900BC0F                 dec     esi
  23. .text:6900BC10                 jnz     short loc_6900BBF4
  24. .text:6900BC12
  25. .text:6900BC12 loc_6900BC12:
  26. .text:6900BC12                 mov     eax, CodeSectionCRC
  27. .text:6900BC17                 not     ecx
  28. .text:6900BC19                 cmp     ecx, eax
  29. .text:6900BC1B                 jz      short loc_6900BC28
  30. .text:6900BC1D                 push    10h
  31. .text:6900BC1F                 push    0Eh
  32. .text:6900BC21                 push    7
  33. .text:6900BC23                 jmp     ErrorMessage
  34. .text:6900BC28
  35. .text:6900BC28 loc_6900BC28:


Дальше проверка установлен ли драйвер защиты, поиск диска по метке "COSSACKS_A" и чтение случайных данных, проверка CDKey и загрузка с файла protect.dll каких то данных в выделенную память.

А вот дальше начинается какая то фигня. Вызывается _DllDispatch. Чето она там делает и "циклится" на коде:
Code:
  1. .text:69001117                 mov     eax, [edi+8]
  2. .text:6900111A                 add     eax, [edi+10h]
  3. .text:6900111D                 mov     edx, [edi+0Ch]
  4. .text:69001120                 movzx   ecx, byte ptr [eax+1]
  5. .text:69001124                 mov     ecx, [edi+ecx*4]
  6. .text:69001127                 movzx   ebp, byte ptr [eax+4]
  7. .text:6900112B                 lea     ecx, [ecx+ebp*4]
  8. .text:6900112E                 movzx   ebx, byte ptr [eax]
  9. .text:69001131                 mov     ebx, [edi+ebx*4]
  10. .text:69001134                 movzx   ebp, byte ptr [eax+3]
  11. .text:69001138                 lea     ebx, [ebx+ebp*4]
  12. .text:6900113B                 movzx   esi, byte ptr [eax+2]
  13. .text:6900113F                 mov     esi, [edi+esi*4]
  14. .text:69001142                 movzx   ebp, byte ptr [eax+5]
  15. .text:69001146                 lea     esi, [esi+ebp*4]
  16. .text:69001149                 mov     ecx, [ecx]
  17. .text:6900114B                 add     ecx, [esi]
  18. .text:6900114D                 mov     [ebx], ecx
  19. .text:6900114F                 add     dword ptr [edi+10h], 6
  20. .text:69001153                 add     edx, [edi+14h]
  21. .text:69001156                 mov     dword ptr [edi+14h], 0
  22. .text:6900115D                 jmp     edx


Этот кусок я пробовал трассировать, но он постоянно прыгает на свое начало. Однако, если запустить процесс, то вылазит сообщение "диск не найден", т.е. как то он все-таки выходит из цикла. Я пробовал ставить бряк на выход из _DllDispatch, но это закончилось отказом системы. Позже практика показала, что совершенно не важно где стоит бряк и сработает он или нет. Пробовал аттачится к процессу после сообщения, но тогда Olly просто висит и ничего не происходит. В общем тут затык. Куда смотреть, куда копать?

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


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 сентября 2013 15:55
· Личное сообщение · #2

пиши свиноводу



Ранг: 22.5 (новичок), 18thx
Активность: 0.050
Статус: Участник

Создано: 21 сентября 2013 17:51
· Личное сообщение · #3

Вы смотрите слишком старую версию стара, сейчас актуальная 5.7.xx. Все очень сильно поменялось

Как вариант погуглить статьи от Yasuichi Kitamura или свиновода




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

Создано: 21 сентября 2013 18:10
· Личное сообщение · #4

[Nomad] пишет:
Вы смотрите слишком старую версию стара, сейчас актуальная 5.7.xx. Все очень сильно поменялось

Кабы-чё ляпнуть....
[Nomad] пишет:
Как вариант погуглить статьи от Yasuichi Kitamura или свиновода



Immortal Pony пишет:
Вызывается _DllDispatch. Чето она там делает и "циклится" на коде

Это VM StarForce.

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




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 21 сентября 2013 18:14
· Личное сообщение · #5

reversecode пишет:
пиши свиноводу

Сам себе? хотя у него мания величия, сам к себе в основном и обращается.



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

Создано: 21 сентября 2013 19:00
· Личное сообщение · #6

[Nomad] пишет:
Вы смотрите слишком старую версию стара, сейчас актуальная 5.7.xx. Все очень сильно поменялось

Не сомневаюсь, но защита вызывает лишь академический интерес, для расширения кругозора, так сказать, поэтому раз уж начал, не буду хвататься за все подряд.
[Nomad] пишет:
погуглить статьи от Yasuichi Kitamura или свиновода

Нашел статью "Распаковка StarForce: King’s Bounty". Опять же, распаковка. Два раза нажмите эту кнопку, один раз ту и еще вот эту, потом запустите скрипт - все, вы восхитительны. О работе защиты практически ни слова.
Свиновода нашел только --> это <--. Блог у него, конечно, огонь. Просмотрел по диагонали, самое внятное только восстановление импорта вручную, но это было еще тогда в статье by ASMax. Про дамп мне не интересно.
ClockMan пишет:
Это VM StarForce.

Я так понимаю VM это некий интерпретатор псевдокода. Где-нибудь можно взглянуть на примеры практической реализации разбора такого псевдокода?



Ранг: 22.5 (новичок), 18thx
Активность: 0.050
Статус: Участник

Создано: 21 сентября 2013 19:37
· Личное сообщение · #7

ClockMan пишет:
[Nomad] пишет:
Вы смотрите слишком старую версию стара, сейчас актуальная 5.7.xx. Все очень сильно поменялось
Кабы-чё ляпнуть....

Чет я не понял сути наезда. Стар на Казаках и стар сейчас совершенно разные.

И статьи я указал которые доступны в паблике. Где юморина ?



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

Создано: 22 сентября 2013 12:43
· Личное сообщение · #8

На казаках кажется 3й стар был, а то и 2й (на самых первых версиях?). Поддержу [Nomad], версии 3.x и 5.x это не одно и то же



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

Создано: 22 сентября 2013 20:51
· Личное сообщение · #9

Тихо сам с собой продолжаю разбор интерпретатора байткода.

Code:
  1. .text:6900BE30                 pusha
  2. .text:6900BE31                 pushf
  3. .text:6900BE32                 lea     ebp, [esp+24h]
  4. .text:6900BE36                 sub     esp, 1004h
  5. .text:6900BE3C                 mov     edi, esp
  6. .text:6900BE3E                 xor     eax, eax
  7. .text:6900BE40                 mov     ecx, 400h
  8. .text:6900BE45                 rep stosd
  9. .text:6900BE47                 mov     edi, esp
  10. .text:6900BE49                 lea     ecx, unk_691A9720       ;пока неизвестные данные
  11. .text:6900BE4F                 mov     [edi+3C0h], ecx
  12. .text:6900BE55                 mov     [edi+3C8h], ebp
  13. .text:6900BE5B                 call    sub_69001000      ;дальнейшая инициализация контекста
  14. .text:6900BE60                 add     esp, 1004h
  15. .text:6900BE66                 popf
  16. .text:6900BE67                 popa
  17. .text:6900BE68                 lea     esp, [esp+4]
  18. .text:6900BE6C                 retn

Тут все просто. Сохраняем регистры, флаги, в ebp вершину стека до входа в _DllDispatch, выделяем память на стеке и полностью обнуляем под контекст ВМ.

Выделенная память условно разбивается на 2 страницы. Пока достоверно неизвестно зачем, но предполагаю что первая страница - непосредственно контекст ВМ, а вторая под код и данные.
Code:
  1. .text:69001000                 mov     eax, edi
  2. .text:69001002                 mov     [edi], eax            ;адрес первой страницы
  3. .text:69001004                 add     eax, 400h
  4. .text:69001009                 mov     [edi+4], eax      ;адрес второй страницы
  5. .text:6900100C                 lea     ebx, unk_691A9BE4       ;адрес байткода
  6. .text:69001012                 mov     [edi+8], ebx
  7. .text:69001015                 lea     ebx, loc_69001117       ;адрес основного обработчика байткода handler0
  8. .text:6900101B                 mov     [edi+0Ch], ebx
  9. .text:6900101E                 add     eax, 400h
  10. .text:69001023                 sub     eax, ebx
  11. .text:69001025                 mov     [edi+18h], eax          ;пока не ясно


Далее происходит заполнение второй страницы контекста константами 1,...0F, 10,...,F0, ... , 10000000,...,F0000000. Позже из них будет сгенерирован недостающий код ВМ.
Code:
  1. .text:69001028                 std
  2. .text:69001029                 push    edi
  3. .text:6900102A                 add     edi, 5DCh
  4. .text:69001030                 mov     ecx, 8
  5. .text:69001035 loc_69001035:
  6. .text:69001035                 push    ecx
  7. .text:69001036                 mov     ebx, ecx
  8. .text:69001038                 dec     ebx
  9. .text:69001039                 mov     ecx, 0Fh
  10. .text:6900103E loc_6900103E:
  11. .text:6900103E                 push    ecx
  12. .text:6900103F                 mov     eax, ecx
  13. .text:69001041                 mov     ecx, ebx
  14. .text:69001043                 shl     ecx, 2
  15. .text:69001046                 shl     eax, cl
  16. .text:69001048                 stosd
  17. .text:69001049                 pop     ecx
  18. .text:6900104A                 loop    loc_6900103E
  19. .text:6900104C                 pop     ecx
  20. .text:6900104D                 loop    loc_69001035
  21. .text:6900104F                 pop     edi
  22. .text:69001050                 cld
  23. .text:69001051                 jmp     loc_69001117


И вновь основной обработчик байткода handler0
Code:
  1. .text:69001117                 mov     eax, [edi+8]               ;адрес начала блока байткода
  2. .text:6900111A                 add     eax, [edi+10h]                  ;смещение относительно начала блока
  3. .text:6900111D                 mov     edx, [edi+0Ch]
  4. ;извлечение данных из байткода. сперва индекс страницы, затем индекс регистра
  5. .text:69001120                 movzx   ecx, byte ptr [eax+1]
  6. .text:69001124                 mov     ecx, [edi+ecx*4]
  7. .text:69001127                 movzx   ebp, byte ptr [eax+4]
  8. .text:6900112B                 lea     ecx, [ecx+ebp*4]
  9. .text:6900112E                 movzx   ebx, byte ptr [eax]
  10. .text:69001131                 mov     ebx, [edi+ebx*4]
  11. .text:69001134                 movzx   ebp, byte ptr [eax+3]
  12. .text:69001138                 lea     ebx, [ebx+ebp*4]
  13. .text:6900113B                 movzx   esi, byte ptr [eax+2]
  14. .text:6900113F                 mov     esi, [edi+esi*4]
  15. .text:69001142                 movzx   ebp, byte ptr [eax+5]
  16. .text:69001146                 lea     esi, [esi+ebp*4]
  17. .text:69001149                 mov     ecx, [ecx]
  18. .text:6900114B                 add     ecx, [esi]
  19. .text:6900114D                 mov     [ebx], ecx
  20. .text:6900114F                 add     dword ptr [edi+10h], 6  ;увеличиваем смещение
  21. ;переход на другой обработчик возможен только если в [edi+14h] будет смещение отностильно handler0
  22. .text:69001153                 add     edx, [edi+14h]
  23. .text:69001156                 mov     dword ptr [edi+14h], 0
  24. .text:6900115D                 jmp     edx


Что мне это дало:
Code:
  1. vCtx     struct
  2.          MemPage0                        dword ?
  3.          MemPage1                        dword ?
  4.          pCode               dword ?
  5.          VMHandler0                  dword ?
  6.          Ip                    dword ?
  7.          nextHandlerOffset         dword ?
  8. vCtx     ends
  9.  
  10. handler0_pCode    struct
  11.          destPageIndex       db ?
  12.          src1PageIndex       db ?
  13.          src2PageIndex       db ?
  14.          destRegIndex         db ?
  15.          src1RegIndex         db ?
  16.          src2RegIndex         db ?
  17. handler0_pCode    ends
  18.  
  19. .while TRUE
  20.          mov     ebx, [edi].pCode
  21.          add     ebx, [edi].Ip
  22. assume ebx:ptr handler0_pCode
  23.          movzx eax, [ebx].src2RegIndex
  24.          push eax
  25.          movzx eax, [ebx].src2PageIndex
  26.          push eax
  27.          movzx eax, [ebx].src1RegIndex
  28.          push eax
  29.          movzx eax, [ebx].src1PageIndex
  30.          push eax
  31.          movzx eax, [ebx].destRegIndex
  32.          push eax
  33.          movzx eax, [ebx].destPageIndex
  34.          push eax
  35.          push offset Handler0Log
  36.          push offset strBuffer
  37. call wsprintf
  38.          lea esp, [esp + 8 * sizeof dword]
  39.          push 0
  40.          mov ecx, esp
  41. invoke WriteFile, hLog, offset strBuffer, eax, ecx, NULL
  42.          lea esp, [esp + 4]
  43.          .break .if [ebx].destPageIndex == 0 && [ebx].destRegIndex == 5
  44. assume ebx:nothing
  45.          add     [edi].Ip, 6
  46. .endw


Пока это все. В аттаче лог работы ВМ до перехода handler0 на расшифрованный другой обработчик.

b394_22.09.2013_EXELAB.rU.tgz - Log.txt


 eXeL@B —› Вопросы новичков —› Исследование игры "Казаки - последний довод королей" [StarForce]
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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