跳转至

动态逆向分析技术

本章节知识点强调:

  • 动态逆向分析
  • 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”

硬件执行断点

实现方式

  1. 将断点的内存地址存储到CPU的DRx寄存器
  2. CPU执行过程中会判断下一条指令的地址与DRx寄存器中的地址是否一致
  3. 如果一致,CPU会产生异常,终止程序执行,控制权转移给调试器

优点

  1. 隐蔽性强,不修改CPU指令,更难检测到
  2. 速度快。在CPU内部进行判断

缺点

  1. 只有4个CPU寄存器存储断点地址,DR0到DR3
  2. 所有硬件断点共享4个DRx寄存器,包括后main介绍的硬件读取/写入断点

消息断点

Windows是由消息驱动的,当某个特定窗口函数接收到某个特定消息时候,消息断点将使得程序中断。

Windows消息有四个参数:

  1. 1个窗口句柄(hwnd)
  2. 1个消息编号(msg)
  3. 2个32位长的参数

消息断点和INT 3断点的区别

  • INT 3断点可以在程序启动之前设置
  • 消息断点只有在窗口被创建之后才能被设置并拦截消息

Windows通过句柄来表示它所代表的对象。 然后在x64dbg中需要手动刷行才能看到最新的消息。

条件断点

在调试过程中,在满足一定条件时候断点才会触发,这类断点成为条件断点。从本质上说,条件断点就是带有条件表达式的INT 3断点