IDA使用教程

IDA(静态分析工具)

第一部分 IDA简介

(一)反汇编简介

01 何为反汇编

在传统的软件开发模型中,程序员使用编译器,汇编器和链接器中的一个或几个创建可执行程序。为了回溯编程过程(或对程序进行逆向工程),我们使用各种工具来撤销汇编和编译过程。毫不奇怪,这些工具就叫做反汇编器和反编译器,名副其实。反汇编器撤销汇编过程,因此,我们可以得到汇编语言形式的输出结果(以机器语言作为输入).反编译器则以汇编语言甚至是机器语言为输入,其输出结果为高级语言。
反汇编就是把目标代码(目标代码可以理解成能够被CPU识别并执行的代码)转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码,低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机),外挂技术,病毒分析,逆向工程,软件汉化等领域。

02 为何反汇编

通常,使用反汇编工具是为了在没有源代码的情况下促进对程序的了解。需要进行反汇编的常见情况包括以下几种。

  • 分析恶意软件。
  • 分析闭源软件的漏洞。
  • 分析闭源软件的互操作性。
  • 分析编译器生成的代码,以验证编译器的性能和准确性。
  • 在调试时显示程序指令。
2.1分析恶意软件

通常,恶意软件的作者很少会提供他们"作品"的源代码,除非你对付的是一种基于脚本的蠕虫。由于缺乏源代码,要准确地了解恶意软件的运行机制,你的选择非常有限。动态分析和静态分析是分析恶意软件的两种主要技术。动态分析(dynamicanalysis)是指在严格控制的环境(沙盒)中执行恶意软件,并使用系统检测实用工具记录其所有行为。相反,静态分析(staticanalysis)则试图通过浏览程序代码来理解程序的行为。此时,要查看的就是对恶意软件进行反汇编之后得
到的代码清单。

2.2 漏洞分析

整个安全审核过程划分成3个步骤:发现漏洞,分析漏洞,开发破解程序(exploit).无论是否拥有源代码,都可以采用这些步骤来进行安全审核。但是,如果只有二进制文件,你可能需要付出巨大的努力。这个过程的第一个步骤,是发现程序中潜在的可供利用的条件。一般情况下,我们可通过模糊测试等动态技术来达到这一目的,也可通过静态分析来实现(通常需要付出更大的努力).一旦发现漏洞,通常需要对其进行深入分析,以确定该漏洞是否可被利用,如果可利用,可在什么情况下利用。
至于编译器究竟如何分配程序变量,反汇编代码清单提供了详细的信息。例如,程序员声明的一个70字节的字符数组,在由编译器分配时,会扩大到80字节,知道这一点会很有用。另外,要了解编译器到底如何对全局声明或在函数中声明的所有变量进行排序,查看反汇编代码清单是唯一的办法。在开发破解程序时,了解变量之间的这些空间关系往往非常重要。最后,通过结合使用反汇编器和调试器,就可以开发出破解程序。

2.3 软件互操作性

如果仅以二进制形式发布软件,竞争对手要想创建可以和它互操作的软件,或者为该软件提供插件,将会非常困难。针对某个仅有一种平台支持的硬件而发布的驱动程序代码。就是一个常见的例子。如果厂商暂时不支持,或者更糟糕地,拒绝支持在其他平台上使用他们的硬件,那么为了开发支持该硬件的软件驱动程序,可能需要完成大量的逆向工程工作。在这些情况下,静态代码分析几乎是唯一的补救方法。通常,为了理解嵌人式固件,还需要分析软件驱动程序以外的代码。

2.4 编译器验证

由于编译器(或汇编器)的用途是生成机器语言,因此优秀的反汇编工具通常需要验证编译器是否符合设计规范。分析人员还可以从中寻找优化编译器输出的机会,从安全角度来看,还可查知编译器本身是否容易被攻破,以至于可以在生成的代码中插人后门,等等。

2.5 显示调试信息

在调试器中生成代码清单,可能是反汇编器最常见的一种用途。遗憾的是,调试器中内嵌的反汇编器往往相当简单。它们通常不能批量反汇编,在无法确定函数边界时,它们有时候会拒绝反汇编。因此,在调试过程中,为了解详细的环境和背最信息,最好是结合使用调试器与优秀的反汇编器。


03 如何反汇编

为了满足所有要求,反汇编器必须从大量算法中选择一些适当的算法,来处理我们提供的文件,反汇编器所使用算法的质量及其实施算法的效率,将直接影响所生成的反汇编代码的质量。

3.1 基本的反汇编算法

为方便初学者,首先开发一个以机器语言为输入,以汇编语言为输出的简单算法。

  • 确定代码区域:找到你需要反汇编的代码部分。
  • 读取并解码指令:逐字节读取机器码并转换为汇编指令。
  • 格式化指令:将指令和操作数格式化为易于阅读的汇编语言格式。
  • 重复处理:继续处理下一条指令,直到代码区域结束。

这四个步骤可以看作是从头到尾读懂和翻译代码的过程。**首先,确定你要从哪里开始;然后,读取和转换数据;接着,格式化这些数据使其易于理解;最后,一直重复这个过程,直到你完成了整个任务。 **

3.2 线性扫描反汇编(主要)

线性扫描反汇编算法采用一种非常简单的方法来确定需要反汇编的指令的位置:一条指令结束,另一条指令开始的地方。因此,确定起始位置最为困难。常用的解决办法是,假设程序中标注为代码(通常由程序文件的头部指定)的节所包含的全部是机器语言指令。反汇编从一个代码段的第一个字节开始,以线性模式扫描整个代码段,逐条反汇编每条指令,直到完成整个代码段。这种算法并不会通过识别分支等非线性指令来了解程序的控制流。
以下是实现线性扫描反汇编的主要步骤:

  • **初始化: **设置初始条件以开始反汇编过程。 ** **

  • **读取指令: 从代码区域读取机器码。 **

  • **解码指令: **将机器码转换为汇编语言指令。

  • **处理控制流指令: **处理指令中的控制流跳转,如条件跳转和函数调用。

  • **继续扫描: 继续扫描并反汇编剩余的机器码。 **

  • **终止条件: **确定反汇编过程何时结束。

    线性扫描算法的主要优点,在于它能够完全覆盖程序的所有代码段。线性扫描方法的一个主要缺点,是它没有考虑到代码中可能混有数据。总的来说,线性扫描算法无法正确地将嵌入的数据与代码区分开来。
    GNU调试器(gdb)、微软公司的WinDbg调试器和objdump实用工具的反汇编引擎均采用线性扫描算法。

3.3 递归下降反汇编(主要)

递归下降采用另外一种不同的方法来定位指令。递归下降算法强调控制流的概念,控制流根据一条指令是否被另一条指令引用来决定是否对其进行反汇编。为便于理解递归下降,我们根据指令对cpu指令指针的影响对它们分类。

  1. 顺序流指令

顺序流指令是那些执行后会按顺序继续执行下一条指令的指令。它们不改变程序的控制流。
示例: 这些指令包括简单的算术运算和数据传输指令:

  • MOV EAX, 1(将值 1 移动到寄存器 EAX)
  • ADD EBX, 2(将值 2 加到寄存器 EBX 中)

这些指令不会改变程序的控制流,因此反汇编器只需顺序读取并解码下一条指令。

  1. 条件分支指令

条件分支指令根据某些条件的结果(如比较结果)决定是否跳转到另一条指令,需要解析条件并更新控制流。它们使程序的控制流变得复杂。
示例:

  • JE label(如果上次比较结果相等,则跳转到 label)
  • JNE label(如果上次比较结果不等,则跳转到 label)

反汇编器需要解析条件判断逻辑,确定跳转条件,以及跳转目标地址。 处理时,通常会根据条件判断是否跳转,然后继续反汇编跳转目标的代码。

  1. 无条件分支指令

无条件分支指令总是会跳转到指定的地址, 直接改变控制流 ,无论程序的当前状态如何。
示例:

  • JMP label(跳转到 label 指定的位置)
  • CALL function(调用一个函数,跳转到函数的起始地址,在处理CALL指令时,与函数调用指令的操作一致,即 CALL需要处理RET返回的地址 )

反汇编器需要更新程序的控制流到新的地址(目标地址),并开始从那个地址继续反汇编。 在处理 CALL 指令时,还需注意保存当前的返回地址,以便在函数执行完后返回。

  1. 函数调用指令

函数调用指令用于跳转到一个函数的开始位置,并保存返回地址, 反汇编时需处理函数的入口及返回机制,以便函数执行完后能够返回到原来的位置。
示例:

  • CALL function(调用 function 函数)

反汇编器需要处理函数的入口地址,并且需要处理返回地址的保存。 这可能会涉及到设置一个新的反汇编位置,并在函数结束时处理返回指令。

  1. 返回指令

从函数返回到调用位置,处理返回地址的恢复和继续执行的逻辑。
示例:

  • RET(从当前函数返回)

汇编器需要处理返回地址的恢复,并继续从返回地址开始执行反汇编过程。 在遇到 RET 指令时,通常需要查找调用该函数的位置,并将控制流设置回那个位置。

(二)逆向与反汇编工具

01 分类工具
1.1 file

file 是一个在Unix-like系统(如Linux、macOS)中常用的命令行工具,它用于识别文件类型。它通过分析文件的特征码(magic numbers)和其他文件的特征来确定文件的实际类型,而不仅仅是根据文件扩展名。
功能

  • 文件类型检测:file 可以识别多种类型的文件,包括文本文件、可执行文件、文档、图片等。
  • 文件格式信息:对二进制文件,file 能够告诉你它是一个ELF文件、PE文件(Windows可执行文件)、或其他格式的文件。

基本用法

  • 查看文件类型
file filename

例子:

file example.exe

输出可能是:

example.exe: PE32 executable (GUI) Intel 80386, for MS Windows
  • 查看文件的详细信息
file -i filename

例子:

file -i example.exe

输出可能是:

example.exe: application/x-dosexec; charset=binary

适用场景

  • 初步分析:在进行逆向工程前,使用 file 了解文件的类型和格式,判断其是否为可执行文件或特定的格式。
  • 快速识别:确定文件是否是你期望的类型(如确定是否是PE文件)。

f1le及类似的实用工具也会出错。如果一个文件碰巧包含了某种文件格式的标记,file等工具很可能会错误地识别这个文件。使用一个十六进制文件编辑器将任何文件的前4字节修改为java的幻数序列CA FE BA BE,这时,file会将这个新修改的文件错误地识别为已编译的java类数据。同样,一个仅包含MZ这两个字符的文本文件会被误认为是一个MS-DOS可执行文件。在逆向工程过程中,绝不要完全相信任何工具所提供的结果,除非该结果得到其他几款工具和手动分析的确认,这是一个良好的习惯。

1.2 PE Tools

PE Tools是一组用于分析Windows系统中正在运行的进程和可执行文件的工具,用于分析和编辑PE(Portable Executable)格式文件。PE格式是Windows操作系统下可执行文件(EXE)、动态链接库(DLL)等的标准格式。
功能

  • 查看PE文件结构:分析PE文件的各个部分,包括头部信息、节表、导入表、导出表等。
  • 分析文件属性:查看文件的编译时间、入口点、节的详细信息。
  • 识别可疑特征:检查文件中是否有常见的反病毒特征(如加壳工具、恶意代码迹象)。

基本用法

  • 打开PE文件:启动 PE Tools,通过“文件”菜单打开一个PE文件(如EXE或DLL)。
  • 查看详细信息:浏览工具提供的不同选项卡(如“头部信息”、“节表”、“导入表”)以获取有关文件的详细数据。

适用场景

  • 深入分析PE文件:了解文件的内部结构,查找特定的数据段、代码段或导入的函数。
  • 调试和逆向:分析文件的各种部分,确定其是否被加壳或包含恶意代码。

在进程列表中,用户可以将一个进程的内存映像转储到某个文件中,也可以使用PE Sniffer实用工具确定可执行文件由何种编译器构建,或者该文件是否经过某种已知的模糊实用工具的模糊处理。Tools菜单提供了分析磁盘文件的类似选项。另外,用户还可以使用内嵌的PE Editor实用工具查看PE文件头字段,使用该工具还可以方便地修改任何文件头的值。通常,如果想要从一个文件的模糊版本重建一个有效的PE,就需要修改PE文件头。

1.3 PEiD

PEiD 是另一款Windows工具,用于检测和分析PE文件的加壳和保护,并确定任何模糊Windows PE二进制文件的工具。它可以帮助你识别文件是否经过加壳或使用了特定的保护技术。
功能

  • 识别加壳工具:检测PE文件是否使用了常见的加壳工具(如UPX、AsPack、Themida等)。
  • 分析保护技术:识别文件中使用的各种保护机制,如反调试、加密技术。
  • 插件支持:PEiD 支持插件,可以扩展其功能,例如支持更多的壳和保护技术的识别。

基本用法

  • 扫描文件:启动 PEiD,选择“文件”菜单中的“打开”选项来加载目标PE文件。
  • 查看检测结果:PEiD 会自动扫描文件,提供加壳工具和保护技术的识别结果。

适用场景

  • 分析加壳文件:确定一个PE文件是否被加壳,了解其使用的加壳工具。
  • 逆向和破解:在逆向工程时,识别文件的保护技术,决定如何解壳或绕过保护机制。

PEiD的许多功能与PE Tools的功能相同,包括显示PE文件头信息摘要、收集有关正在运行的进程信息、执行基本的反汇编等。


02 摘要工具
2.1 nm

nm 是一个在Unix-like系统(如Linux、macOS)中用于列出目标文件(包括可执行文件和共享库)的符号表的工具。它可以帮助你查看程序中的函数、变量等符号的定义和引用。
功能

  • 列出符号:显示目标文件中所有的符号及其地址、类型等信息。
  • 符号分类:区分出符号是局部的还是全局的,定义的还是未定义的。(大写字母是全局符号,小写字母是局部符号)

基本用法

  • 查看符号表
nm filename

例子:

nm my_program

输出示例:

0000000000401140 T main
0000000000601020 B global_var

扩展:

U——未定义符号,通常为外部符号引用。
T ——在文本部分定义的符号,通常为函数名称。
t ——在文本部分定义的局部符号。在c程序中,这个符号通常等同于一个静态函数。
D—— 已初始化的数据值。
C—— 未初始化的数据值。

  • 查看特定符号
nm -g filename

-g 选项只显示全局符号。
适用场景

  • 分析符号:了解程序中函数和变量的定义和引用。
  • 调试:帮助定位符号的定义和未定义问题。
2.2 ldd

ldd 是一个适用于Unix-like系统的用于显示一个可执行文件或共享库所依赖的动态链接库的工具。
功能

  • 显示共享库依赖:列出程序在运行时需要加载的所有共享库及其路径。

基本用法

  • 查看共享库依赖
ldd filename

例子:

ldd my_program

输出示例:

linux-vdso.so.1 (0x00007ffed6fef000)
libm.so.6 => /lib64/libm.so.6 (0x00007f2c9c4c8000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2c9c0e6000)

适用场景

  • 分析动态依赖:查看一个程序需要哪些动态库,及其路径。
  • 调试动态链接问题:确定缺少的或路径错误的共享库。
2.3 objdump

objdump 是一个在Unix-like系统中用于显示目标文件信息的工具,功能强大,可以显示详细的汇编代码、头部信息、符号表等。
功能

  • 反汇编代码清单:将目标文件的二进制代码转换为汇编代码(objdump对文件中标记为代码的部分执行线性扫描反汇编)。
  • 显示头部信息:ELF头部、节头部等信息。
    • 节头部:程序文件每节的摘要信息。
    • 专用头部:程序内存分配信息,还有运行时加载器所需要的其他信息,包括ldd等工具生成的库列表。
  • 显示符号表:列出目标文件中的符号及其地址(以类似nm的方式转储符号表信息)。
  • 调试信息:提取出程序文件中的任何调试信息。

基本用法

  • 反汇编目标文件
objdump -d filename

例子:

objdump -d my_program
  • 显示文件头信息
objdump -f filename

例子:

objdump -f my_program

适用场景

  • 反汇编分析:查看目标文件的汇编代码,进行深入分析。
  • 文件头信息检查:了解目标文件的格式和结构。
2.4 otool

otool 是一个在macOS系统中使用的工具,用于显示Mach-O格式目标文件的信息,如库依赖、符号表、反汇编代码等。
功能

  • 显示Mach-O文件的信息:包括文件头信息、依赖库、符号表等。
  • 反汇编:将Mach-O文件的二进制代码转换为汇编代码。

基本用法

  • 显示Mach-O文件头信息
otool -h filename

例子:

otool -h my_program
  • 反汇编Mach-O文件
otool -t filename

例子:

otool -t my_program

适用场景

  • macOS下的文件分析:查看Mach-O文件的详细信息和汇编代码。
  • 动态库依赖检查:查看目标文件的动态库依赖。
2.5 dumpbin

dumpbin 是一个在Windows系统中使用的工具,用于显示PE文件的详细信息,包括符号表、导入表、导出表和反汇编代码等。
功能

  • 显示PE文件的详细信息:导入表、导出表、符号表和反汇编代码等。
  • 反汇编:显示文件的汇编代码(通过其他工具)。

基本用法

  • 显示PE文件导入表
dumpbin /imports filename

例子:

dumpbin /imports my_program.exe
  • 显示PE文件的导出表
dumpbin /exports filename

例子:

dumpbin /exports my_program.exe

适用场景

  • PE文件分析:检查PE文件的导入和导出信息。
  • 符号和依赖检查:了解PE文件的符号和库依赖。
2.6 c++filt

c++filt 是一个用于解码C++程序的名称改编(name mangling)的工具,将C++编译器生成的修饰符号转换为原始符号名称。(注释:通常,一个目标文件中不能有两个名称相同的函数。为支持重载,编译器将描述函数参数类型的信息合并到函数的原始名称中,从而为重载函数生成唯一的函数名称。为名称完全相同的函数生成唯一名称的过程叫做名称改编(name mangling))
功能

  • 解码C++符号:将被C++编译器修饰的符号名称(如经过name mangling的名称)转换为人类可读的形式。

基本用法

  • 解码符号
c++filt mangled_name

例子:

c++filt _Z3fooi

输出示例:

foo(int)

适用场景

  • 符号解析:理解C++程序中的符号和函数名称。
  • 逆向工程:帮助识别和分析C++代码中的函数和变量。

03 深度检测工具(任意格式)
3.1 strings

strings 是一个在Unix-like系统中使用的工具,用于提取二进制文件中的可打印字符串。这个工具对于逆向工程和恶意软件分析尤其有用,因为它可以帮助你发现隐藏的文本信息,比如错误消息、文件路径、网络地址等。
功能

  • 提取字符串:从二进制文件中提取连续的可打印字符序列。
  • 过滤和排序:按需过滤短小的或特定长度的字符串,便于分析。

基本用法

  • 提取字符串
strings filename

例子:

strings my_program.exe
  • 指定最小字符串长度
strings -n length filename

例子:

strings -n 5 my_program.exe

这将提取所有长度大于等于5的字符串。

  • 输出到文件
strings filename > output.txt

适用场景

  • 查找隐藏信息:揭示程序中的隐藏文本,如错误信息、配置文件路径等。
  • 恶意软件分析:发现恶意软件中的字符串,例如命令和控制服务器地址、编码方式等。
  • 文档和调试:帮助开发人员和逆向工程师分析程序的调试信息。

需要记住的是:二进制文件中包含某个字符串,并不代表该文件会以某种方式使用这个字符串。
下面是使用 strings 时的一些注意事项:

  • 使用 strings 处理可执行文件时,默认情况下,strings仅仅扫描文件中可加载的,经初始化的部分。使用命令行参数-a可强制strings扫描整个文件。
  • strings不会指出字符串在文件中的位置。使用命令行参数-t可令 strings 显示所发现的每一个字符串的文件偏移量信息。
  • 许多文件使用了其他字符集。使用命令行参数-e可使strings搜索更广泛的宇符,如16位Unicode字符。
3.2 流式反汇编器

前面介绍过很多工具可以生成二进制目标文件的死代码清单形式的反汇编代码。PE、ELF和MACH-O文件可分别使用dumpbin、objdump和otool进行反汇编。但是,它们中的任何一个都无法处理任意格式的二进制数据块。有时候,你会遇到一些并不采用常用文件格式的二进制文件,在这种情况下,你就需要一些能够从用户指定的偏移量开始反汇编过程的工具。如用于x86指令集的流式反汇编器:ndisasm和diStormp。
1. ndisasm
ndisasm 属于 nasm(Netwide Assembler)套件的一部分。它用于将机器码反汇编成汇编代码,支持各种处理器架构。
功能

  • 流式反汇编:从机器码中生成汇编语言代码。
  • 支持多种处理器架构:处理x86、x86_64等不同架构的机器码。

基本用法

  • 反汇编机器码文件
ndisasm -b bitness file

例子:

ndisasm -b 32 my_program.bin

其中 -b 32 指定反汇编32位机器码。

  • 从指定地址开始反汇编
ndisasm -b bitness -o offset file

例子:

ndisasm -b 64 -o 0x1000 my_program.bin

这将从偏移0x1000开始反汇编。
适用场景

  • 低级分析:直接查看二进制文件的汇编代码,进行低级调试和分析。
  • 教学和学习:学习机器码和汇编语言之间的关系。
  • 逆向工程:分析恶意软件或破解保护机制。

2. diStorm
diStorm 支持多种处理器架构,它可以在Python和C++中使用,适用于需要在代码中进行反汇编的场景。
功能

  • 高效流式反汇编:将机器码流转换为汇编代码。
  • 支持多种架构:x86、x86_64、ARM等。
  • 易于集成:可以与Python和C++项目集成,提供反汇编功能。

基本用法

  • Python中使用
from distorm3 import Decode
# 机器码示例
data = b"\x55\x48\x89\xe5"
for offset, size, mnemonic, operands in Decode(0, data, Distorm3.Decode32Bits):
    print(f"Offset: {
     
     offset}, Mnemonic: {
     
     mnemonic}, Operands: {
     
     operands}")
  • C++中使用
#include "distorm.h"
// 机器码示例
BYTE code[] = {
   
    0x55, 0x48, 0x89, 0xe5 };
Decode(0, code, sizeof(code), Decode32Bits, Disasm);

适用场景

  • 动态分析:在动态分析工具或自动化分析工具中使用反汇编功能。
  • 逆向工程:集成到逆向工程工具中,以提供反汇编支持。
  • 开发和测试:用于开发新的分析工具或测试现有工具的反汇编能力。

由于流式反汇编非常灵活,因此它的用途相当广泛。例如,在分析网络数据包中可能包含shellcode 的计算机网络攻击时,就可以采用流式反汇编数据包中包含 shellcode 的部分,以分析恶意负载的行为。另外一种情况是分析那些不包含布局参考的ROM镜像。ROM中有些部分是数据,其他部分则为代码,可以使用流式反汇编器来反汇编镜像中的代码。

第二部分 IDA基本用法

(三)IDA入门

01 启动IDA

只要启动IDA,你都会看到一个初始欢迎界面,上面显示你的许可证信息摘要。初始屏幕消失后,IDA将显示另一个对话框,为你进入桌面环境提供3种选项,如图3-1所示。
图3-1 启动IDA
图3-1所示的3个选项进人IDA桌面的方式略有不同,下面简单说明。

  • New(新建)。点击“New”会打开一个标准的文件选择对话框,让你选择要分析的文件。根据你选择的文件,IDA会显示其他对话框,让你设置具体的分析选项,然后再开始加载和分析文件。
  • Go(运行)。 当你点击“Go”按钮时,它会终止当前的加载过程,并将IDA重置为一个空白的工作区。接下来,如果你想要打开一个文件,你可以选择以下任意一种方法:
    • 拖放文件:将二进制文件直接拖放到IDA的工作区。
    • 使用菜单:通过IDA的“File”菜单选择打开文件。

请注意,IDA默认只显示特定类型的文件。如果你的文件没有显示出来,确保在“File”对话框中选择“所有文件”(All Files),以便能够看到你想要打开的文件。打开文件时,IDA会尝试自动识别文件类型,并会显示一个“Loading”对话框,你可以查看IDA选择了哪个加载器来处理你的文件。

  • Previous(上一个)。 点击“Previous”按钮可以从“最近用过的文件”列表中打开之前用过的文件。这个列表显示了你最近打开的文件,可以方便你重新访问它们。默认情况下,历史记录最多显示10个文件,但你可以通过编辑配置文件将这个数量增加到100。使用这个历史记录列表,可以快速找到并重新处理你最近打开过的数据库文件。
1.1 IDA文件加载

当使用“File -> Open”命令打开一个新文件时,会出现一个加载对话框(图3-2),显示IDA可能使用的文件类型列表。这个列表会显示最适合处理你选择的文件的IDA加载器。
图3-2 文件选择
IDA通过尝试每一个加载器来识别文件,并生成这个列表,比如图3-3显示的是ELF加载器。如果列表中显示了多个加载器,比如Windows PE加载器(pe.idw)和MS-DOS EXE加载器(dos.ldw),这表示它们都认为可以处理这个文件。PE格式是MS-DOS EXE格式的扩展,因此多个加载器可能都适用。
图3-3 IDA的Load a new file对话框
列表中的最后一个选项是“Binary File(二进制文件)”,这是一个默认选项,表示IDA无法识别文件时会使用这种最基础的方法来加载文件。如果有多个加载器选择,通常选择IDA推荐的默认选项是明智的,除非你有更好的信息来选择其他加载器。
有时候,Binary File是出现在加载器列表中的唯一选项。这表示没有加载器能够识别选定的文件。这时,如果你希望继续完成加载过程,请确保根据自己对文件内容的理解,选择合适的处理器类型。
在IDA中,你可以通过“**Processor type”(处理器类型)**下拉菜单来选择反汇编过程中使用的处理器类型(图3-4)。IDA通常会自动根据文件头信息选择合适的处理器,但如果它无法正确识别,你需要手动选择。
图3-4 手动选择适合的处理器
如果你选择了“Binary File”(二进制文件)格式和某种x86处理器,那么“Loading Segment”(加载段)和“Loading Offset”(加载偏移量)字段将变得可编辑(图3-5)。由于二进制加载器无法提供内存布局信息,你需要在这两个字段中输入段和偏移量值,以设置文件内容的基址。如果在加载过程中忘记指定基址,你可以随时通过“Edit -> Segments -> Rebase Program”命令来修改IDA中的基址。
图3-5 选择Binary File处理器
**“Kemel Options”(核心选项)**按钮用于配置特定的反汇编分析选项,IDA可利用这些选项改进递归下降过程。绝大多数情况下,默认选项提供的都是最佳的反汇编选项。
图3-6 Kemel Options
**“Processor Options”(处理器选项)**按钮用于选择选中的处理器模块的配置选项。这些选项可以帮助改进反汇编过程,但并不是所有处理器模块都适用。
图3-7 Processor Options
其他选项复选框可帮助用户更好地控制文件加载过程。IDA的帮助文件详细介绍了这里的每一个选项。这些选项并不适用于所有输人文件类型,多数情况下,用户可以使用IDA的默认设置。

1.2 使用二进制文件加载器

如果你选择使用二进制加载器,就需要手动完成一些通常由更高级加载器自动完成的任务,因为二进制加载器没有文件头信息来引导分析。这种情况通常发生在分析从网络数据包、日志文件中提取的ROM镜像或破解程序负载时。
图3-8 使用二进制文件加载器
如果同时选择x86处理器模块和二进制加载器,将会显示如图所示的对话框,让你选择将代码作为16位模式还是32位模式处理。IDA还可以为ARM和MI

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值