编写一个非常基本的调试器

时间:2009-06-11 22:11:04

标签: code-injection

是否有可能在Windows下编写一个程序,在远程进程线程到达预定义地址时会导致远程进程线程中断(在该线程中停止执行)?

我一直在尝试使用Windows Debug API,但在设置断点时似乎非常有限。 DebugBreakProcess函数似乎很有希望,但我找不到有关如何使用此API调用的任何示例。

2 个答案:

答案 0 :(得分:12)

您需要使用WriteProcessMemory将断点(在x86上,操作码为0xCC)写入地址。 在x86上,当调试对象在代码中遇到该点时,0xCC将生成一个int 3异常。调试器接收到的WaitForDebugEvent将返回设置了EXCEPTION_DEBUG_EVENT的DEBUG_EVENT。

然后,您需要在继续之前将该地址修补回其原始代码。如果要再次中断,则需要单步执行,然后重新创建断点操作码。要单步执行,您需要在线程上下文中设置EFlag中的单步标志。

DebugBreakProcess用于生成正在调试的进程的远程中断 - 它不能用于在代码中的任意点处中断。

答案 1 :(得分:1)

迈克尔是对的 - 同样,如果你想在调试器中连接一个任意进程(即如果用户突然点击“突破进程”),标准方法是创建一个远程线程,其例程发出int3。