2. 软件断点
一般断点要满足的3个要求:
1. 运行到指定地址时可挂起程序,此时能提供环境数据给用户,并等待用户操作或命令。
2. 当用户希望继续执行时,能像正常程序一样继续执行。
3. 当再次执行到断点时,还能像步骤1一样挂起程序。
例如用int3,sti, cli等指令替换原机器码,都能实现断点效果。
OD的断点把指定地址的机器指令替换为CC,普通单步指令停下的地址,其机器码不是CC。
用户设置的断点保存在断点信息表中,表中保存地址和原机器码。当发生异常时比较地址是否存在于表中,存在则调试器接管断点,否则交给程序处理。
ntdll.dll中有一条int3指令,称为系统断点,提示我们马上要到Entry Point了,用户可以做准备工作了。
int3专用于用户和调试服务交互,进程内发生的int3异常如果未处理,程序最终会崩溃,如果附加了调试器,且调试器的处理态度是DBG_CONTINUE,则此int3指令执行完毕,继续下一条指令。
名称粉碎规则(编译后查看obj文件):
//_Foo1 _前缀
extern "C" int __cdecl Foo1(int a, char b) {
return 0;
}
//_Foo2@8 _前缀 + @所有参数字节数
extern "C" int __stdcall Foo2(int a, char b) {
return 0;
}
//@Foo3@8 @前缀 + @所有参数字节数
extern "C" int __fastcall Foo3(int a, char b) {
return 0;
}