И снова здравствуйте, едва решив свою прошлую проблему, вылезла еще одна о_0 Запускаю дебаггер, вижу: Код (Text): 005D908E > $ 68 3D905D00 PUSH GameServ.005D903D ; /FileName = "research.dll" 005D9093 . FF15 F4BC8C0C CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; \LoadLibraryA 005D9099 . 68 5B905D00 PUSH GameServ.005D905B ; /ProcNameOrOrdinal = "LeInit" 005D909E . 50 PUSH EAX ; |hModule 005D909F . FF15 F0BC8C0C CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; \GetProcAddress 005D90A5 . FFD0 CALL EAX 005D90A7 .^E9 54FFFFFF JMP GameServ.005D9000 Начинаю выполнять пошагово, код преобразуется в: Код (Text): 005D908E > $ 68 3D905D00 PUSH GameServ.005D903D ; /FileName = "research.dll" 005D9093 . FF15 F4BC8C0C CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; \LoadLibraryA 005D9099 . 68 5B905D00 PUSH GameServ.005D905B ; /ProcNameOrOrdinal = "LeInit" 005D909E . 50 PUSH EAX ; |hModule 005D909F . FF15 F0BC8C0C CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; \GetProcAddress 005D90A5 . 8000 E9 ADD BYTE PTR DS:[EAX],0E9 005D90A8 ? 00FF ADD BH,BH 005D90AA ? FFFF ??? ; Unknown command Функция LeInit подменяет оффсет: Код (Text): LeInit Proc Local OldProtect:DWord Invoke VirtualProtect, 00401000H, 006B2FFFH, 40H, OldProtect Mov DWord Ptr Ds:[401F91H],NewNPC invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK Ret LeInit EndP Дак вот, почему она изменяет последующие процедуры, и как от этого избавиться? о_0
005D90A5 Mov DWord Ptr Ds:[401F91H],NewNPC Очень интересно. И как же это случилось. А вы уверены, что после инициализации LeInit это Код (Text): LeInit Proc Local OldProtect:DWord Invoke VirtualProtect, 00401000H, 006B2FFFH, 40H, OldProtect Mov DWord Ptr Ds:[401F91H],NewNPC invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK Ret LeInit EndP и сообщение выскакивает?
Сообщение выскакивает Процедура по адресу 401F91H, принмает нужный вид Только одна "байда" что кушает процедуры после себя
а ты попробуй исполнять ее с заходом в функцию. Когда ты делаешь прыжок через функцию, отладчик ставит инт3 на адрес возврата. Если функция меняет этот адрес, то будет конфликт с инт3.
вы ведь сами писали о ChangeThisCall в предыдущей теме своей, а тут зачем то делаете Mov DWord Ptr. изменяются последующие процедуры из того что создаваемая в результате использовании Mov DWord Ptr Ds: инструкция не совпадает по размеру байт с оригинальной из-за чего и происходит изменение нижеследующих байт а следовательно и "процедур". используйте свой же ChangeThisCall вместо Mov. например так Invoke ChangeThisCall, 401F91H, Offset NewNPC.
slonik У него изменение "нижеследующих" происходит совсем в другом месте и причину я уже указал в #5 - в VirtualProtect передается не адрес переменной OldProtect, а ее значение, которое "по стечению обстоятельств" как раз и равно адресу инструкции call eax = адресу возврата из GetProcAddress. Вот по этому адресу сама VirtualProtect и записывает значение OldProtect, затирая call eax и часть jmp