1.OllyDbg的界面和配置
动态调试工具: OllyDbg, Windbg x64dbg
静态调试工具: ida
1.汇编窗口
2.信息窗口
3.数据窗口
4.寄存器窗口
5.栈窗口
02.常用快捷键
OD常用快捷键:
F2: 设置断点,只要在光标定位的位置按F2即可,在按一次F2键则会删除断点。
F8: 单步步过,每按一次这个键执行一条反汇编窗口中的一条指令,遇到call等子程序不进入其代码
F7: 单步步入,功能同单步步过(F8)类似,区别是遇到call等子程序会进入其中,进入后首先会停留在子程序的第一条指令上。
F4: 运行到选定位置,作用就是直接运行到光标所在位置处暂停
F9: 运行,按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。
ctrl+F9: 执行到返回,此命令在执行到一个ret(返回指令)时暂停,常用语从系统部分返回到我们调试的程序部分
03.INT3断点原理
F2断点,CC断点
原理:
1.替换指令,也就是换int3指令
2.od检测到int3指令之后会引发一个异常并且捕获它,这时候程序会中断
3.int3执行给删除掉,还原之前的代码
优点:无限的下int3断点
缺点:很容易被检测
04.INT3断点的反调试和反反调试
反调试(保护这个程序)
反反调试(破解这个程序)
FARPROC结构体
GetProcAddress函数
LoadLibrary函数
int main(){
FARPROC addr = GetProAddress(LoadLibrary(L"user32.dll"),"MessageBoxA"); //得到MessageBoxA的首地址
byte byteAddr = *(byte *)addr;
::MessageBox(NULL,"内容","标题",MB_OK); //弹框
if(byteAddr == 0xcc){
printf("检测到非法调试");
} else {
printf("代码正常");
}
getchar();
}
05.硬件断点原理解析
跟调试寄存器有关, DR0~DR7
DR0~DR3: 用于保存我们需要断点的地址
DR4,DR5: 未知
DR6: 状态寄存器
DR7: 控制寄存器
原理:
1.DR0~DR3用来保存我们需要断点的地址
2.DR7寄存器设置相对于控制位
3.当程序运行到这个地址的时候,CPU会向OD发送异常信息,然后程序中断,等待用户操作
优点:速度快,不容易被检测
缺点:最多只能下4个硬件断点
06.内存断点
内存属性
原理:
对这个地址赋予了不可读,不可执行的属性
程序运行到这里之后会产生一个异常
OD捕获这个异常,然后程序中断
优点:不改变汇编代码
缺点
07.消息断点
主要围绕windows的消息机制
08.条件断点
条件断点快捷键: shift+F2
多条件: ebp == 19ff70 && ebx == 19ffcc
09.内存访问一次性断点和条件记录断点
内存访问一次性断点: M 鼠标右键下断点, 运行之后会自动取消
条件记录断点: shift + F4
显示记录值的地方: alt+l
10.Hit trace和Run trace
Hit trace: 实际就是int3 可以跟踪程序执行轨迹
Run trace: 实际就是int3
11.调试符号 以及OD插件编写
kd> dt_eprocess 利用程序的pdb后缀文件可以读取程序源代码