刚刚入门逆向,对这方面知识近乎于0,因此写着一篇笔记,记载自己不懂的和搞会的,以供日后查阅使用。在下才疏学浅,虽然本文内容较为基础,但是难免有不对之处,敬请指正。
IDA是什么
IDA是一款功能强大的静态分析工具,可以实现汇编代码转为伪C代码,可以分析许多可执行文件,因此是逆向的时候的不二工具。
下面,从进入IDA的界面为顺序,依次介绍它的有关功能。
由于不同的架构版本的程序需要使用不同的IDA版本打开。我们可以先使用DIE查看软件架构和编写语言来确定使用哪款IDA,也可以使用任意版本IDA打开,会自动提示,如下所示。
因此 我们需要使用64版本的IDA打开此文件。
主界面
导航栏
这里显示程序内函数的不同情况。 通过导航条可了解分析可执行文件各部分数据分布情况。
右键菜单中的zoom可以放大缩小,两个对勾的内容分别对应图例和导航栏右侧的下拉菜单,可以先不管。
汇编窗口
这里是汇编主窗口,点击空格可以切换两种视图模式。
函数窗口
在这里可以查看程序之中的函数,点击ctrl+F即可进行筛选函数。
按下“Alt+T”组合键,也可快速打开查找文本的对话框,输入查找内容进行搜索。
按delete键,删除某个函数。
输出界面,在这里还可以输入python代码。
数据类型操作
点击U键,取消某地方已有的数据类型定义。D键,让某一个位置变成数据,一直按的话,会按照1-2-4-8字节循环。C键,让某一个位置变为指令。以下内容来源于豆包。
- 字节(Byte):用于表示单个字节的信息,如一个字符或一个 8 位的整数。在十六进制视图中,每个字节以两位十六进制数表示,可用于查看和修改程序中的单个字节数据,适用于分析简单的数据结构或处理字节流的情况。
- 字(Word):字类型数据通常占用两个字节,可用于表示 16 位的整数或其他具有 16 位长度的数据。在 IDA 中,定义字类型数据有助于正确解析和操作这类数据,特别是在涉及到一些特定的 16 位数据格式或指令操作数时非常有用。
- 双字(Dword):双字类型数据占用四个字节,对应 32 位的整数或其他 32 位长度的数据。它是 IDA 中常用的数据类型之一,许多寄存器和内存操作都以双字为单位进行,正确定义双字类型数据对于理解程序中的数据处理和内存访问非常关键,特别是在分析 32 位程序时经常会用到。
- 四字(Qword):四字类型数据则占用八个字节,用于表示 64 位的数据,如 64 位整数或指针等。随着计算机系统向 64 位架构的发展,四字数据类型的使用也越来越常见,在分析 64 位程序或处理需要高精度数据的情况下,定义四字类型数据能够确保数据的正确解析和操作。··············································································································
- 字节(Byte):是最基本的数据单位,可表示范围为 0 - 255 的无符号整数,或 - 128 - 127 的有符号整数,它是构建其他更大数据类型的基础。在 C、C++ 等编程语言中,对应的基本数据类型为
unsigned char
或signed char
。- 字(Word):由两个字节组成,可表示范围为 0 - 65535 的无符号整数,或 - 32768 - 32767 的有符号整数。在一些编程语言中,如早期的 16 位汇编语言或某些特定的嵌入式系统编程中,字是常用的数据类型,对应的 C、C++ 数据类型为
unsigned short
或signed short
。- 双字(Dword):四个字节的双字能够表示更大范围的整数,无符号双字可表示 0 - 4294967295,有符号双字可表示 - 2147483648 - 2147483647。在 32 位编程环境中,双字是非常常见的数据类型,与 C、C++ 中的
unsigned int
或signed int
相对应,广泛应用于各种数据处理和内存操作。- 四字(Qword):作为 8 字节的数据类型,四字能够表示极其大的整数范围,无符号四字的范围是 0 - 18446744073709551615,有符号四字则可表示 - 9223372036854775808 - 9223372036854775807。在 64 位编程中,四字数据类型与
unsigned long long
或signed long long
相对应,用于处理需要高精度或大数值范围的数据,如 64 位系统中的内存地址、大文件的偏移量等。
更多的窗口,请看上图。利用这个方式打开。
HexRays编译器
它可以转为伪C代码,便于逆向分析。
更改标识名
在一个变量名字上按N键即可。会提示你进行修改。
按Y,可以修改变量类型
在一个常量后面右键,可以修改数据显示格式。char为字符,快捷键是R,Octal是八进制,Hex开头的是十六进制,快捷键是H。
在 IDA(Interactive Disassembler)中,切换数据显示格式和切换数据类型是两个不同的操作,它们的区别如下:
概念含义
- 切换数据显示格式:主要是指改变数据在 IDA 界面中的呈现方式,例如将十六进制数据显示为十进制、二进制,或者将数据以不同的字节序显示等,数据本身的类型和内容并未改变,只是显示形式的变化。
- 切换数据类型:则是指改变 IDA 对数据的解析和理解方式,将数据从一种数据类型重新定义为另一种数据类型,如将一个字节数组重新定义为一个整数、指针、结构体等,这会影响到 IDA 对数据的后续分析和处理。
操作目的
- 切换数据显示格式的目的:通常是为了方便用户以不同的视角查看数据,以更直观地理解数据的表示和含义。比如在查看内存数据时,十六进制格式可能更适合查看原始数据,但在某些情况下,将其切换为十进制格式能更方便地读取数据的数值大小。
- 切换数据类型的目的:是为了让 IDA 更准确地对数据进行分析和反汇编。当 IDA 错误地识别了数据类型,或者用户需要以特定的数据类型来理解一段数据时,就需要切换数据类型,以便 IDA 能够按照新的数据类型进行正确的反汇编和分析,从而更好地理解程序的逻辑和数据结构。
对分析结果的影响
- 切换数据显示格式:一般不会对 IDA 的分析结果产生实质性的影响,只是改变了数据的显示外观,不涉及数据的语义和程序的逻辑结构,分析结果仍然基于数据的原始类型和定义。
- 切换数据类型:会直接影响 IDA 的分析结果和反汇编代码的生成。因为不同的数据类型具有不同的存储方式和操作语义,切换数据类型后,IDA 会根据新的数据类型重新解释数据,并可能生成不同的反汇编指令和数据引用,从而影响到对程序功能的理解和分析。
应用场景
- 切换数据显示格式的常见场景:在查看内存数据、寄存器值、指令操作数等时,根据需要灵活切换显示格式,以便更清晰地观察数据的特征。比如在调试加密算法时,可能需要将密文数据在十六进制和二进制之间切换显示,以方便查看数据的位模式。
- 切换数据类型的常见场景:当遇到 IDA 自动识别数据类型不准确的情况,如将一个实际上是指针的数据错误地识别为普通整数时,就需要手动切换数据类型为指针,以便正确地跟踪和分析程序中的指针操作。又如在分析复杂的数据结构时,需要将一段连续的内存区域定义为特定的结构体类型,以便更清晰地理解数据之间的关系。