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

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


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

Исследование защит игр от «REFLEXIVE ARCADE»

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

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

Автор: ZaZa <ZaZa_Best@mail.ru>

Цель: ВСЕ ИГРЫ ОТ REFLEXIVE ARCADE
Инструменты: OLLYDBG 1.10, HEX-редактор

ВСТУПЛЕНИЕ:
В один прекрасный весенний вечерок сел поиграть в игру от вышеназванного издателя. Игра была восхитительна, красива и захватывающе, но смущало лишь одно обстоятельство: всего 60 минут игры, которых, конечно же, мне и не хватило. Решил ковырнуть и посмотреть, из чего же на самом деле состоит их защита.
Информирован – значит защищен! Для начала погуглил на тему KEYGEN’a и нашел много разных вариаций. Но, для разных версий, разный KEYGEN! +) Значит, придется ковырять самому +)

НАЧАЛО:
Запускаем игрушку. Видим приветствие REFLEXIVE и просьбу зарегистрироваться! Нам это не надо… Кликаем на PLAY GAME и запускаем игрушку. Из под игры запускаем ДИПЕТЧЕРА ЗАДАЧ и внимательно вглядываемся в список процессов.
Замечаем некий процесс с расширением совсем не являющимся исполняемым!
ВНИМАНИЕ: если у вас процесса с сомнительным расширением нет, значит REFLEXIVE исправила метод запуска игр!!!!
Данный файл лежит в папке с игрой, заходим в папку с установленной игрой и ищем его! В папке ReflexiveArcade он и находится! Меняем расширение на исполняемое (EXE то есть), пробуем запустить – ничего не происходит! Выходим из папки (предварительно отменив переименование) и сразу бросается в глаза следующие два файла: ИГРА.EXE и рядом с ним же ИГРА.RWG. Пробуем изменить и ему расширение на исполняемое (ИГРА.RWG -> ИГРА_1.EXE). И что же мы видим? Иконку!!! Это уже хорошо! Запускаем его и… ничего… +( Будем копать дальше!

ИССЛЕДОВАНИЕ:
Открываем ИГРА_1.EXE в отладчике, видим беспорядочный набор команд и отпускаем программу на исполнение. Отладчик начнет грязно ругаться уже на второй – третьей команде! Это нехорошо!
Открываем ИГРА.EXE в отладчике и ставим бряк на CreateProccessA, отпускаем программу. Запускается оболочка REFLEXIVE, жмем на PLAY GAME и тут же останавливаемся там где нам и нужно было:


00401FF9  PUSH EAX                                			 	; /pProcessInfo
00401FFA  LEA EAX, DWORD PTR SS:[EBP-4C]         	 	; |
00401FFD  PUSH EAX                                			 	; |pStartupInfo
00401FFE  LEA EAX, DWORD PTR DS:[EDI+134]         	 	; |
00402004  PUSH EAX                                 			 	; |CurrentDir
00402005  PUSH EBX                              			 	; |pEnvironment => NULL
00402006  PUSH 4                                   			 	; |CreationFlags=CREATE_SUSPENDED
00402008  PUSH EBX                                 			 	; |InheritHandles => FALSE
00402009  PUSH EBX                                 			 	; |pThreadSecurity => NULL
0040200A  LEA EAX, DWORD PTR SS:[EBP-C4C]          		; |
00402010  PUSH EBX                                			 	; |pProcessSecurity => NULL
00402011  PUSH EAX                                 			 	; |CommandLine
00402012  PUSH DWORD PTR SS:[EBP+8]                	 	; |ModuleFileName
00402015  CALL DWORD PTR DS:[<&KERNEL32.CreateProc> 	; CreateProcessA
0040201B  PUSH DWORD PTR DS:[EDI+18]               		; /ProcessId
0040201E  PUSH EBX                                 				; |Inheritable => FALSE
0040201F  PUSH 1F0FFF                              				; |Access = PROCESS_ALL_ACCESS
00402024  CALL DWORD PTR DS:[<&KERNEL32.OpenProces>	; OpenProcess


Сначала создается процесс из файла ИГРА.RWG, затем он открывается, дальше идет проверка на открытие и чтение из процесса нескольких байт кода:


0040203B  PUSH ECX                                 				; /pBytesRead
0040203C  MOV DWORD PTR SS:[EBP-8], EBX            		; |
0040203F  PUSH DWORD PTR DS:[ESI]                  			; |BytesToRead
00402041  PUSH DWORD PTR DS:[ESI+8]                		; |Buffer
00402044  PUSH DWORD PTR DS:[ESI+4]                		; |pBaseAddress
00402047  PUSH EAX                                 				; |hProcess
00402048  CALL DWORD PTR DS:[<&KERNEL32.ReadProces>	; ReadProcessMemory


В командной строке вводим d BUFFER (вместо слова BUFFER вы должны ввести адрес буфера) и нажимаем ENTER. Выделяем первый байт, а затем в командной строке опять же вводим d BUFFER+BYTESTOREAD (снова меняем слова на адреса) и давим ENTER.
Жмем SHIFT и выделяем байт! Таким образом мы выделили всю прочитанную область памяти процесса. Копируем его в HEX-редактор в шестнадцатеричном виде, он нам еще понадобится (CRYPT.TXT)!
Смотрим дальше:


0040206A  /LEA ECX, DWORD PTR SS:[EBP-44C]
00402070  |CALL 0040114F
00402075  |MOV ECX, DWORD PTR DS:[ESI+8]
00402078  |MOV EDX, DWORD PTR SS:[EBP+8]
0040207B  |ADD ECX, EDX
0040207D  |SUB BYTE PTR DS:[ECX], AL
0040207F  |INC EDX
00402080  |CMP EDX, DWORD PTR DS:[ESI]
00402082  |MOV DWORD PTR SS:[EBP+8], EDX
00402085  JB SHORT 0040206A


Здесь идет расшифровка кода и перезапись в буфер +) Так вот почему не запускается! +)
После прогона по циклу мы видим, что буфер изменился! Это и есть правильный исполняемый код игры, поэтому копируем его в буфер обмена и вставляем во второе окно HEX-редактора (DECRYPT.TXT)!
Идем дальше:


0040209C  PUSH EAX                                 				; /pBytesWritten
0040209D  PUSH DWORD PTR DS:[ESI]                  			; |BytesToWrite
0040209F  PUSH DWORD PTR DS:[ESI+8]                		; |Buffer
004020A2  PUSH DWORD PTR DS:[ESI+4]                		; |Address
004020A5  PUSH DWORD PTR SS:[EBP-4]                		; |hProcess
004020A8  CALL DWORD PTR DS:[<&KERNEL32.WriteProce>	; WriteProcessMemory


Здесь происходит запись в процесс по адресу ADRESS, из буфера BUFFER, количеством байт BYTESTOWRITE. Запоминаем (записываем) все эти адреса.
После записи в процесс он отпускается на выполнение. И мы играем +).
Поэтому, для взлома игрушки нам нужно переписать криптованный код на декриптованный!
Для этого копируем двоичные коды из DECRYPT.TXT и вставляем по адресу ADRESS в ИГРА_1.EXE количеством байт BYTESTOWRITE. Для быстроты поиска, можно с помощью байтов из CRYPT.TXT найти начало нужного фрагмента!
Сохраняем полученный файл и запускаем! УРААА, получилось! Если нет – то читаем все заново, и пробуем!

ЗАКЛЮЧЕНИЕ:
REFLEXIVE ARCADE слишком мало внимания уделяет защите выпускаемых ей игр, поэтому и взлом становится проще и эффективнее! Лучше отучить игру обходится без наставлений с ее стороны, чем пользоваться KEYGEN’ом и каждый раз наблюдать ее оболочку после выхода из игры!

НЕТ НЕЛОМАЕМЫХ ИГР – ЕСТЬ ТРУДНОЛОМАЕМЫЕ И ЛЕГКОЛОМАЕМЫЕ +).

С Уважением, ZaZa!



Обсуждение статьи: Исследование защит игр от «REFLEXIVE ARCADE» >>>


Комментарии к статье: Исследование защит игр от «REFLEXIVE ARCADE»

ZaZa 20.05.2007 11:46:31
Также дело обстоит и с играми от ALAWAR Int. В корне папки игры есть файл GAME32.DLL, атрибуты HIDDEN SYSTEM! Он и есть запускаемый файл игры!
Если есть время - копните и его! У кого есть желание и прямые руки - напишите программку, которая бы автоматически делало все, что описано в этой статье!

GREET'S: CRACKLAB.RU, DOTFIX.NET, ByteH@nter, GURU.EXE, and more )
---
ZaZa 20.05.2007 18:25:39
Прошу извинения за досадную опечатку: в корне папки игр от ALAWAR лежит файл GAME32.IMG! Подробнее об играх от ALAWAR читайте на форуме...
---
Spirit 21.05.2007 07:20:44
Молоток, возьми на полке пирожок :)
А на счет проги, так уже есть куча анвраперов универсальный патчеров и т.д.
Но все равно спасибо.
---
Headerx 21.05.2007 19:58:48
004020A5 PUSH DWORD PTR SS:[EBP-4] ; |hProcess
004020A8 CALL DWORD PTR DS:[<&KERNEL32.WriteProce>
это ты специально?
хорошая статья

---
Nightshade 21.05.2007 21:25:22
помнится я рассказал тебе о Fresco Wizard с такой защитой ;-)
---
ZaZa 22.05.2007 10:45:54
Headerx:
НЕ ПОНЯЛ ТЕБЯ )

NightShade:
Я конечно не помню, но может быть.... Но такого ты мне точно сказать не мог! )))
---
SecurAdmin 22.05.2007 11:37:59
Отличная статья! Молодец!
5 баллов!
---
timson_666 22.05.2007 23:10:43
Статья отличная! Но вот для игры Clash N Slash (http://www.reflexive.com/ClashNSlash.html) она не подходит. После подобного снятия защиты, игра все равно просит регистрацию, причем уже сама. Если же использовать код активации для игр с www.reflexive.com, то игра получается полная.
---
SLV 23.05.2007 15:50:52
ппц =] написали бы про рег схему хотяб...
---
ZaZa 24.05.2007 10:07:50
SLV:
Если хочешь узнать про регистрацию, то скачай из инета любой KeyGen и просмотри алгоритм генерации регистрационного ключа!
А про регистрации могу сказать, что все хранится в реестре, по такому вроде бы пути:

SOFTWAREReflexiveArcadeХХХ, где ХХХ - трехзначное число.

В этой ветке лежит сам ключик, поэтому если хочешь сломать игру, то юзай бряк на функцию открытия ветки реестра ))
---
Freecod 26.05.2007 20:47:42
Написал как-то анврапер на все игры от рефлексива, заменив WriteProcessMemory в упомянутом выше месте на WriteFile. Потом обёртку на выполнение - она сама создаст распакованный файл =) Недавно наткнулся на игры, где вместо RWG есть ещё один exe. Даже не пришлось менять анврапер, рубашка сама всё делает. Но рефлексив это конечно мегабоянище.
---
ZaZa 29.05.2007 10:41:37
Freecod:
Выложил бы.... Всем бы наверное пригодилось бы )
---
fev 31.05.2007 13:37:16
"После прогона по циклу мы видим, что буфер изменился! Это и есть правильный исполняемый код игры, поэтому копируем его в буфер обмена и вставляем во второе окно HEX-редактора (DECRYPT.TXT)!"
Здесь можно было бы по подробнее... Что-то я не совсем понимаю, про что речь идёт.
И как мне "прогнать по циклу"? И где я увижу что он изменился?
И раз уж делал пример, мог бы и указать значения BUFFER, BYTESTOREAD, ADRESS из своего примера...
---
Freecod 01.06.2007 06:03:06
Забирайте кому нужно: Reflexive UnWrapper by Freecod
http://dump.ru/files/2/2050276839/
---
X0E-2003 01.06.2007 09:32:08
to fev используй зти инструменты:

FlexHEX 2.4
Odlydbg by TSRh

0040206A /LEA ECX, DWORD PTR SS:[EBP-44C]
00402070 |CALL 0040114F
00402075 |MOV ECX, DWORD PTR DS:[ESI 8]
00402078 |MOV EDX, DWORD PTR SS:[EBP 8]
0040207B |ADD ECX, EDX
0040207D |SUB BYTE PTR DS:[ECX], AL
0040207F |INC EDX
00402080 |CMP EDX, DWORD PTR DS:[ESI]
00402082 |MOV DWORD PTR SS:[EBP 8], EDX
00402085 JB SHORT 0040206A
...
ПОСЛЕ ПРОХОДА ЭТОГО ЦИКЛА у меня

0040203B PUSH ECX ; /pBytesRead
0040203C MOV DWORD PTR SS:[EBP-8], EBX ; |
0040203F PUSH DWORD PTR DS:[ESI] ; |BytesToRead
00402041 PUSH DWORD PTR DS:[ESI 8] ; |Buffer
00402044 PUSH DWORD PTR DS:[ESI 4] ; |pBaseAddress
00402047 PUSH EAX ; |hProcess
00402048 CALL DWORD PTR DS:[<&KERNEL32.ReadProces> ; ReadProcessMemory

ГДЕ buffer стоит такое значение: 00E40048 ставим на него курсор мыши.
Прибавь к нему 0094dd у меня BytesToRead - получишь конец блока. Вводишь команду в ODLYDBG -- d 00E40048 0094dd зажимаем SHIFT и нажимаем на конец блока, блок выделен. Теперь копируем этот блок в буффер - пр. кнопкой binary -> binary copy даем имя файлу DECRYPT.TXT

Затем находим в файле .RWG offset у меня был 9D23
Заходим в FLEXHEX
1. нажимаем CTRL G -> 9D23 -> ENTER
2. затем на EDIT -> select... -> поставь галочку на size -> вводим 9D44
3. после того как кусок кода выделен нужно вставить в него расшифрованный участок кода. Для этого нажмем на Edit -> Read/Write Data -> Import -> укажем расположение файла DECRYPT.TXT
4. В поле format выставим hex bytes
5. Нажимаем OK
6. Проверь обязательно длину файла она должна совпадать с оригинальным RWG
7. Если не совпадает значит ты где-то лишний байтик добавил или удалил.

УДАЧА! Да, и спасибо ZaZа за тутор!!!





---
ZaZa 01.06.2007 10:35:42
ДЛЯ ВСЕХ ТЕХ, КТО НЕ РАЗОБРАЛСЯ В ТОМ, КАК УСТРОЕНА ЗАЩИТА ИГР:
Видеоприложение: hччp://rapidshare.com/files/34569634/RefArcade.rar
---
X0E-2003 02.06.2007 09:01:40
to ZaZa - глянул твой видео-тутор - как то там муторно все, лучше не UltraEdit использовать, а FlexHex на мой взгляд намного быстрее - не нужно пробелы убирать, конвертировать при помощи сторонних программ. И выделение можно делать указав нужный offset len (длина)... Ну, а так вроде ничего... спс. за ролик!
---
pap 07.06.2007 18:44:22
Практически все игры от Refltxive, с которыми я сталкивался, можно открыть так:
exe-шник игры для проверки регистрации вызывает функцию HasTheProductBeenPurcased из DLL (забыл название DLL, но его просто найти). Она в ЕАХ возвращает 1 если игра зарегистрирована, и 0 - если нет. Ломается 5 минут. Удачи.
---
Dark-Elf 03.10.2007 19:59:18
Я как то попробовал поковырять зделал так как предложил pap но прога ещё и проверяет контрольную сумму всех файлов.
---
Blackdealer 19.11.2007 21:33:58
Простой лоадер, заменяющий radll_HasTheProductBeenPurchased и radll_GetUnlockCode, работает через MS detours

http://rapidshare.com/files/70850963/ra_loader.rar.html
---
DIMONE 16.05.2008 13:05:44
Все замечательно, только никак не могу получить значение buffer, подскажите как его наити???
---

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



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


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