断点设置与程序运行

断点

bp 常用执行断点
bm 设置执行符号断点,可以同时对多个符号下断
bu 设置一个延时断点,可以对一个还未加载的模块执行代码下断。当模块加载时,此断点自动激活
ba 设置内存访问断点
以上断点都可以针对某个线程下断。如 ~1 bp 在一号线程上下执行断点
bl 查看断点列表
bd 1 禁用一号断点
be 2 启用二号断点
bc * 清除所有断点

条件断点的高级用法

字符串条件断点

如果想在加载某个模块时(如USER32.DLL)该怎么做呢?

下面咱们看一个例子。
当前程序有两个模块组成:break.exe和breakdll.dll。
break.exe在执行的过程中会加载breakdll.dll。

那怎么在加载breakdll.dll的时候断下呢?
//ascii字符串条件断点设置方法

//Unicode字符串条件断点设置方法

多重断点设置方法

在加载完breakdll.dll的时候,会调用该模块的GetRandom函数(此函数用来生成随机数)。
现在我想在breakdll.dll加载完毕后,马上在GetRandom上下断点。

bu命令的用法

这个条件断点好长啊,很不好写,有没有更好的方法?这时候我想起了bu命令。
bu命令可以对那些还没加载的模块设置断点

命中次数

break.exe中会对breakdll!GetRandom函数执行20遍,我想在第10遍的时候断下它,怎么办呢?

记录断点

我想知道每次breakdll!GetRandom执行完的返回值是多少,这个时候的写法为:

监控变量值被修改

在break.exe中有一个全局变量g_nValue, 默认值为100;在执行过程中,此值会改变。我想知道此值被修改时的调用栈和修改后的值为多少,以及当时的汇编指令

只针对某个线程被断下

在break.exe中有一个全局变量g_nValue被多个线程修改,我只关心1号线程,这个时候我针对1好线程下断:

bm bp bu 指令同样可以对指定线程下断

执行命令

g是执行命令,可以指定从某处执行,也可以在执行到某处时断下,如:
g =00423aef 00423af3
修改当前eip为00423aef,执行到00423af3处中断
当然也可以让某个线程继续执行,而其他的线程处在冻结状态。如:
~1 g 一号线程继续执行

p 单步步过
t 单步步入
gu 执行到返回
gc 从断点处继续执行,用在条件断点内
gn 忽略异常继续执行。允许应用程序的异常处理程序来处理异常。
gh 异常被处理,继续执行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注