![]() |
eXeL@B —› Вопросы новичков —› создание nocd для StarCraft |
Посл.ответ | Сообщение |
|
Создано: 14 августа 2006 05:59 · Личное сообщение · #1 |
|
Создано: 14 августа 2006 06:34 · Личное сообщение · #2 |
|
Создано: 14 августа 2006 10:09 · Личное сообщение · #3 |
|
Создано: 16 августа 2006 04:02 · Личное сообщение · #4 |
|
Создано: 16 августа 2006 07:31 · Личное сообщение · #5 |
|
Создано: 17 августа 2006 01:08 · Личное сообщение · #6 |
|
Создано: 18 августа 2006 13:53 · Личное сообщение · #7 Я сам новичок, но starcraft под рукой оказался, я сам лоадером загружаю (загружал ![]() Как этот лоадер работает понятия не имею, но увидев этот пост решил для интереса попробовать отучить от диска вручную. У меня starcraft оригинал + установленный сверху brood war запатченый до версии 1.10 (последний патч влом скачивать че-то многовато весит). Короче starcraft сильно хочет файл install.exe (он у меня в каталоге с игрой, точнее оба - и от SC и от BW). Поэтому в реестре к нему должен правильно путь быть прописан, значение "StarCD". Приступим... Грузим starcraft.exe в дебагере, открываем окно с api фунцкиями ( search for->names). Находим там getdrivetype, она вызывается в 2-ух местах идем к первому, попадаем сюды: 004668A7 |. FF15 04624E00 |CALL DWORD PTR [<&KERNEL32.GetDriveType>; \GetDriveTypeA 004668AD |. 83F8 05 |CMP EAX,5 004668B0 |. 0F85 83000000 |JNZ starcraf.00466939 SC проверяет все диски по очереди и сравнивает их с Cd-rom ( если не cdrom то прыгает дальше, потом обратно возвращается и подставляет следующий диск). Поэтому пока что это значение (5-cdrom) заменим на жесткий диск (3). Открываем hex редактор, меняем 5 на 3, пробуем запустить игру - нифига. Значит не единственная проверка, возвращаемся в дебаггер. Смотрим че там дальше происходит. Видим это: 004668C1 |. E8 AC200600 |CALL <JMP.&Storm.#501> 004668C6 |. 8D5424 24 |LEA EDX,DWORD PTR [ESP+24] 004668CA |. 68 04010000 |PUSH 104 004668CF |. 57 |PUSH EDI 004668D0 |. 52 |PUSH EDX 004668D1 |. E8 DE200600 |CALL <JMP.&Storm.#503> 004668D6 |. 8D4424 14 |LEA EAX,DWORD PTR [ESP+14] 004668DA |. 8D4C24 24 |LEA ECX,DWORD PTR [ESP+24] 004668DE |. 50 |PUSH EAX 004668DF |. 6A 03 |PUSH 3 004668E1 |. 68 E8030000 |PUSH 3E8 004668E6 |. 51 |PUSH ECX 004668E7 |. E8 06220600 |CALL <JMP.&Storm.#266> 004668EC |. 85C0 |TEST EAX,EAX 004668EE |. 74 49 |JE SHORT starcraf.00466939 Тут SC 3 раза обращается к storm.dll и чего-то там химичит, потом проверяет eax на 0, и если eax=0 то прыгает дальше (JE SHORT starcraf.00466939) ( там дальше идет цикл и все возвращается снова на getdrivetype, начинется проверка следующего диска). Следовательно игра за окончательной проверкой CD идет в эти самые 3 call'a на storm.dll. Ладно, идем в storm.dll по первому call'у, честно говоря я там ничего интересного не увидел и не понял че там происходит, поэтому идем по второму call'у. Там похоже как-то обрабатывается (заносится в память) предположительное место нахождения install.exe файла, толком не разобрал, ну да пофиг. По выходу из этого call'а в стеке видим 2 стринга "StarCD" и "C:\Install.exe". По ходу SC собирается искать сидюк в этом месте. Идем в последний call (CALL <JMP.&Storm.#266>), и попадаем в очень интересное место, проматываем немного вниз и видим там такие дела: 150198E7 FF15 00820315 CALL DWORD PTR [<&KERNEL32.GetDriveTypeA>; kernel32.GetDriveTypeA еще чуть ниже: 15019920 FF15 FC810315 CALL DWORD PTR [<&KERNEL32.GetVolumeInfo>; kernel32.GetVolumeInformationA и еще ниже: 15019957 FF15 F8810315 CALL DWORD PTR [<&KERNEL32.GetDiskFreeSp>; kernel32.GetDiskFreeSpaceA Короче близардцы тут конкретную проверку устроили. Ну трэйсим этот кусок прецедуры понемногу, естественно на всех проверках заваливаемся по полной( у нас ведь install.exe в корне диска C: даже нету). Смотрим ниже, после всех проверок идут такие строчки: 150199A8 8BC3 MOV EAX,EBX 150199AA 83E0 01 AND EAX,1 150199AD 896C24 10 MOV DWORD PTR [ESP+10],EBP 150199B1 894424 20 MOV DWORD PTR [ESP+20],EAX 150199B5 74 0B JE SHORT Storm.150199C2 150199B7 85ED TEST EBP,EBP 150199B9 75 07 JNZ SHORT Storm.150199C2 150199BB 6A 0F PUSH 0F 150199BD E9 8A010000 JMP Storm.15019B4C Тут идет опять проверка eax и если прокатывает то прыгаем дальше (JE SHORT Storm.150199C2) если нет то потом идет безусловный прыг на конец процедуры, ну и опять в итоге на начальный getdrivetype попадаем. Значит нам надо обязательно попробовать сделать этот прыг (JE SHORT Storm.150199C2). Этот прыжок дальше идет к функциям работы с файлом (install.exe открывается и считывается дальше). Запускаем storm.dll в хекс редакторе,находим это место и меняем JE на JMP (74 на EB). По идее теперь игра возможно запустится, но потом начнет ругаться и падать из-за ненайденого на диске C: install.exe и нам останется найти в дебагере соответствующее место и сказать SC чтобы он искал install exe не на C: а там где он прописан в реестре. Но вопреки моим ожиданиям игра не только запустилась, но и не стала ругаться на отсутствие install.exe на C: Я решил проверить шо происходит, SC теперь вобще перестал проверять наличие диска (даже не доходит до getdrivetype). Видимо он теперь где-то считывает значение StarCD из реестра и сразу же, забив на все проверки запускается. Можно конечно дальше потрейсить и узнать че да как, да время больше тратить не охота, то что нам было нужно - мы добились просто сменив один байт в storm.dll. Вот и все. ![]() |
|
Создано: 18 августа 2006 23:22 · Поправил: DillerInc · Личное сообщение · #8 sliderZ Неплохо,неплохо... ![]() Видимо в Diablo 2 (тоже Blizzard) помимо навешаного Securom'а такая же проверка используется,т.к. после снятия протектора игра всё равно требует диск(любой диск).Я тогда было начал копать,но,увидев,что концы уходят в библиотеки,подумал,что это будет не совсем корректно патчить ещё и их.Однако это вариант... ----- the Power of Reversing team ![]() |
|
Создано: 19 августа 2006 01:11 · Поправил: MINDFLY · Личное сообщение · #9 |
![]() |
eXeL@B —› Вопросы новичков —› создание nocd для StarCraft |