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