Pers.narod.ru. Тексты. Взлом DOS-игр - как это было

Разбирая архивы, натолкнулся на кучку старых файлов, оставшихся от эпохи взлома DOS-игр.

Поскольку сегодня права на все эти приложения и игры уже неактуальны, думаю, не нарушу никаких правил, написав несколько слов о практике взлома DOS-игр, распространённой вплоть до конца 90-х гг. Если это не так - прошу сообщить мне, чтобы я мог поправить эту статью. Надо сказать, что за взломом DOS-игр и сам я провёл не худшие часы молодости :)

Как правило, процесс происходил так.

1. Открыть в любом просмотровщике (F3 в Far'е) и посмотреть - не сжат ли исполняемый файл? Если да - разжать (в основном, нужны были diet.exe, pklite.exe или unlzexe.exe, что-то из них есть в этом архиве), а определить, какой именно утилитой сжат исполняемый файл, несложно было по его заголовку - метки вроде LZ91 рулили :)

2. Запустить
HIEW.exe filename.exe
(или HIEW.exe filename.com).

Имя файла при этом должно быть построено по правилам DOS (до 8 символов включительно, расширение - не более 3 символов включительно). Для длинных имён файлов нужно использовать их "короткие" аналоги или переименовывать.

Замечательный редактор hiew (так и расшифровывается - hacker's view) умел "на лету" показывать ассемблерный код исполняемых файлов, переданных ему параметром. Я пользовался вот этой (на самом деле, гораздо более ранней) версией, прекрасно работающей и в современных Windows: hiew.zip, 60 Кб.

Далее в hiew показываем 16-ричный код - клавиша F4, потом ассемблер - клавиша F3. Ассемблер тогда был 8- и 16-разрядным.

Находим нужный кусочек кода, который надо поправить (в hiew есть поиск по F7).

Переходим в режим редактирования клавишей F3, правим машинный код, сохраняем изменения по F9.

3. Главный вопрос - как найти нужные места в EXE-файле? Но этот "творческий" этап и есть собственно взлом :) Даже не зная ассемблера на уровне машинных кодов, сделать это было не так трудно, ведь в 99% случаев надо было отыскать некий декремент (например, уменьшающий число жизней в игре) и заменить его на пустую команду nop (машинный код 90). Код имеется в виду шестнадцатеричный, да в других crk-файлы и не пишут.

Но о crk-файлах - ниже, а пока вот моё сохранившееся описание N-летней давности о "проблеме взлома", правда, тут я речь вёл о поиске отладочных режимов, которые любили ставить в тогдашние движки разработчики от Apogee, ID Software и других подобных фирм.

В файле *.EXE найдена строка типа "Debugging codes are available..."

После дизассемблирования в файле *.lst будет виден адрес этой строки в виде SSSS:HHLL, где SSSS - шестнадцатиричный сегмент, HHLL - смещение. Есть смысл поискать с помощью HIEW в EXE-файле ссылку на эту строку в виде LL HH, т.е., например, 6A FF при адресе смещения FF 6A и т.д. Это может многое прояснить - например, выявить адрес переменной, которая служит флагом отладочного режима - в нее где-то пишется ноль или единица и т.д.

А вот это ближе к делу - составленная когда-то для себя "шпаргалка" по распространённым кодам декрементов:

Коды DEC'ов:
FF 0E XX XX		dec [0XXXX]		;!
FF 0F			dec [bx]
FF 49 XX		dec [bx][di] XX
FF 4A XX		dec [bp][si] XXXX
FF 4B XX		dec [bp][di] XXXX
FE 4C XX		dec [si][XXXX]
FF 89 XX XX		dec [bx][di][XXXX]
FF 8D XX XX		dec [di][0XXXX]
FF 8F XX XX		dec [bx][0XXXX]		;!

Наконец, выполненный взлом фиксировался в так называемом CRK-файле (обычно ему и впрямь давали расширение CRK).

Этот файл представлял собой последовательность строк в формате
16_ричное_смещение_в_файле: старый_байт новый_байт
т.е., просто перечень того, какие байты на какие нужно заменить для взлома. Входящая во все версии Windows консольная команда fc (files compare) до сих пор выводит побайтовые различия файлов именно в таком формате, если её запустить с ключом бинарного режима:
fc /b file1.ext file2.ext

Существовали утилиты автоматизированной обработки таких файлов, способные внести и отменить изменения в исполняемый файл нужной игры.

Мог CRK-файл содержать и дополнительную информацию о размере и дате изменения оригинального файла игры. После символа ; разрешалось писать комментарии.

Вот небольшая сохранившаяся часть "протоколов", многие из них мелькали на разных дисках, содержащих взломанные игры.

	Old   New
NETWARS.EXE (unpacked) : infinite life
00006A0C: FF 90
00006A0D: 0E 90
00006A0E: EC 90
00006A0F: 2A 90
00006B19: FF 90
00006B1A: 0E 90
00006B1B: EC 90
00006B1C: 2A 90
0000807A: FF 90
0000807B: 0E 90
0000807C: EC 90
0000807D: 2A 90

PARA.COM (16384 byte); Immortal game and no bombs;
00000014: 3C 90
00000015: 20 90
00000016: 74 EB ; No adapter checking
0000059E: 04 02 ; Main problems
00000A6A: 04 02
00000AAD: 04 02
00000B85: 04 02
00000BAC: 04 02
00000C21: 04 02

SEXONIX.EXE (74332 bytes, Date of file 13, May, 1994); Unlimited lives;
00009F0D: FF 90
00009F0E: 8F 90
00009F0F: A6 90
00009F10: 00 90

HUNTER.EXE:  Immortal player and unlimited shots
Packed size: 84303, LzExe 0.91, date 2 Apr 1991, time 6:45p
Unpacked size: 215536, see the alternations:
000040AC: 75 74	   ; If you set this byte only you get just unlimited shots
000044E6: 74 75    ; If you set this byte only you get just immortal player

NICKY2.EXE (56954 bytes, Date of file 15, July, 1993); 
Unlimited lives; Unlimited keys and screen resources (after you found first
one on the level)
00002B57: FE 90
00002B58: 4C 90
00002B59: 1D 90		; Dynamit
00002C70: FE 90
00002C71: 4C 90
00002C72: 1A 90		; Apple shot   
00002E75: FE 90
00002E76: 4C 90
00002E77: 1E 90		; Bomb
00005541: FE 90
00005542: 4C 90
00005543: 1F 90		; Keys
00007292: 75 EB		; Lives control

CDMAN2.EXE (35337 bytes, Unpacked);
Unlimited lives;
00007711: FF 90
00007712: 8F 90
00007713: 46 90
00007714: 02 90

RAIDEN.EXE (207968 bytes, Unpacked);
00002190: FE 90
00002191: 8C 90
00002192: 7B 90
00002193: 0D 90	; Bombs
0000486F: FE 90
00004870: 8C 90
00004871: 7A 90
00004872: 0D 90	; Life

COOLSPOT:
ZX.BUM	(20,May,1994,68976 bytes,unpacked)
0000A3F5: FF 90
0000A3F6: 0E 90
0000A3F7: 87 90
0000A3F8: 45 90
0000A480: FF 90
0000A481: 0E 90
0000A482: 87 90
0000A483: 45 90	; Life
00009C50: 01 00 ; Invulnerability

SLORDAX:
INC.EXE			2 Jan 1991	70,892, unpacked
000022F8:		FF		90	; Lives
000022F9:		0E		90
000022FA:		40		90
000022FB:		1E		90

MARIO.EXE				126,832, after deleting
					first 4096 bytes & UNLZEXE
00004830:		FF		90	; Lives
00004831:		8D		90
00004832:		18		90
00004833:		67		90

А вот этот взлом стоил мне, кажется, 16 часов бдения за 386-м компьютером :) Почему? Просто там не отменялся декремент, а изменялся адрес условного перехода глубоко в недрах кода.

;Superfrog

;Вы не поверите, но это был самый трудный crack если не в жизни,
;то за последние тринадцать месяцев

; Всегда получить шанс в лотерее: (Gamble)
00013774	 75	 EB
00013775  	 07 	 42

;Пароли уровней:

;Level 1.2  - 448745
;Level 1.3  - 327233
;Level 1.4  - 847566
;Level 2.1  - 700517
;Level 2.2  - 646900
;Level 2.3  - 259501
;Level 2.4  - 512198
;Level 3.1  - 519347
;Level 3.2  - 160158
;Level 3.3  - 685550
;Level 3.4  - 638667
;Level 4.1  - 626495
;Level 4.2  - 675586
;Level 4.3  - 951616
;Level 4.4  - 210424
;Level 5.1  - 890654
;Level 5.2  - 621038
;Level 5.3  - 464938
;Level 5.4  - 779296
;Level 6.1  - 188656
;Level 6.2  - 173309
;Level 6.3  - 641007
;Level 6.4  - 103546
;EndOfGame  - 976363 (return to start)

;PerS (pers@mail.ru), 1997

Пожалуй, программисты 1980-2000-х гг. - самое "социально дезадаптированное" поколение и социальная группа в истории Земли. Вплоть до середины XX в. однажды полученная профессия, знания и навыки могли кормить всю жизнь. Знания и даже "сверхнавыки", полученные нами, зачастую устаревали к моменту окончания института. Изменилась ли картина сейчас? По крайней мере, с распространения Windows 2000/XP и визуальных сред разработки после 2000-2002 г. ничего качественно нового не появляется :)

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz