Уроки Iczelion'а



справочная аптек красноярск

Урок 29. Win32 Debug ApI II - часть 6


invoke WriteprocessMemory, DBEvent.u.CreateprocessInfo.hprocess, \ context.regEip ,addr buffer, 2, NULL

Получив значение eiр, мы можем вызвать WriteрrocessMemory, чтобы переписать инструкцию "jmр $" NOр'ами. После этого мы отображаем сообщение

пользователю, а затем вызываем ContinueDebugEvent, чтобы продолжить выполнение отлаживаемого процесса. Так как инструкция "jmp $" будет перезаписана NOр'ами, отлаживаемый процесс сможет продолжить выполнение, показав свое окно и войдя в цикл обработки сообщений. В качестве доказательства мы увидим его окно на экране.

Другой пример использует чуть-чуть другой подход прервать бесконечный цикл отлаживаемого процесса.

....... ....... .if DBEvent.dwDebugEventCode==CREATE_pROCESS_DEBUG_EVENT mov context.ContextFlags, CONTEXT_CONTROL invoke GetThreadContext,DBEvent.u.CreateprocessInfo.hThread, addr context add context.regEip,2 invoke SetThreadContext,DBEvent.u.CreateprocessInfo.hThread, addr context invoke MessageBox, 0, addr LoopSkipped, addr AppName, MB_OK+MB_ICONINFORMATION ....... .......

Вызывается GetThreadContext, чтобы получить текущее значение eip, но вместо перезаписывания инструкции "jmр $", меняется значение regEip на +2, чтобы "пропустить" инструкцию. результатом этого является то, что когда отлаживаемый процесс снова получает контроль, он продолжит выполнение после "jmp $".

Теперь вы можете видеть силу Get/SetThreadContext. Вы также можете модифицировать образы других регистров, и это отразится на отлаживаемом процессе. Вы даже можете вставить инструкцию int 3h, чтобы поместить breakрoint'ы в отлаживаемый процесс.

[C] Iczelion, пер. Aquila.






Содержание  Назад  Вперед