文章目录
1.IDA简介
介绍了IDA反汇编原理分为,线性扫描反汇编和递归下降反汇编。比较了两者的优点和缺点。线性扫描反汇编算法采用一种非常简单的方法来确定需要反汇编的指令的位置:一条指令结束、另一条指令开始的地方。因此,确定起始位置最为困难。常用的解决办法是,假设程序中标注为代码(通常由程序文件的头部指定)的节所包含的全部是机器语言指令。反汇编从一个代码段的第一个字节开始,以线性模式扫描整个代码段,逐条反汇编每条指令,直到完成整个代码段。线性扫描算法的主要优点,在于它能够完全覆盖程序的所有代码段。线性扫描方法的一个主要缺点,是它没有考虑到代码中可能混有数据。
递归下降采用另外一种不同的方法来定位指令。递归下降算法强调控制流的概念。控制流根据一条指令是否被另一条指令引用来决定是否对其进行反汇编。递归下降算法的一个主要优点在于,它具有区分代码与数据的强大能力。作为一种基于控制流的算法,它很少会在反汇编过程中错误地将数据值作为代码处理。递归下降算法的主要缺点在于,它无法处理间接代码路径,如利用指针表来查找目标地址的跳转或调用。然而,通过采用一些用于识别指向代码的指针的启发(heuristics)式方法,递归下降反汇编器能够提供所有代码,并清楚地区分代码与数据。代码与数据在内存空间没有明确的区分,载入的二进制文件,在没有充分信息的情况下,反汇编有可能出错,这时需要手动指定代码起始位置。
2.逆向与反汇编工具
2.1.文件识别工具
file 命令是一个标准的实用工具,大多数*NIX 风格的操作系统和Windows 下的Cygwin①或MinGw②工具都带有这个实用工具。file 试图通过检查文件中的某些特定字段来确认文件的类型。file 能够识别大量的文件格式,包括数种ASCII 文本文件、各种可执行文件和数据文件。file
执行的幻数检查由幻数文件(magic file)所包含的规则控制。
2.2.PE Tools
PE Tools①是一组用于分析Windows 系统中正在运行的进程和可执行文件的工具。在进程列表中,用户可以将一个进程的内存映像转储到某个文件中,也可以使用PE Sniffer实用工具确定可执行文件由何种编译器构建,或者该文件是否经过某种已知的模糊实用工具的模糊处理。
2.3.PEiD
PEiD①是另一款Windows 工具,它主要用于识别构建某一特定Windows PE 二进制文件所使用的编译器,并确定任何用于模糊Windows PE 二进制文件的工具。
3.IDA 窗口
3.1.二进制加载器
如果选择使用二进制加载器,需要比平常做更多的工作。由于没有文件头信息引导分析过程,你必须手动执行通常由更加强大的加载器自动完成的任务。需要使用二进制加载器的情形包括:分析从网络数据包或日志文件中提取出来的ROM镜像和破解程序负载。
3.2.创建数据库
值得注意的是,一旦IDA 为某个可执行文件创建数据库,它就不再需要访问这个可执行文件,除非你希望使用IDA 的集成调试器调试这个可执行文件本身。从安全角度看,这是一项有用的功能。
3.3.反汇编窗口
反汇编窗口也叫IDA-View窗口,它是操作和分析二进制文件的主要工具。分文文本窗口和图形窗口,图形窗口将汇编代码按模块进行分块显示。IDA使用不同的彩色箭头区分函数块之间各种类型的流。根据测试条件,在条件跳转位置终止的基本块可能会生成两种流:Yes边的箭头(是的,执行分支)默认为绿色,No边的箭头(不,不执行分支)默认为红色。只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块。平移。首先,除了使用“图形概况”窗口迅速定位图形外,你还可以通过单击和拖动图形视图的背景来定位图形。分组和折叠块。最后,你可以对块分组,每个块单独分组,或者与其他块一起分组;并可将分组后的块折叠起来,以减少显示的混乱程度。折叠块特别有用,可以帮助你追踪已经分析过的块。要折叠块,可以右击块的标题栏,然后在出现的菜单上选择“Group Nodes”。通常,虚拟地址以[区域名称]:[虚拟地址]这种格式显示,如.text:004011C1。
3.4.函数窗口
这一行信息特别指出:用户可以在二进制文件中虚拟地址为00BDC260的.text部分找到malloc函数;该函数长为384字节(十六进制为180字节),它返回调用方(R),并使用EBP寄存器(B)引用它的局部变量。
3.5.输出窗口
输出窗口是显示你为IDA开发的任何脚本和插件的输出的主要窗口。
3.6.十六进制窗口
可以与反汇编代码窗口同步显示。如下图所示:
3.7.导出窗口
如果是exe文件,就只有一个入口函数,如果是dll文件,就有许多导出函数供其它模块调用。
3.8.导入窗口
导入窗口的功能与导出窗口的功能正好相反。它列出由被分析的二进制文件导入的所有函数。只有在二进制文件使用共享库时,IDA才需要用到导入窗口。静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容。导入窗口中的每个条目列出一个导入项目(函数或数据)的名称,以及包含该项目的库的名称。由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址。
3.9.结构体窗口
结构体窗口用于显示IDA决定在一个二进制文件中使用的任何复杂的数据结构(如C结构体和联合)的布局。在分析阶段,IDA会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来。
3.10.枚举窗口
枚举窗口有点类似于结构体窗口。如果IDA检测到标准枚举数据类型(C enum),它将在枚举窗口中列出该数据类型。你可以使用枚举来代替整数常量,提高反汇编代码的可读性。
3.11.Strings 窗口
Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址。与双击Names窗口中的名称得到的结果类似,双击Strings窗口中的任何字符串,反汇编窗口将跳转到该字符串所在的地址。
3.12.Names 窗口
名称是指对一个程序虚拟地址的符号描述。在最初加载文件的过程中,IDA会根据符号表和签名分析派生出名称列表。名称可以按字母排序,也可以按虚拟地址排序(升序或降序)。用户可通过Names窗口迅速导航到程序列表中的已知位置。双击Names窗口中的名称,可立即跳转到显示该名称的反汇编视图。
3.13.段窗口
段窗口显示的是在二进制文件中出现的段的简要列表。需要注意的在,在讨论二进制文件的结构时,IDA术语段(segment)常称为节(section)。请不要将这里的术语段与实施分段内存体系结构的CPU中的内存段混淆。该窗口中显示的信息包括段名称、起始和结束地址以及许可标志。
3.14.签名窗口
IDA利用一个庞大的签名库来识别已知的代码块。签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器。签名还可用于将函数划归为由编译器插入的已知库函数,或者因为静态链接而添加到二进制文件中的函数。
3.15.类型库窗口
类型库窗口在概念上与签名窗口类似。类型库保存IDA积累的一些信息,即IDA从最常用的编译器的头文件中搜集到的有关预定义数据类型和函数原型的信息。通过处理头文件,IDA可确定常用库函数所需的数据类型,并为反汇编代码提供相应的注释。同样,IDA还可从这些头文件中了解复杂数据结构的大小和布局。所有这些信息都收集在TIL文件(<IDADIR/til目录>)中,并可在任何时候应用于你分析的二进制文件。
3.16.函数调用窗口
在任何程序中,一个函数可以调用其他函数,也可以被其他函数调用。实际上,建立一个图形来说明调用方与被调用方之间的关系,是一个相当简单的任务。这样的图形叫做函数调用图形或函数调用树(我们将在第9章介绍如何在IDA中生成这类图形)。有时候,我们并不需要查看程序的完整调用图形,而只对指定函数的“近邻”感兴趣。如果Y直接调用X,或者X直接调用Y,则称Y是X的近邻。
4.作者答疑
− − − − − − − − 插 ∗ 件 ∗ 开 ∗ 发 − − − − − − − − p h 99 o n e = 1 8 9 2 8 8 9 9 7 2 8 W e i 88 X i n = 1 8 9 2 8 8 9 9 7 2 8 Q 99 Q = 3 1 2 1 1 7 2 7 1 --------插*件*开*发--------\\ ph99one= \begin{matrix} 1 & 8 &9 & 2 &8 & 8 &9 & 9 &7 & 2 &8 \end{matrix}\\ Wei88Xin= \begin{matrix} 1 & 8 &9 & 2 &8 & 8 &9 & 9 &7 & 2 &8 \end{matrix}\\ Q99Q= \begin{matrix} 3 & 1 &2 & 1 &1 & 7 &2 & 7 &1 \end{matrix} −−−−−−−−插∗件∗开∗发−−−−−−−−ph99one=18928899728Wei88Xin=18928899728Q99Q=312117271