![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Как оказалась игра тупо проверяет все диски на наличие 1-го файла:
%c:\Data\MACAnodes.m3a (%c - буква (формат-строка из C) диска, от A до Z) Причём, ни размер ни чтобы то ни было, больше не проверяется. Сейчас сделал банальный No-CD: InstallDrive.bat: CODE @echo off md Data cls > "Data\MACAnodes.m3a" subst Z: . cls UnInstallDrive.bat: CODE @echo off subst Z: /D del "Data\MACAnodes.m3a" rd Data cls Бесспорно, это лучше чем 604 мегабайта на жёстком диске или жужжание CD при запуске, но хотелось бы, так сказать, "поправить один байт" и всё. Увы, игра оказалась очень замороченной: 1) В игре два файла в \MYST III - Exile\Bin\ на которые нужно обратить внимание: M3R.exe (465.920 байт) Inst.dat (26.112 байт) 2) Файл Inst.dat содержит в начале "UPX0", ".hole", затем "rsrc" (стандартная для Win32 приложений). 3) M3R.exe написан то ли на Delphi, то ли на Builder и в конце содержит сплошной мусор, который в своём хвосте, в свою очередь, содержит всякие ссылки на .DLL и экспортируемые оттуда функции (типа DirectDrawCreate). Кстати - в Inst.dat в конце - тоже самое. 4) Что происходит при запуске игры - файла M3R.exe: а) запускается M3R.exe б) читает с диска Inst.dat в память как "спящий" процесс в) добавляет в него тот самый мусор из хвоста файла M3R.exe и получает полноценную программу г) "отпускает" спящий процесс Inst.dat на выполнение и M3R.exe завершает свою работу д) Inst.dat, в свою очередь, распаковывается и начинает работать Мне удалось на шаге д) "присосаться" через OllyDbg32 к процессу Inst.dat и дампнуть его. Оттуда я и узнал (там уже было всё распаковано) про проверку файла "%c:\Data\MACAnodes.m3a" на диске. Сделать нормальный No-CD мешает именно такая странная разбивка файла - я пустил M3R.exe под IDA, даже нашёл место, где оно склеивает всё в одно, загружает процесс "спящим", но так и не смог разобраться, в какое именно место нужно было "вклеить" хвост из M3R.exe и с какого места хвост брать. По хорошему, что нужно сделать: 1) Inst.dat + хвост из M3R.exe = Inst.exe 2) Если это и правда UPX - то распаковать 3) Пустить под дизассемблером и найти нужное место, поправить 1(2) байт(а) 4) Запаковать всё обратно 5) Посмотреть, чем различаются обычный Inst.exe и тот, что мы снова перепаковали - там различие должно быть, максимум, в 10 байтах. 6) Найти эти байты в M3R.exe в хвосте и сделать нормальный .CXP No-CD. А данном алгоритме я сразу сел на шаге 1) ибо не знаю куда в нутрях Inst.dat вставлять кусок и как его вытаскивать из M3R.exe Кто-нибудь хочет помочь или обойдёмся .BAT файлами?.. |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Понимаю, что 16 лет спустя оно вряд ли кому-то нужно, но я случайно нашёл эти файлы у себя на жёстком диске и решил дожать, да и интересно было что там. И хотя No-CD исполняемый файл подходит и от английской версии v1.22, но всё же в русской было начальное окно с настройками переведено - немного, но всё же. Сразу скажу, что проверять мне не на чем, ибо игры нет, только "Inst.dat" и "M3R.EXE" остались. Если кто-нибудь проверит на русской версии, то буду благодарен.
Исполняемый файл собрал достаточно быстро, больше времени ушло на восстановление минимальных заголовков UPX, чтобы родным упаковщиком можно было распаковать. PE Explorer подсказал часть данных, часть подсмотрел из исходных кодов UPX версии 1.25 (использовался для сжатия, из веб архива качал), часть подсмотрел под отладчиком. Самое главное - правильно указать размер упакованных (они меньше, чем блок данных, ибо в конце код распаковщика) и распакованных данных (можно подсмотреть под отладчиком после функции распаковки, при условии, что размер упакованных указан правильно). Сама программа с исходными кодами на C: buildm3r.zip QUOTE Myst III: Exile - Russian version executable builder + No-CD © CTPAX-X Team 2022 http://www.CTPAX-X.org/ 1. Установить игру на полной установке. 2. Скопировать в каталог, где находятся файлы "M3R.exe" и "Inst.dat", программу "BuildM3R.exe" и запустить. 3. Должен получиться файл "M3R_FULL.EXE" который нужно распаковать при помощи UPX https://upx.github.io/ upx.exe -d M3R_FULL.EXE 4. После этого в распакованном файле "M3R_FULL.EXE" нужно заменить следующие байты, чтобы сделать No-CD: Смещение: было стало 0006434E: 75 EB 000643A4: 3F 00 5. После этого, по идее, всё должно работать. Если всё будет нормально, то файл "M3R.exe" можно удалить и переименовать в него "M3R_FULL.EXE". Я таки нашёл какой версией UPX игра была сжата - 1.00. При распаковке-упаковке получается точно такой же исполняемый файл, кроме текста копирайтов в заголовке. Но даже если распаковать, поменять два байта и запаковать назад, то разница будет в огромном количестве байт. Увы, тут сжатие не RLE и не LZSS/LZX, так что изменением пары байт не обойтись. Добавлено: О!!! До меня дошло, там же UPX - значит его можно прямо в памяти менять! Может кто-нибудь проверить, у кого игра есть, такую штуку - в оригинальный файл "M3R.exe" по смещению 00071A93 записать следующие 19 (7 + 7 + 5) байт (первые 5 байт будут не нули - это jmp OEP - здесь я его перенёс на последнюю команду): CODE C6 05 4E 43 46 00 EB; mov b,[0046434E], 0EBh Тогда, по идее, после распаковки программа сама себя пропатчит этим No-CD в памяти.C6 05 A4 43 46 00 00; mov b,[004643A4], 000h E9 DF 4F 41 00; jmp OEP |
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 19:38 |