Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Ещё раз об играх от Reflexive Arcade

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: Jilic <jilic@mail.ru>



Жертва(ы): Защита игр от Reflexive Arcade
Оружие: Olly Debugger v1.10 + ODbgScript plugin v1.65.1
Способ убийства: Пропатчивание


Вступление.

На эту тему написано уже несколько статей. Однако, способ, о котором будет идти речь, является, на мой взгляд, самым простым и подходит для взлома всех игр от Reflexive Arcade (работало на всех играх от Reflexive Arcade, которые у меня были).
Последовательность в этот раз будет такой: сначала взломаем игру, а потом попытаемся автоматизировать процесс.
Подопытным в этот раз будет Hyperballoid Complete.

Часть I. Непосредственно сам взлом.

Запускаем игрушку (сразу под отладчиком) и видим, что она, увы, не бесплатна, и нам отмерено только 60 минут игры. Гамаем пока не кончится время.(Чтобы ускорить это можно создать в папке с игрой файл "ExpireIn10.txt").
После того как наше время истекло,нам не забывают напомнить, что за все надо платить. Опытным программерским взглядом замечаем, что наша гама свернута, но не закрыта(!) и на переднем плане висит наг, с напоминанием что игра не бесплатна. При попытке развернуть игру, её опять нагло сворачивают и показывают нам наг (фак). Чтож, исправим это.
Делаем предположение, что разработчики для этого использовали функцию ShowWindow.
Перезапускаем подопытную гаму под отладчиком, и, сделав следующее: Search for/ All intermodular calls, отсортируем список по алфавиту и прокрутим до интересующей нас ShowWindow. Видим, что таких функций всего три. Дважды щелкаем по первой, и, что же мы видим, а видим мы последовательность таких функций:ShowWindow, SetForegroundWindow, BringWindowToTop:


00403AAF   6A 01          push    1                                	
00403AB1   FF35 68284200  push    dword ptr ds:[422868]            	; hWnd = NULL
00403AB7   85C0           test    eax, eax                         	 
00403AB9   0F9545 FF      setne   byte ptr ss:[ebp-1]              	
00403ABD   FF15 38A24100  call    near dword ptr ds:[<&USER32.Show>	; ShowWindow
00403AC3   FF35 68284200  push    dword ptr ds:[422868]            	; hWnd = NULL
00403AC9   FF15 F0A14100  call    near dword ptr ds:[<&USER32.SetF>	; SetForegroundWindow
00403ACF   FF35 68284200  push    dword ptr ds:[422868]            	; hWnd = NULL
00403AD5   FF15 40A24100  call    near dword ptr ds:[<&USER32.Brin>	; BringWindowToTop

Очевидно, что именно так загрузчик (то, что мы запускаем - по сути загрузчик файла с расширением RWG или, как назвали его сами разработчики wrapper - то есть оболочка) скрывает гаму когда время, отпущенное нам, истекло. Проверим это, поставив точку останова на эту ShowWindow или в любое место в процедуре, в которой находится последовательность ShowWindow, SetForegroundWindow, BringWindowToTop, и запустив игру. Через пару минут игры, после того как время вышло, брякнемся на на нашей точке останова :).
Итак, что можно сделать? На мой взгляд, лучше всего перепрыгнуть все это насилие над окнами.
Прокручиваем вверх и чуть выше GetWindowRect видим такое место:

00403A77   8BF8           mov     edi, eax
00403A79   3BFB           cmp     edi, ebx
00403A7B   74 26          je      short game.00403AA3
00403A7D   385E 14        cmp     byte ptr ds:[esi+14], bl

Вот этот джамп между двумя кмп - как раз самое оно :). С него то мы и прыгнем на конец процедуры, а точнее не на конец а на команду, которая следует сразу после call MoveWindow:


00403B64   FF15 50A24100  call    near dword ptr ds:[<&USER32.Move>	; MoveWindow
00403B6A   5F             pop     edi                              	; Сюда будем прыгать
00403B6B   5E             pop     esi                              	
00403B6C   5B             pop     ebx                              	
00403B6D   C9             leave
00403B6E   C3             retn

По адресу 00403A7B меняем je 00403AA3 на jmp 00403B6A.
Выделяем это место, потом Copy to executable/Selection и сохраняем изменения.
Теперь временных ограничений нет и играть можно сколько влезет, однако при запуске нам все же напоминают, что гама не бесплатна. Исправим и это :).

Мы знаем, что game.exe – это загрузчик(оболочка), а сама игра находится в game.RWG,чтобы запустить её загрузчик сначала открывает game.RWG с помощью CreateFileA,поэтому поставим бряк на CreateFileA (перезапускаем игру под отладчиком, запускаем её по F9, после чего ставим бряк), чтобы отловить нажатие на кнопку «Play Game». Остановившись на бряке, поднимемся на несколько уровней выше (т.е. поднимаемся на начало процедуры, из которой вызывается CreateFileA,переходим на то место из которого вызывается эта процедура и т.д.) до такого места:


00404ACA   E8 341D0000    call    game.00406803
00404ACF   84C0           test    al, al
00404AD1   74 0E          je      short game.00404AE1		          ;этот переход надо занопить
00404AD3   8BCE           mov     ecx, esi
00404AD5   E8 0BE9FFFF    call    game.004033E5
00404ADA   68 B7444000    push    game.004044B7
00404ADF   EB 1C          jmp     short game.00404AFD
00404AE1   D946 18        fld     dword ptr ds:[esi+18]
00404AE4   D81D A4A24100  fcomp   dword ptr ds:[41A2A4]
00404AEA   DFE0           fstsw   ax
00404AEC   F6C4 41        test    ah, 41
00404AEF   75 07          jnz     short game.00404AF8
00404AF1   68 CB3C4000    push    game.00403CCB
00404AF6   EB 05          jmp     short game.00404AFD
00404AF8   68 44414000    push    game.00404144
00404AFD   8BCE           mov     ecx, esi                          	
00404AFF   E8 30E8FFFF    call    game.00403334                     	           
00404B04   8D85 ACFEFFFF  lea     eax, dword ptr ss:[ebp-154]
00404B0A   50             push    eax                               	 
00404B0B   68 3CCE4100    push    game.0041CE3C                          ; FileName = "ExpireIn10.txt"
00404B10   FF15 A0A04100  call    near dword ptr ds:[<&KERNEL32.Fin>     ; FindFirstFileA


(!)В следующий раз это место можно найти поиском строки «ExpireIn10.txt»

По адресу 00404AD1 меняем je 00404AE1 на две команды nop.
Сохраняем изменения. Все! Теперь у игры остутствуют все признаки шароварности.

Часть II. Автоматизация взлома с помощью скрипта
Так как, данный способ претендует на звание универсального, для взлома защиты игр от "RA", автоматизируем взлом с помощью скрипта.

Сам скрипт:

/*
|-------------------------------------------------|
|_Reflexive_Arcade_Crack_ script written by Jilic |
|						  |
|jilic@mail.ru					  |
|-------------------------------------------------|
|Скрипт для ODbgScript plugin v1.65.1.		  |
|-------------------------------------------------|
|Скрипт предназначен для автоматизации взлома	  |
|защиты игр от "Reflexive Arcade".		  |
|-------------------------------------------------|
|Протестировано под OllyDbg v1.10 на следующих	  |
|играх:						  |
|Hyperballoid Complete				  |
|Azada						  |
|Dream Day Wedding 2				  |
|Feelers					  |
|JewelQuestIII					  |
|Mortimer Beckett And The Secrets Of SpookyManor  |
|-------------------------------------------------|
|После того как скрипт отработал выделите всю	  |
|секцию кода и сохраните изменения.		  |
|-------------------------------------------------|
*/
  var addr
  var codebase
  mov codebase,401000
  find codebase,#7426385E14750B8D46045057FF15# 	 
  mov addr,$RESULT
  cmp addr,0
  je err
  mov [addr],EAE9
  add addr,4
  mov [addr],0B7500
  find codebase,#740E8BCEE8????FFFF68????4000EB1CD94618#
  mov addr,$RESULT
  cmp addr,0
  je err
  mov [addr],CE8B9090
  msg "Скрипт удачно отработал! Теперь выделите всю секцию кода и сохраните изменения"
  ret
err:
  msg "Ашипко!! Возможно эта игра не от "Reflexive Arcade"!"
  ret


А теперь подробные комментарии:

find codebase,#7426385E14750B8D46045057FF15# 

ищем такую последовательность:
je xxx
cmp byte ptr ds:[esi+14], bl
jnz xxx
lea eax, dword ptr ds:[esi+4]
push eax
push edi
call xxx

mov addr,$RESULT
cmp addr,0
je err

если находим - продолжаем, если нет - то:

err:
msg "Ашипко!! Возможно эта игра не от "Reflexive Arcade"!"
ret

предполагаем, что игра не от "Reflexive Arcade"

mov [addr],EAE9
add addr,4
mov [addr],0B7500

патчим нужные байты

find codebase,#740E8BCEE8????FFFF68????4000EB1CD94618#

Теперь ищем такую последовательность:
je xxx
mov ecx, esi
call yyy
push zzz
jmp ccc
fld dword ptr ds:[esi+18]

mov [addr],CE8B9090
msg "Скрипт удачно отработал! Теперь выделите всю секцию кода и сохраните изменения"
ret

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


P.S.
Данный способ подходит для взлома защиты большинства игр от Reflexive Arcade, в которых используется RWG-файл.
Да, этот прием может показаться неправильным, так как мы устранили не причину а следствие, но мы сделали это затратив минимум услилий и добившись своей цели. Причем способ этот является довольно "гуманным", так как мы пропатчили только загрузчик, что никак не сказывается на работоспособности игры.




Обсуждение статьи: Ещё раз об играх от Reflexive Arcade >>>


Комментарии к статье: Ещё раз об играх от Reflexive Arcade

Spirit 19.09.2008 06:47:12
ИМХО лучше анврапнуть по человечески, а это джедайский метод.
---
Soft_Ice 25.09.2008 20:16:01
После унвраппера от АРтим , который запросто берет любые билды Рефлекса, какой смысл что-то там еще ковырять ? Хотя познавательно, ИМХО.

" Играть, пока не кончиться триал" - Это еще что за мазохизм ? А ключи реестра, где в Хексе прописано это самое время - разве трудно исправить за секунду...?
Обязательно играть час - а если надо сломать 100 игр ?
---
Jilic 26.09.2008 07:59:39
2Soft_Ice:
ну во-первых не час а чуть меньше минуты (из-за "ExpireIn10.txt"), и это только в целях ознакомления для первого взлома.
а во-вторых "если надо сломать 100 игр", я для этого написал скрипт.
---
FrenFolio 04.10.2008 21:13:16
Скрипт пашет, молоток. А вобще статья нормальная, че вы тут напали на чела. Есть по анврапу уже (динамическому) статья, зачем еще одна?
---
Gideon Vi 05.10.2008 08:47:33
забавный подход, творческий. Одобряем
---
Vovan666 05.10.2008 23:55:27
Однако после такого патча на играх выпущенных (не выложенных, а разработанных), триал так и останется. Также как и после всяких анвраперов.
---
SReg 09.10.2008 04:25:16
Все реально работает! И статья хорошая.Спасибо!
---
Soft_Ice 27.10.2008 14:27:16
>>>>Однако после такого патча на играх выпущенных (не выложенных, а разработанных), триал так и останется.

Такие игры я ломал так -

1) Reflexive.dll - загоняется 1 в функцию Is Purchased

2) Exe - пропатчиваем проверку на CRC и целостность dll ( там в самом начале идет)

И все работает.

---
Jimbo77 20.01.2009 05:57:08
Хороший туториал, все доходчиво и понятно. Для новичков в самый раз. Автору респект.
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS