• IDA支持多种格式:PE、COFF(通用对象文件)、ELF(可执行与链接格式)、a.out

1、加载一个可执行文件

  • 尝试识别文件格式和处理器架构
  • 加载时binary file选项特别关注:恶意代码有时带有shellcode、其他数据、加密参数、可执行文件,需要将这个文件作为二进制文件加载并反汇编它
  • 进程中加载的一个DLL位置与在IDA pro中看到的不一样,可能是文件被基地址重定向的结果。加载时选定Manual Load复选框可以指定这个文件要加载的新的虚拟基地址
  • 默认情况下IDA反汇编中不包含PE头或资源节

2、IDA Pro 接口

  • 图形或文本模式显示反汇编窗口-空格
    • 图形模式:
      • 省略了行号和操作码,可以通过Option->General选择Line prefixes设置Number of Opcode Bytes为6或8查看内存位置和每条指令的操作数。
      • 红色代表条件跳转未被采用,绿色被采用,蓝色无条件跳转被采用,向上的箭头表睡一个循环条件
    • 文本模式:
      • 左侧为箭头窗口,实线标记无条件跳转,虚线标记条件跳转,朝上的箭头表示一个循环
      • 选择Options->General->Auto comments复选框,在反汇编窗口添加附加注释
  • 对分析有用的窗口
    • 函数窗口:列举可执行文件中的所有函数,并显示每个函数的长度(规模庞大的函数需重点关注),L标记的为库函数,分析时可以跳过
    • 名字窗口:列举每个地址的名字,函数、命名代码、命名数据、字符串
    • 字符串窗口:显示所有字符串(可通过右键单击该窗口修改Setup属性筛选显示的字符串长度)
    • 导入表窗口:列举文件导入函数
    • 导出表窗口:列举导出函数(分析DLL很有用)
    • 结构窗口:
    • 这些窗口提供了交叉引用特性
  • 返回到默认视图
    • Windows->Reset Desktop
  • 导航IDA Pro
    • 使用链接和交叉引用:使用反汇编窗口内的链接(X)
    • 常见链接类型:
      • 子链接是函数开始的链接:printf、sub_xxx
      • 本地链接是跳转指令目的地址的链接:loc_xxx
      • 偏移链接:内存偏移的链接
    • 浏览历史:向前后退按钮
    • 导航栏:工具栏底部的水平色带,展示加载二进制地址空间的线性视图
      • 浅蓝色是被FLIRT识别的库函数
      • 红色是编译器生成的代码
      • 深蓝色是用户编写的代码:应该在深蓝色区域执行恶意代码分析
    • 对数据的默认颜色
      • 粉色:导入数据
      • 灰色:已定义数据
      • 棕色:未定义数据
    • 跳转到位置
      • 跳转到虚拟内存地址 —— G键
      • 跳转到原始文件偏移:Jump—>Jump to file offset
  • 搜索
    • serch-Text:定位字符串

3、使用交叉引用(xref)

  • 一个函数在何处被调用,一个字符串在何处被使用

  • 代码交叉引用(CODE XREF),要查看一个函数的所有交叉引用单击函数名按X键

  • 数据交叉引用:跟踪二进制文件中的数据访问。数据引用可以通过内存引用关联代码中引用数据的任意一个字节。

4、分析函数

  • 用IDA识别函数、标记函数,划分出局部变量和参数
  • Attributes:ebp-based frame
    IDA告诉我们基于EBP的栈帧如何在函数中使用,整个函数中局部变量和参数都通过EBP寄存器来引用
  • 局部变量:var_[相对EBP的偏移量](相对EBP负偏移量的位置)
  • 参数:arg_[相对EBP的偏移量](相对EBP正偏移量的位置)
  • IDA无法识别出函数的情况:P键修正
  • 指令不是最简:Alt+P

5、使用图形选项

  • 对当前函数创建一个流程图
  • 对整个程序创建函数调用图
  • 对当前选择的交叉引用,生成所有指向这一引用的链接图
  • 从当前选择的符号开始,生成所有交叉引用的链接图
  • 创建一个用户指定的交叉引用图

6、增强反汇编:对反汇编结果进行修改

  • 重命名位置:将假名命名为更有意义的名字
  • 注释:光标放在反汇编的某行上,按“:”带起一个注释窗口;插入一个跨反汇编窗口(交叉引用是自动注释),按“;”
  • 格式化操作数:通常格式化为十六进制数,可以变为十进制、八进制、二进制或ASCII字符
    • 改变一个操作数是引用了内存还是保留为数据——O键
  • 使用命名的常量:Use Standard Symbolic Constant
  • 重新定义代码和数据:
    • U键 —— 取消函数、代码或数据的定义,后续字节会被重新格式化为一个原始字节列表
    • C键 —— 定义原始字节为代码
    • D键 —— 定义原始字节为数据
    • A键 —— 定义原始字节为数据或ASCII字符串

7、用插件扩展IDA

  • 脚本功能
    • 使用IDC脚本:由函数组成的程序,所有函数都被声明为静态。参数不需要指定类型,auto被用来定义局部变量。
    • 使用IDA python:
    • 使用商业插件:Hex-Rays反编译器、zynamics BinDiff

8、实验 Lab 5-1

  • .text:1000D02E
  • .idata:100163CC
  • 9个(计算两遍交叉引用),五个不同的函数调用
  • pics.praticalmalwareanalysis.com
  • 23个
  • 1个
  • 10095B34
  • This remote shell session:远程shell会话
  • 保存操作系统版本号,通常设为1
  • 查询注册表项,通过远程shell发出去