这篇文章主要来说一下IDA的基本使用,那么在此之前先来准备一个简单的程序,作为IDA使用的实例。VS 创建一个C++项目,并设置项目属性:设置运行库为MTd(默认是MDd)
运行库选项区别:
在Visual Studio中,运行库选项(Runtime Library)决定了项目在编译和链接时使用的C/C++运行时库。Visual Studio中的主要运行库选项包括:
1. /MT (Multi-threaded):使用多线程、静态链接的C运行时库。这意味着C/C++运行时库代码会被直接嵌入到生成的可执行文件或库文件中,生成的可执行文件不依赖外部的C运行时DLL(如msvcrt.dll),因此在没有外部DLL的情况下也能运行,但是最终生成的二进制文件可能会较大。 2. /MTd (Multi-threaded Debug):与/MT类似,但使用的是调试版的C运行时库。这些库包含额外的调试信息,并在运行时执行更多的检查,有助于在开发阶段发现内存泄漏和其他运行时错误。但是,生成的二进制文件较大,而且包含调试信息,性能不如发布版好。 3. /MD (Multi-threaded DLL):使用多线程、动态链接的C运行时库。程序在运行时依赖于C运行时DLL(如msvcrt.dll),因此需要在目标系统上确保这些DLL存在。 4. /MDd (Multi-threaded Debug DLL):与/MD类似,但使用的是调试版的C运行时库。调试版的DLL通常是msvcrtd.dll。
直接生成程序:
打开当前项目所在目录,找到生成的exe程序;可以看到与exe同目录下还存在着.ilk
和.pdb
两个文件;那么这两个文件是什么,与exe文件的关系又是什么。
ilk文件(增量链接文件)
.ilk文件记录了上一次链接操作的信息,包括哪些对象文件发生了变化。这样,在后续的编译过程中,如果只有部分代码发生了变化,链接器可以利用.ilk文件中的信息,仅对更改部分进行链接,而不需要重新链接整个项目。增量链接的主要目的是加快开发阶段的链接时间,特别是对于大型项目,这种方式可以显著减少每次编译所需的时间。
pdb文件(调试信息文件)
.pdb文件包含了与可执行文件关联的调试符号和源代码信息。这些信息包括函数名、变量名、源代码行号等。在调试时,.pdb文件使得调试器能够将二进制代码映射回源代码,从而允许开发者查看变量的名称和类型、设置断点、查看调用堆栈以及源代码的确切行号等。没有.pdb文件,调试器只能展示汇编代码和原始的内存地址,极大地增加了调试的难度。
有.pdb
文件时,静态分析可以更加直接和高效,工具能够提供丰富的符号信息、源代码映射、调试功能等,大大简化了理解和分析程序的过程。
OK,程序准备完成,我们正式开始来说说IDA的基本使用方法。我们只要将程序拖到IDA中即可。
拖入后会显示一个窗口,这边可以选择使用哪种方式对该程序进行解析:
①Portable executable for 80386 (PE) [pe.dll] #以解析PE文件的方式对其进行解析
②MS-Dos executable (EXE)[dos.dll] #以DOS方式对其进行解析
③Binary file #以二进制文本的方式对其进行解析
①Portable executable for 80386 (PE) [pe.dll]
这是 Windows 平台上常见的可执行文件格式,适用于 80386 及以上的处理器架构。PE 文件格式包括了用于 Windows 操作系统的所有类型的可执行文件(EXE、DLL、SYS 等),选择这个选项时,IDA 会使用 pe.dll
插件来解析和反汇编 PE 文件。这种格式包含丰富的元数据,如导入/导出表、资源表等,方便反汇编和逆向工程分析。
②MS-Dos executable (EXE)[dos.dll]
这是早期 DOS 操作系统使用的可执行文件格式,主要用于 16 位程序。虽然现代系统很少使用这种格式,但在分析老旧软件或遗留系统时仍然有用。选择这个选项时,IDA 会使用 dos.dll
插件来解析和反汇编 DOS 可执行文件。这种格式的结构相对简单,通常不包含复杂的元数据。
③Binary file
这是一个通用选项,适用于没有特定文件格式的原始二进制文件。这种文件通常没有固定的结构或元数据;选择这个选项时,IDA 不会使用任何特定的插件进行解析,而是将文件作为原始的二进制数据加载。用户需要手动指定入口点、处理器架构、加载地址等信息,以便 IDA 进行正确的反汇编。这对于嵌入式系统固件、裸机程序等没有标准文件格式的二进制文件尤为有用。如果IDA不能识别的二进制代码,例如ShellCode代码,可选择Binary file
方式加载,
一般我们在解析exe文件时选择Portable Executable for 80386 (PE) [pe.dll]
即可。
除此之外在这里我们还可以选择程序的架构类型:
此处根据程序架构进行选择即可,选择完成点击OK后IDA就能对程序进行分析,分析的内容可以包括源代码(如果可用)、反汇编代码、反编译后的伪代码、程序结构、数据流、控制流等。这个时候我们就可以得到这样一个页面:
IDA组件介绍
接着我们就来说一下这个页面中都包含了哪些内容:
1.导航条
主界面中存在一项颜色各异的导航条。通过导航条可了解分析可执行文件各部分数据分布情况,它用于概览和快速跳转到二进制文件的不同部分;导航条提供了对程序整体结构的可视化表示,并通过颜色编码显示不同类型的内容。部分颜色代表含义如下:
蓝色:表示常规的指令函数,绝大部分为用户编写的代码,上图中绝大部分数据属于蓝色数据。 黑色:表示间隙部分内容,可执行文件中包含多个节段,相邻节段之间存在空隙,红色表示空隙部分。 银白色:表示数据项部分内容,可执行文件中会包含大量数据,银白色表示数据项部分内容。 粉色:表示外部导入符号,通常可执行文件会导入外部的库函数。 暗黄色:表示IDA未识别的内容,需要用户根据需求自行分析。
当然,IDA也允许用户自定义导航栏的颜色:option
->colors
->navigation band
在这个位置用户可以根据自身喜好对导航栏各部分内容所显示的颜色进行设置。
2.反汇编窗口
IDA View-A
显示的是反汇编视图
,也就是目标二进制文件的汇编代码。这是IDA中最常用的视图之一,用于展示程序的机器代码如何被反汇编成汇编语言指令。
反汇编窗口可分为两种模式,分别为:默认模式和图形模式。在IDA的View-A
(反汇编视图)中,按下空格键
,会在反汇编视图
和图视图
(Graph View)之间切换。
①反汇编视图(如上图):显示程序的汇编代码,可以看到每条指令的地址、机器码和对应的汇编指令;这个视图以线性的方式显示代码,即按内存地址顺序逐行显示。 ②图视图:展示了函数的控制流图(Control Flow Graph, CFG),这是一个可视化的图表,显示了函数中的各个基本块(Basic Block)以及它们之间的跳转关系。
3.Hex View-1
在IDA中,Hex View-1
是一个专门用于显示和分析二进制文件原始字节数据的窗口。这个视图展示了程序的原始内容,即内存中的实际字节值,以十六进制(hexadecimal)形式显示。
二进制窗口可支持用户查看可执行文件对应相对偏移的二进制机器码数据;Hex View-1视图分为左侧,中间,右侧三个部分:
①左侧:显示内存地址,这些地址表示显示的每一行字节数据在内存中的位置,地址列帮助我们定位程序在文件或内存中的特定部分。 ②中间部分:显示内存中的原始数据,每行通常有16个字节,每个字节以两位十六进制数表示;直观地表示了文件或内存中的实际内容,这对于分析文件格式、识别数据结构或查找特定的字节模式非常有用。 ③右侧:显示每个字节对应的ASCII字符;可以帮助我们识别数据中的字符串或文本内容,例如可读的文件名、路径、标识符等。
右侧内容乱码解决方法:
Options->general->Strings->Default 8bit修改为UTF-8
修改后的结果:
3.结构窗口(Structures)
Structures
用于管理和查看程序中定义的结构体(structures)。这个窗口允许你查看、编辑和创建结构体,从而更好地理解和解析二进制文件中复杂的数据结构。结构体在逆向工程和调试中起到关键作用,特别是在处理涉及多字段的复杂数据时。
Structures窗口列出了所有在程序中定义的结构体。每个结构体都有一个名称以及与其相关的属性。我们可以通过双击结构体的名称来查看其详细内容,包括结构体的字段、字段的类型和大小等信息,还可以直接在这个窗口中编辑现有结构体或添加新字段。
结构窗口提供用户查询已定义的结构体,同时IDA可识别出可执行文件包含的部分结构体数据,结构窗口可通过快捷键“+”、“-”(或双击结构体名)展开和收缩结构体,IDA结构窗口支持用户自定义结构体。
4.枚举窗口(Enums)
Enums
(枚举)窗口是一个用于管理和查看程序中定义的枚举类型的工具。
5.导入函数窗口(Imports)
Imports窗口
是一个用于查看和管理程序中导入函数和库的工具。导入(imports)通常是指程序从外部库(如动态链接库DLL)中引用的函数和变量。这些导入的函数和变量在程序运行时由操作系统加载,并链接到程序中使用。
IDA提供导入函数窗口,用于可在导入函数窗口中查看当前可执行文件导入哪些外部函数库及函数,通过导入函数窗口可获取到函数内存相对偏移地址、函数名、导入函数所属的库文件。
6.导出函数窗口(Exports)
Exports窗口用于显示和管理当前分析的二进制文件中导出的函数和变量。导出(exports)通常是指程序或动态链接库中可以被其他程序或模块引用和调用的函数和变量;这些导出项使得一个模块能够提供功能或数据给其他模块使用。IDA的导出函数窗口提供可执行文件导出函数信息,通过导出函数窗口可获取到导出的函数名、函数对应的内存相对偏移地址。
7.函数窗口(Function Window)
在IDA中,函数窗口
(Functions Window)是一个非常重要的工具,它列出了当前分析的二进制文件或可执行程序中所有已识别的函数。这个窗口有助于你快速浏览、定位和分析程序中的不同函数,是逆向工程和程序分析的核心部分之一。
在窗口按下“CTRL + F”快捷键便可根据需求搜索函数名,快速定位函数名方式可提供逆向分析效率。
8.Strings窗口
Strings窗口
是一个专门用于显示和管理二进制文件或可执行文件中字符串的工具。字符串通常是程序中存储的文本数据,如错误信息、调试信息、用户提示、文件路径、网络地址等。通过分析这些字符串,你可以获得有关程序功能、逻辑和操作的许多有用信息。Strings窗口默认是不显示的,开启的路径为:
View->Open Subview->Strings
IDA的快捷键:
这边先写几个,后续文章如果有用到其他的快捷键则在后续文章中进行补充。
1.注释
添加注释很简单,只是一个快捷键分号;
,找到需要添加注释的代码块,按下分号,输入注释内容即可。
2.空格键:反汇编窗口切换文本跟图形
3.交叉引用
交叉引用
(Cross-Reference,简称Xref)在软件逆向工程和程序分析中是一个非常重要的概念,它指的是在代码中,一个特定的符号、函数、变量或数据被引用(使用)的所有位置,通过分析交叉引用,你可以了解一个符号在程序中的使用情况,追踪程序的执行流,以及理解程序的逻辑和结构。
快捷键:Ctrl+X,类似于OD中的栈回溯操作;此时我选择_main函数,输入Ctrl+X则会显示该函数在何处被引用
点击OK后则跳转至被引用的位置:
4.打开签名窗口
签名窗口
(Signatures Window)是一个用于管理和应用函数签名的工具,函数签名是预定义的函数特征,用于自动识别二进制文件中的已知函数,通过应用签名,IDA 可以帮助你快速标识和命名那些常见的或已知的库函数,从而减少手动分析的工作量。
快捷键:Shift+F5
5.搜索字符串(文本搜索)
快捷键:Alt + T
无论你是刚刚踏入逆向工程领域的新手,还是经验丰富的安全研究员,IDA都能帮助你更高效地理解和解读复杂的二进制文件。逆向工程的道路充满挑战,但也是不断发现和学习的过程。愿你在未来的探索中,能够利用IDA这把利器,攻克更多的技术难题,收获更多的成就感。
【注】:后台回复“IDA”获取IDA工具,另外还有其他学习数据也可以自行回复获取。