Грин, Грин у меня тут игрушка
прикольная, прикольная.
Но без CD-ка не работает.

Сделай ЧТО-НИБУДЬ!!!!!!!

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

Пункт первый. Реестр и
конфигурационные файлы.

Бывают случаи когда и ломать то
ничего не надо, просто открываем реестр или
файлик в каталоге с игрой и видим нечто от чего
душа радуется. Ну типа CDPath. Меняем его и радуемся
жизни.

Для справки:

Пути где в реестре может лежать
информация о вашей игрушке:

HKEY_LOCAL_MACHINE\SOFTWARE\ НАЗВАНИЕ_ФИРМЫ_ПРОИЗВОДИТЕЛЯ\ НАЗВАНИЕ_ИГРЫ\
HKEY_CURRENT_USER\Software\ НАЗВАНИЕ_ФИРМЫ_ПРОИЗВОДИТЕЛЯ\ НАЗВАНИЕ_ИГРЫ\

Пункт два если первый
пункт не помог.

Ну если не помог значит
производители люди не дурные и надо что-то
делать.

Либо использовать эмулятор
либо ломать игру. Практически все эмуляторы
которые я видел работали по принципу, сделал
слепок диска (650 метров длинной), а потом его юзаю.
Не знаю как у вас а меня, на винте редко можно 650
метров свободных найти. Поэтому я пошёл другим
путем.

Пишем эмулятор CD-ROM(а) под MD.

Как известно по крайней мере не
мне одному, все мастдаевские программы работают
через функции API. И как я припоминаю для проверки
типа диска служит функция со странным названием
GetDriveType. Ну вот и находиться она в самом страшном
файле виндов KERNEL32.DLL. Ну что, кто-нибудь ломал
виндовс? А придется. Попробуем натравить на этот
KERNEL32.DLL какой-нибудь дизассемблер, я юзаю W32Dasm.
Если вам нравиться что-то другое я не возражаю.

В полученном листинге ищем
нужную фукцию: Functions/Exports потом из приведенного
списка выбираем GetDriveTypeA щелкаем два раза и
попадаем в следующий у участок кода:

Exported fn(): GetDriveTypeA - Ord:0168h
:BFF77917 57 push edi - делаем что-то важное
:BFF77918 6A21 push 00000021
:BFF7791A 2BD2 sub edx, edx
:BFF7791C 68671DFABF push BFFA1D67
:BFF77921 64FF32 push dword ptr fs:[edx]

......................... ..................

:BFF77939 83C408 add esp, 00000008
:BFF7793C 5F pop edi
:BFF7793D E942D3FFFF jmp BFF74C84 - переход в тело функции

Теперь будем разбираться, как
работает эта функция, для этого нам нужен
справочник по API функциям мастдая. Я лично
пользуюсь выдранным из Borland С. Посмотрим ага
находим:

UINT GetDriveType(LPCTSTR lpRootPathName);

Значитися функция взращает в eax
тип диска, имя которого ей передали.

Ага, а вот значится
возвращаемые значения:

 

Числовое значение
Строковый
эквивалент
Комментарий
0 - MD не смог
определить тип диска
1 - Диск не нашелся
2 DRIVE_REMOVABLE Типа дискета,
можно заменить
3 DRIVE_FIXED Типа винт
заменить нельзя
4 DRIVE_REMOTE Типа сетевой
5 DRIVE_CDROM Типа CD-ROM
6 DRIVE_RAMDISK Типа RAM-диск

Ясно, теперь будем работать (я
покажу как из винта сделать CD а если кто хочет
сделать его например из сетевого, то думаю, что он
и сам догадается как).

Переходим на команду

:BFF7793D E942D3FFFF jmp BFF74C84

И прыгаем в тело функции Execute Text
\ Execute Jump, или просто нажимаем стрелку вправо.

Попадаем сюда:

Referenced by a (U)nconditional or (C)onditional Jump at
Address:

|:BFF7793D(U)
|
:BFF74C84 55 push ebp
:BFF74C85 8BEC mov ebp, esp
:BFF74C87 81C4B0FDFFFF add esp, FFFFFDB0
…........................................................…

Посмотрел я на это и понял, что
черт здесь лапу сломит, ну или я зрение. Но можно
не расстраиваться, ломать, не строить. Так вот,
что бы передать программе, что этот диск является
винтом, функции нужно занести в eax 3, вот и будем
искать команду типа

mov eax 00000003.

У меня она нашлась в этом месте:

:BFF74DB6 B905000000 mov ecx, 00000005
:BFF74DBB F3 repz
:BFF74DBC A6 cmpsb
:BFF74DBD 7407 je BFF74DC6
:BFF74DBF B803000000 mov eax, 00000003 - нечто интересное!
:BFF74DC4 EB05 jmp BFF74DCB

Ну вот можно сказать и всё,
меняем mov eax, 00000003 на mov eax, 00000005, то есть B803000000 на
B805000000 и всё.

Записываем коды парочки
предыдущих и парочки следующих команд лезем в
шестнадцатеричный редактор, находим там эту
последовательность, пытаемся найти ее ещё раз,
если не нашли то не правим это место, если нашли
то записываем коды тройки предыдущих и тройки
следующих команд лезем в шестнадцатеричный
редактор, и т.д.

Итого мы поменяли один бай в
теле мастдая, а сколько получили выгод? 🙂

Ну а третий способ саму игрушку
сломать, но это уже тема отдельной статьи.

Green Mouse

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии