动态逆向分析技术¶
本章节知识点强调:
- 动态逆向分析
- x64dbg加载程序
- x64dbg的界面
- Memory Map:重定位
- 执行指令:执行到返回、执行到用户代码
- 断电BreakPoint:软件断点、硬件断电、内存断点、条件断点、消息断点
动态逆向分析¶
在动态分析技术中,最重要的就是调试器
用户模式调试器:
- CPU Ring3级
- x64dbg
内核模式调试器:
- CPU Ring0级
- WinDbg
x64dbg¶
具有可视化界面,同时结合了静态反汇编和动态调试,界面简洁优雅的一款用户调试器程序
x64dbg可以加载的程序:
- EXE可执行文件
- DLL动态链接库程序
- 正在执行的程序(通过附加进程的方式调试)
但是x64dbg不能调试驱动程序(Ring0级别的程序,无法调试)
x64的栈窗口¶
栈窗口显示栈的内容,即ESP指向内存地址的内容 栈中有函数参数、局部变量、函数返回地址等重要信息
Memory Map¶
内存中的exe和dll程序的位置被x64dbg识别,然后:
- 双击有可执行属性的行,会跳转到反汇编的窗口
- 双击没有可执行属性的航,会跳转到数据窗口
重定位¶
重定位发生在PE文件装载时,没有装在到指定的ImageBase的时候 + exe文件会装载到Image base,同时大部分exe文件的Image Base是0x00400000
dll重定位¶
- 一个程序会装载多个dll
- Windows的dll文件通常会使用不同的Image Base
执行指令¶
执行到返回:
- 执行知到返回,当前函数执行到返回指令之前的指令
- 结束当前调试的函数
执行到用户代码:
- 会从库函数返回到程序的代码节,例如.text节的代码
按不执行:
- 步入:单步执行
- 步过:对于函数,可以使用步过,执行完整个函数后暂停
断点¶
x64dbg再次打开调试相同的程序,断点信息仍然在。
软件断点¶
在x64dbg可以使用bp命令或者“F2”快捷键来设置/消除断点
- INT 3 指令替换原始CPU指令,操作码是0xCC
- INT 3 指令产生异常,停止程序执行
软件断点的优点:
- 可以设置无数个断点
缺点:
- 修改了原始程序的机器码
- 容易被软件监测到 - 检测API函数入口点是否为0xCC
硬件断点¶
不需要将CPU指令的首字节修改为“CC”
硬件执行断点¶
实现方式:
- 将断点的内存地址存储到CPU的DRx寄存器
- CPU执行过程中会判断下一条指令的地址与DRx寄存器中的地址是否一致
- 如果一致,CPU会产生异常,终止程序执行,控制权转移给调试器
优点:
- 隐蔽性强,不修改CPU指令,更难检测到
- 速度快。在CPU内部进行判断
缺点:
- 只有4个CPU寄存器存储断点地址,DR0到DR3
- 所有硬件断点共享4个DRx寄存器,包括后main介绍的硬件读取/写入断点
消息断点¶
Windows是由消息驱动的,当某个特定窗口函数接收到某个特定消息时候,消息断点将使得程序中断。
Windows消息有四个参数:
- 1个窗口句柄(hwnd)
- 1个消息编号(msg)
- 2个32位长的参数
消息断点和INT 3断点的区别
- INT 3断点可以在程序启动之前设置
- 消息断点只有在窗口被创建之后才能被设置并拦截消息
Windows通过句柄来表示它所代表的对象。 然后在x64dbg中需要手动刷行才能看到最新的消息。
条件断点¶
在调试过程中,在满足一定条件时候断点才会触发,这类断点成为条件断点。从本质上说,条件断点就是带有条件表达式的INT 3断点。