Грин, Грин у меня тут игрушка
прикольная, прикольная.
Но без 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