Сейчас на форуме: vasilevradislav, rmn, Magister Yoda, tyns777 (+7 невидимых) |
![]() |
eXeL@B —› Программирование —› VirtualProtectEx + WriteProcessMemory + FlushInstructionCache |
Посл.ответ | Сообщение |
|
Создано: 22 июля 2008 19:40 · Поправил: DaRKSiDE · Личное сообщение · #1 Короче башку сломал уже... ![]() Проблема в том, что после записи куска кода в процесс и выполнения ContinueDebugEvent и следом WaitForDebugEvent вместо того чтобы выполнить записанный код... возвращается код исключения С0000005 и прога валиться... причем валиться на томже месте где уже код записан... Я проверял, дампил.. VirtualProtectEx-ом соответственно устанавливается PAGE_EXECUTE_READWRITE к участку записи и исполнения... Подскажите люди добрые, в чем геморрой! Заранее ОГРОМНОЕ спасибо! ![]() ----- aLL rIGHTS rEVERSED! ![]() |
|
Создано: 22 июля 2008 19:53 · Личное сообщение · #2 |
|
Создано: 22 июля 2008 20:07 · Личное сообщение · #3 .while TRUE
----- aLL rIGHTS rEVERSED! ![]() |
|
Создано: 22 июля 2008 23:18 · Поправил: PE_Kill · Личное сообщение · #4 Ну тут вот где может быть баг. mov edx,[ebp+Context] mov dword ptr[edx.CONTEXT].ContextFlags, CONTEXT_CONTROL mov edx,[ebp+ProcessInfo] mov eax, dword ptr[ebp+Context] push eax mov eax,dword ptr[edx.PROCESS_INFORMATION].hThread push eax call GetThreadContext mov edx,[ebp+Context] mov eax, dword ptr[edx.CONTEXT].regEip dec eax Т.е. ты делаешь mov eax,dword ptr[edx.PROCESS_INFORMATION].hThread. Этот hThread указывает на main thread процесса, который создается при создании процесса. Выходит если у тебя 2 трэда и бряк срабатывает во втором, то ты всё равно получаешь контекст первого и уменьшаешь на 1 EIP, а в том трэде, где произошло исключение EIP так и остался +1. И после записи туда кода, код начинает выполняться не с первой инструкции, а с offset FirstInstr+1 - вот и ошибка. Но это если несколько потоков, с одним такая ошибка может не возникнуть. ЗЫ На случай вопроса "Как исправить код" - есть функция OpenThread (правда начиная с win2000 вроде), а тебе известен ThreadID где произошло исключение - передаешь в функу и получаешь его хэндл. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 23 июля 2008 08:26 · Поправил: DaRKSiDE · Личное сообщение · #5 |
|
Создано: 23 июля 2008 13:08 · Личное сообщение · #6 PE_Kill Извини что надоедаю... Но у меня еще один вопрос по этой же теме. Короче я поправил код, воткнул опентред... Все заработало, но... падает вот на таком участке кода 00401188 - FF25 A0C54200 JMP DWORD PTR DS:[<&KERNEL32.GetCommandLineA>] ; kernel32.GetCommandLineA
бряк срабатывает на адресе 00401188... и потом так же корректно обрабатывается ... Этот участок кода уже записан в процесс... Также опентредом получаю дескриптор потока читаю контекст, правлю EIP-1 обратно записываю контекст в поток и отпускаю на исполение... и валиться опять с ошибкой C0000005... ![]() Ну щас то почему? Все вроде работает отлично... ----- aLL rIGHTS rEVERSED! ![]() |
![]() |
eXeL@B —› Программирование —› VirtualProtectEx + WriteProcessMemory + FlushInstructionCache |