Сейчас на форуме: vasilevradislav, rmn, Magister Yoda, tyns777 (+7 невидимых)

 eXeL@B —› Программирование —› VirtualProtectEx + WriteProcessMemory + FlushInstructionCache
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 22 июля 2008 19:40 · Поправил: DaRKSiDE
· Личное сообщение · #1

Короче башку сломал уже...
Проблема в том, что после записи куска кода в процесс и выполнения ContinueDebugEvent и следом WaitForDebugEvent вместо того чтобы выполнить записанный код... возвращается код исключения С0000005 и прога валиться... причем валиться на томже месте где уже код записан...
Я проверял, дампил..
VirtualProtectEx-ом соответственно устанавливается PAGE_EXECUTE_READWRITE к участку записи и исполнения...
Подскажите люди добрые, в чем геморрой!
Заранее ОГРОМНОЕ спасибо!

-----
aLL rIGHTS rEVERSED!




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 22 июля 2008 19:53
· Личное сообщение · #2

DaRKSiDE
код в студею..




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 22 июля 2008 20:07
· Личное сообщение · #3

.while TRUE
push INFINITE
mov eax,dword ptr[ebp+DebugEvent]
push eax
call WaitForDebugEvent

mov edx,[ebp+DebugEvent]
.if dword ptr [edx.DEBUG_EVENT].dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
jmp exit_loader
.endif
.if dword ptr[edx.DEBUG_EVENT].dwDebugEventCode == EXCEPTION_DEBUG_EVENT
.if dword ptr[edx.DEBUG_EVENT].u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT
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
-----------------------------8<-------------------------------------- >8--------------------------------

lea eax,dword ptr[esp+10h]
push eax
push PAGE_EXECUTE_READWRITE ;or PAGE_GUARD
push dword ptr[ebp+SizeRegion]
push dword ptr[ebp+OffsetCode]
mov ebx,[ebp+ProcessInfo]
push dword ptr[ebx.PROCESS_INFORMATION].hProcess
call VirtualProtectEx

pop eax
pop ecx
pop edx

push 0
push ecx
push eax
push edx

push dword ptr[ebx.PROCESS_INFORMATION].hProcess

call WriteProcessMemory

push 0
push 0
push dword ptr[ebx.PROCESS_INFORMATION].hProcess
call FlushInstructionCache
.endif
.endif
.endif
mov edx,[ebp+DebugEvent]
push DBG_CONTINUE
mov eax,dword ptr[edx.DEBUG_EVENT].dwThreadId
push eax
mov eax,dword ptr[edx.DEBUG_EVENT].dwProcessId
push eax
call ContinueDebugEvent

.endw


-----
aLL rIGHTS rEVERSED!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 23 июля 2008 08:26 · Поправил: DaRKSiDE
· Личное сообщение · #5

PE_Kill
ОГРОМНЕЙШЕЕ СПАСИБО!
Все заработало!
Уф...

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 23 июля 2008 13:08
· Личное сообщение · #6

PE_Kill

Извини что надоедаю...
Но у меня еще один вопрос по этой же теме.
Короче я поправил код, воткнул опентред...
Все заработало, но... падает вот на таком участке кода

00401188 - FF25 A0C54200 JMP DWORD PTR DS:[<&KERNEL32.GetCommandLineA>] ; kernel32.GetCommandLineA
0040118E 8BC0 MOV EAX,EAX
00401190 - FF25 9CC54200 JMP DWORD PTR DS:[<&KERNEL32.GetLocaleInfoA>] ; kernel32.GetLocaleInfoA
00401196 8BC0 MOV EAX,EAX
00401198 - FF25 98C54200 JMP DWORD PTR DS:[<&KERNEL32.GetModuleFileNameA>] ; kernel32.GetModuleFileNameA
0040119E 8BC0 MOV EAX,EAX
004011A0 - FF25 94C54200 JMP DWORD PTR DS:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA
004011A6 8BC0 MOV EAX,EAX
004011A8 - FF25 90C54200 JMP DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress
004011AE 8BC0 MOV EAX,EAX
004011B0 - FF25 8CC54200 JMP DWORD PTR DS:[<&KERNEL32.GetStartupInfoA>] ; kernel32.GetStartupInfoA
004011B6 8BC0 MOV EAX,EAX
004011B8 - FF25 88C54200 JMP DWORD PTR DS:[<&KERNEL32.GetThreadLocale>] ; kernel32.GetThreadLocale
004011BE 8BC0 MOV EAX,EAX
004011C0 - FF25 84C54200 JMP DWORD PTR DS:[<&KERNEL32.LoadLibraryExA>]


бряк срабатывает на адресе 00401188... и потом так же корректно обрабатывается ...
Этот участок кода уже записан в процесс...
Также опентредом получаю дескриптор потока читаю контекст, правлю EIP-1 обратно записываю контекст в поток и отпускаю на исполение... и валиться опять с ошибкой C0000005...
Ну щас то почему? Все вроде работает отлично...

-----
aLL rIGHTS rEVERSED!



 eXeL@B —› Программирование —› VirtualProtectEx + WriteProcessMemory + FlushInstructionCache
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати