首先,需要得到该指令的地址。由于在我们的程序绑定到被调试程序时,被调试程序已经 处于循环语句中了,eip总是指向该指令。我们所要做的是得到eip的值。我们将使用 getthreadcontext来达到此目的。将上下文结构成员中contextflags设置 为context_control ,这样告诉getthreadcontext我们需要它去填充上下 文结构的成员中的"控制"寄存器。
invoke writeprocessmemory, dbevent.u.createprocessinfo.hprocess, context.regeip ,addr buffer, 2, null
得到eip的值以后,可以调用writeprocessmemory来用nops覆盖"jmp $" 指令,这样将使被调试程序退出无限循环。在向用户显示了信息之后,调用continuedebugevent 来恢复被调试程序的运行。由于指令"jmp $"已被nops覆盖,被调试程序将继续 显示窗口,并进入消息循环。证据是我们在屏幕上观察到了次窗口。
另一个例子与此稍有不同,它是将被调试程序从无限循环中中断。
.......
.......
.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
.......