恶意代码分析实战 第五章 IDA Pro

本章简单介绍了IDA Pro的用法,详细信息推荐阅读《IDA Pro权威指南(第二版)》这本书是《The IDA Pro Book: The Unofficial Guide to the World's Most Popular Disassembler》的中文版,也是不可不读的经典之作。

ida.jpg

加载一个可执行文件

ida1.png

最上面的方框是选择文件格式的,1是PE文件格式,想让IDA将文件作为一个原始二进制文件进行反汇编时,选择3,这个选项是非常有用的,因为恶意代码有时会带有shellcode、其他数据、加密参数,甚至在合法的PE文件中带有可执行文件,并且当包含这些附加数据的恶意代码在Windows.上运行或被加载到IDA Pro时,它并不会被加载到内存中。此外,当你正在加载- -个包含shellcode的原始二进制文件时,你应该将这个文件作为二进制文件加载并反汇编它。

PE文件被编译加载到内存中一个首选的基地址,如果Windows加载器无法将它加载到它的首选地址(因为这个地址已经被使用),加载器会执行一个叫做基地址重定向的操作。这在DLL中经常发生,因为它们经常被加载到与它们首选地址不同的位置。如果你遇到进程中加载的---个DLL的位置与你在IDAPro中看到的不一样,这可能是这个文件被基地址重定向的结果。发生这种情况时,选中图中4处的Manual Load复选框,这时你会看到-一个输入框,你可以指定这个文件要加载的新的虚拟基地址。

IDA Pro接口

反汇编窗口模式

使用空格键切换图形模式和文本模式。

图形模式

打开行号显示

line.png

自动添加反汇编注释

对于萌新来说有很多没见过的指令,添加反汇编注释以后看起来会轻松很多,不需要每一个不认识的指令都去查阅资料。

comment.png
comment2.png

IDA目录结构

file.png

在IDA的安装根目录下有许多文件夹,各个文件夹存储不同的内容

cfg:包含各种配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用户界面配置文件idatui.cfg,

dbgsrv:包含远程调试器,可以将此文件夹中对应的调试器复制到对应系统进行远程调试。

idc:idc目录包含IDA的内置脚本语言IDC所需的核心文件。

ids:ids目录包含一些符号文件(IDA语法中的IDS文件),这些文件用于描述可被加载到IDA的二进制文件引用的共享库的内容。这些IDS文件包含摘要信息,其中列出了由某一个指定库导出的所有项目。这些项目包含描述某个函数所需的参数类型和数量的信息,函数的放回类型以及与该函数的调用约定有关的信息。

Loaders:loaders目录包含在文件加载过程中用于识别和解析PE或ELF等已知文件格式的IDA扩展。

platform:系统运行需要的库文件

plugins:plugins目录包含专门为IDA提供附加功能的IDA模块。

procs:procs目录包含已安装的IDA版本所支持的处理器模块。处理器模块为IDA提供机器语言-汇编语言转换功能,并负责生成在IDA用于界面中显示的汇编语言。

Sig:sig目录包含IDA在各种模式匹配操作中利用的现有代码的签名。通过模式匹配,IDA能够将代码序列确定为已知的库代码,从而节省大量的分析时间。这些签名有IDA的“快速的库识别和鉴定技术”(FLIRT)生成。

til:til目录包含一些类型库信息,IDA通过这些信息记录特定与各种编译器库的数据结构的布局

themes:该文件夹存储IDA样式文件,可以定制样式。

python/python38:IDA Python模块

箭头颜色:

  1. 红色:一个条件跳转没有被采用
  2. 绿色:这个条件跳转被采用
  3. 蓝色:一个无条件跳转被采用

常用快捷键

记录几个常用的快捷键

a:将数据转换为字符串

f5:一键反汇编

esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)

shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置

ctrl+w:保存ida数据库

ctrl+s:选择某个数据段,直接进行跳转

ctrl+鼠标滚轮:能够调节流程视图的大小

x:对着某个函数、变量按该快捷键,可以查看它的交叉引用

g:直接跳转到某个地址

n:更改变量的名称

y:更改变量的类型

/ :在反编译后伪代码的界面中写下注释

\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多

;:在反汇编后的界面中写下注释

ctrl+shift+w:拍摄IDA快照

u:undefine,取消定义函数、代码、数据的定义

折叠流程图中的分支

在流程视图中,分支过多的时候,可以在窗口标题处右击选择group nodes,就能把当前块折叠起来,分支可以自己命名,帮助理解代码块作用。

zhedie.png

函数调用图

菜单栏中:view-->graphs-->Function calls(快捷键Ctrl+F12)

函数流程图

flow.png

创建结构体

创建结构体是在IDA的structures窗口中进行的

struct.png

可以看到已经存在了三个结构体,可以右键选择hide和unhide来决定是否详细展示结构体


struct1.png

创建结构体的快捷键是:insert

struct2.png

在弹出的窗口中,可以编辑结构体的名字

这底下有三个复选框,第一个表示显示在当前结构体之前(就会排列在第一位,否则排列在你鼠标选定的位置),第二个表示是否在窗口中显示新的结构体,第三个表示是否创建联合体。

需要注意的是,结构体的大小是它所包含的字段大小的总和,而联合体的大小则等于其中最大字段的大小

struct3.png

可以使用快捷键D或者右键选择Data进行添加数据操作。成员的命名默认是以field_x表示的,x代表了该成员在结构体中的偏移。(使用快捷键D进行添加时,光标需要放在end行)

struct4.png

同时,可以把鼠标放在结构体成员所在的行,按D,就可以切换不同的字节大小

默认情况下可供选择的就只有db,dw,dd(1,2,4字节大小)

IDA-Python

图形化窗口的最下面output window其实是一个输出终端,可以执行IDC脚本或者Python脚本。

IDA-Python官方文档地址:https://www.hex-rays.com/products/ida/support/idapython_docs/

idapython.png

文本模式

文本模式显示的左侧部分被称为箭头窗口,显示了程序的非线性流程。实线标记了无条件跳转,虚线标记了条件跳转。注释以一个分号开始,这个注释是由IDA Pro自动添加的。

text.png

可以添加自动注释,帮助理解程序,打开自动注释: Options->General,选择Auto comments

autocomment.png

对分析有用的接口

下面是对我们分析最有帮助的几个窗口。

windows.png

可以按下图进行设置

windows2.png
  • 函数窗口

列举可执行文件中的所有函数,并显示每个函数的长度。你可以根据函数长度来排序,并过滤出那些规模庞大复杂的可能很有意思的函数,并排除进程中规模很小的函数。这个窗口也对每一个函数关联了一些标志(F、 L、S等),这其中最有用的L,指明库函数。L标志可以在分析时节省你很多时间,因为你可以识别并跳过这些编译器生成的函数。

  • 名字窗口

名字窗口列举每个地址的名字, 包括函数、命名代码、命名数据和字符串。

  • 字符串窗口

字符串窗口显示所有的字符串。 默认情况下,这个列表只显示长度超过5个字符的ASCI字符

  • 导入表窗口

导入表窗口列举- 一个文件的所有导入函数。

  • 导出表窗口

导出表窗口列举- 一个文件的所有导出函数。在分析DLL时这个窗口很有用。

  • 结构窗口

结构窗口列举所有活跃数据结构的布局。这个窗口也提供用自己创建的数据结构作为内存布

这些窗口还提供了交叉引用的特性,这个特性在定位有意义代码时十分有用。例如,要找到调用一个导入函数的所有代码位置,你可以使用导入表窗口,双击感兴趣的导入函数,然后使用交叉引用特性,来定位代码清单中的导入调用。

返回到默认视图

可以通过Reset desktop来恢复到默认的视图,此操作不会撤销你完成的任何标记或反汇编工作,仅仅是改变了展示窗口的布局。

Windows->Reset Desktop
Windows->Save desktop 保存新视图


reset_desktop.png

导航IDA Pro

5-1.png

使用链接和交叉引用

介绍几种最常见的链接类型

  • 子链接是一个函数的开始链接,比如printf和sub_4010A0
  • 本地链接是跳转指令的目的的链接,比如loc_40107E
  • 偏移链接时内存偏移的链接

浏览历史

当进入一个新的视图分析完毕以后,可以轻松返回上一个视图。

history.png

导航栏

daohang.png
1. 浅蓝色: 被FLIRT识别的库代码
2. 红色: 编译器生成的代码
3. 深蓝色: 用户编写的代码
4. 粉红色: 导入的数据
5. 灰色: 已定义的数据
6. 棕色: 未定义的数据

跳转到位置

跳转到任意虚拟内存地址:快捷键g

jump.png

跳转到一个原始文件的偏移

jump2.png

搜索

Search->Next Code 移动光标到包含你所指定的指令的下一个位置
Search->Text 在整个反汇编窗口中搜索一个指定的字符串
Search->Sequence of Bytes 在十六进制视图窗口中对一个特定字节序列执行二进制搜索

使用交叉引用

交叉引用在IDA Pro中被称为xref,可以告诉一个函数在何处被调用,或者一个字符串在何处被使用。

代码交叉引用

xref1.png

1处告诉我们sub_401000在main+3的地方被引用,2处告诉我们loc_401003在sub_401000偏移19位的时候被引用而且是j(jump)类型。

查看一个函数的所有交叉引用:单机函数名并按X键

xrefs.png

数据交叉引用

1处告诉我们dword_40C000处的数据在函数sub_401020处被引用

2处告诉我们aHostnamePort的host信息在sub_401000处被引用,在查看string后定位关键函数很有帮助。

xref2.png

分析函数

局部变量用前缀var_标记,参数变量用arg标记,将局部变量和参数用相对EBP的偏移量来命名,局部变量会在负偏移的位置,参数是在正偏移的位置。

创建函数: P
无法识别出基于EBP的一个栈帧的修复: 按Alt+P,选择BP Based Frame,然后指定4 bytes for Saved Registers

使用图形选项

graphs.png

功能描述

graphs2.png

增强反汇编

IDA Pro可以允许你修改反汇编,请注意IDA Pro没有撤销,修改时要小心且谨慎。

  1. 重命名
  2. 注释:将光标放在反汇编的某行上,并按冒号(:)
  3. 格式化操作数
  4. 使用命名的常量—-手动加载有关类型库:选择View->Open Subviews->Type Libraries
  5. 重新定义代码和数据
    1. 按U取消函数,代码或数据的定义
    2. 按C定义原始字节为代码
    3. 按D定义原始字节为数据
    4. 按A定义原始字节为ASCII字符串

用插件扩展IDA

可以通过使用插件来扩展IDA的功能,自动化的执行任务。

最常见的就是IDC和Python的脚本,通过以下的操作来使用脚本。

plugins.png

使用商业插件

可以考虑购买或安装一些第三方的优秀插件来辅助分析。

Github上整理的IDA的插件汇总: https://github.com/onethawt/idaplugins-list

Hex-Rays生成伪代码

f5.png

zynamics BinDiff比较两个IDA Pro数据库

Findcrypt是IDA Pro一个插件,其功能是可查找加密常量是IDA Pro一个插件,其功能是可查找加密常量

官方链接:https://github.com/polymorf/findcrypt-yara

你可能感兴趣的:(恶意代码分析实战 第五章 IDA Pro)