(P.S.学习笔记自己写的,很多内容都从书上记录的,不知道算不算原创。如果不算,欢迎告知...)
第2章 动态分析技术
- 动态分析->工具:调试器:
- 用户模式:Ring3级,OD、x64dbg、VC++
- 内核模式:WinDbg(能调试操作系统内核)
- UDD文件:OD的工程文件用于保存但前调试的一些状态
- 部分代码含义:
- 虚拟地址:一般情况下,同一程序的同一条指令在不同系统环境下此值相同
- 机器码:CPU执行的机器代码
- 汇编指令:与机器码对应的程序代码
- 领空:某一时刻CPU的CS:EIP指向的某段代码的所有者
- GetDlgItemText:
- 返回值:成功返回文本长度,失败返回0
- A、W两个版本
- 阅读代码注意:
- 清楚API定义
- API函数大都采用_stdcall调用约定(参数从右到左入栈,有被调用者清理栈,返回值放入eax)要分析push指令(将参数入栈)
- C代码中的子程序采用C调用约定,参数从右到左入栈,由调用者清理栈
- 爆破:通过屏蔽程序的某些功能或改变程序流程是保护的方式失效(如修改跳转指令)
- DRx调试寄存器:
- DR0~DR3:调试地址寄存器
- DR4~DR5:保留,未公开具体作用
- DR6:调试寄存器组状态寄存器
- DR7:调试寄存器组控制寄存器
- 常用断点:
- INT 3断点:
- bp指令或F2
- 本质是用INT 3指令替换内容(机器码0xCC,也成CC指令)
- 优点:可以设置无数个
- 缺点:改变机器码,易被API针对检测
- 硬件断点:
- 右键->Breakpoint->Hardware,on execution
- 原理:使用DR0~DR3设定地址,使用DR7设定状态->最多4个硬件断点
- 优点:速度快,在INT 3断点易被发现处效果好
- 缺点:对多3个断点
- 内存断点:
- 右键->Breakpoint->Memory,on access(write)
- 原理:对所设的地址予以不可访问/不可写属性,产生异常
- P.S.硬件访问/写入断点是在触发硬件断点的下一条指令处;内存断点是在触发断点的指令处
- 存在代码检验(0xCC)且硬件断点失灵时,可以使用
- 内存访问一次性断点:
- Atl+M中显示内存->相应段上右键->Set break-on-access
- 中断发生后断点会被删除
- 用于捕捉调用或返回某个模块
- P.S.此类断点仅在NT架构下可用(Windows的段页式管理)
- 消息断点:
- 工具栏W ->右键->Messsge breakpoint on ClassProc
- 调试时,没有合适的断点,可尝试
- 特定窗口函数接收到特定消息时,中断
- P.S.与INT 3的区别:INT 3在程序启动前设置,消息断点在窗口被创建后才能被设置并拦截消息
- 捕捉断点后在系统代码中,无法使用快捷键(Ctrl/Alt+F9)回到领空->在内存窗口(M)中对.text区块下断(Set break-on-access)->F9消息循环处(->可能不是需要的按钮处理,重复1~2次能达到按钮事件代码处)
- 条件断点:
- 本质:一个带有条件的INT 3断点
- 使用于寄存器、存储器、消息等
- 条件记录断点:
- 具有条件断点的作用,同时记录断点处函数表达式或参数的值
- Logdata窗口记录数据
- INT 3断点:
- 其他调试器部分(暂略):x64dbg、MDebug、WinDbg(很强大)