IDA介绍

  • IDA是一款递归下降反汇编器

动态分析

动态分析是指在严格控制的环境下(沙盒)中执行恶意软件,并使用系统检测实用工具记录其所有行为。

静态分析

静态分析则试图通过浏览程序代码来理解程序的行为。此时,要查看的就是对恶意软件进行反汇编之后得到的代码清单

安全审核过程

  1. 发现漏洞:发现程序中潜在的可供利用的条件

  2. 分析漏洞

  3. 开发破解程序

两种反汇编基本算法

  • 线性扫描

  • 递归下降

IDA打开与关闭

打开IDA

  • 新建:将一个.exe等可执行文件进行逆向

  • 运行:点击运行将进入IDA空白界面,可以点击左上角选择要逆向的文件或打开已经逆向过的文件

  • 载入:自动加载上一个已经逆向过的文件

新建

  • 点击新建后需要选择文件

  • 选中该文件:会出现以下界面()

运行

  • 点击运行后会出现空白界面

  • 可以点击文件进行.exe文件的逆向,或者打开已经逆向过的文件

载入

  • 点击载入可以加载上次逆向的程序

逆向程序

  • 在逆向一个新的.exe等可执行文件时会出现该弹窗

  • 这个弹窗将显示最适合处理选定文件的IDA加载器。

  • IDA通过执行loaders目录中的每一个文件加载器,来确定能够识别新文件的加载器,从而创建了这个列表。

  • .dll(Dynamic Link Library)后缀:动态链接库

    • DLL文件包含了一组可供程序共享和重用的函数、数据和代码,广泛用于Windows操作系统中的各种程序。然而,由于DLL文件经过编译和链接处理,其中的代码对于普通人来说并不易于理解和阅读。
  • 二进制下面的Processor Type是处理器类型

    • 下面呈现的是在反汇编中使用的处理器模块

    • 多数情况下,IDA将根据它从可执行文件中读到的信息,选择合适的处理器。

    • 如果IDA无法正确确定与打开的文件关联的处理器类型,在继续文件加载操作前,必须手动选择处理器类型

  • 加载段和加载偏移量

    • 如果同时选择了二进制文件输入格式和一种x86系列处理器,加载段和加载偏移量字段将处于活动状态。

    • 由于二进制加载器无法提取任何内存布局信息,在这里输入的段和偏移量将共同构成所加载文件内容的基址。

    • 在最初加载过程中如果忘记指定基址,可以在任何时候使用编辑->加载段->Rebase program来修改IDA镜像的基址

    • 修改内存中指定数量的字节,整个程序将会被改变。

  • 核心选项

    • 用于配置特定的反汇编分析选项,IDA可利用这些选项改进递归下降过程。

    • 绝大多数情况下,默认选项提供的都是最佳反汇编选项

  • 处理器选项

    • 用来选择适用于选中的处理器模块的配置选项,但它不一定对每个处理器模块有效。

Portable executable

MS-DOS

二进制

关闭IDA

Don’t pack database

不要打包数据库

  • 使用IDA逆向后的文件会分开放,而不会打包成一个文件

Pack database (Store)

打包数据库(存储)

  • 可以将IDA逆向后的文件打包成,一个文件,再删除不打包的时候零散的文件

  • 再次打开的时候就只需要打开.i64文件即可,该文件会存储使用IDA逆向时我们改动的数据

Pack database (Deflate)

打包数据库(压缩)

  • 将文 件打包后,将没打包的文件压缩存储到打包的文件里面

Collect garbage

收集垃圾

  • 如果当前逆向文件越来越大,在关闭的时候选中这个,会将无用内存清理干净

DON’T SAVE the datebase

不保存数据库

  • 在逆向文件里面做了很多操作,但是不希望保存,ida没有提供后退功能,此选项是解决错误操作在ida里面的唯一办法

IDA界面与操作

图形界面和文本界面

  • 图形界面

  • jz是跳转的意思,条件成立则执行绿色箭头方框内程序,条件不成立则执行红色箭头方框内的程序

  • 文本界面

  • 按住CTRL然后滑动鼠标滚轮即可放大和缩小该界面

  • 可以利用空格进行文本界面与图形界面的切换

导航条

  • 导航条上不太颜色代表不同的块,有数据块部分、常规函数块部分等
  • 光标悬停在导航带任何位置会指出其在二进制文件中的位置
  • 点击导航带上的任何位置,下方窗口都会跳转到相应位置
  • Options-color可以修改导航栏的颜色

窗口

  • Functions

  • IDA View-A

  • Hex View-1

  • Enums

  • Imports

  • Exports

Functions

  • 函数窗口,每个函数都有一个IDA自动生成的名字(之后可以自行修改函数名字),双击一个函数,会跳转到反汇编窗口这个函数所在的位置

IDA View-A窗口

  • 反汇编窗口

  • 上图是图形视图,可以比较直观的看清跳转方位

  • 按空格键可以和文本视图相互切换,下图是文本视图

  • .text:00517000为区域名称加虚拟地址

  • 图中.text是代码段

  • CTRL+ "+"或者 CTRL + 滑动鼠标滚轮 实现界面的缩放

  • views->open subviews->Disassembly(或者是视图->打开子视图->反汇编)

    • 可以打开另一个反汇编窗口,每个反汇编窗口互相独立,可以一个查看图形,另一个查看文本

  • IDA使用不同的箭头颜色来表示不同的流

    • 条件跳转Yes是绿色箭头,No是红色箭头,默认为蓝色箭头

  • 在文本窗口中也有跳转箭头,下图中,文本窗口的左边是箭头窗口,用于描述非线性流程

    • 虚线是条件跳转

    • 实线是非条件跳转

    • 粗实线表示程序将控制权交给程序中的以前的某个地址,通常表示程序中存在循环

  • 下图红框是反汇编形成的汇编代码

  • 封号后面的绿色字是注释

    • 按下“ ;”可以添加注释,用于逆向分析使用

    • 图中 CODE XREF: sub_942600+3C↑j是自动生成的表示此处有交叉引用的注释

    • sub_942600+3C↑j 表示一个地址,形式是函数+偏移量,↑表示该地址在上面

  • 图形视图可以用鼠标滚轮加Ctrl进行拖动,进行缩放

  • 有时我们需要用缩小的抽象图片来观察程序执行流程的一些特点

HEX View-1

  • 反汇编窗口的十六进制形式
  • 显示的是程序内容和列表的标准十六进制代码(每行十六个字节)还会显示对应的ASCII字符
  • 有时string窗口显示的字符串不好查看时,可以打开Hex view查看

  • 右键->Sychronize with(右键->同步到)可以选择时是否与某个反汇编窗口相互关联,关联后,两个窗口会同时改变位置

Structures

  • 结构体窗口,为标准数据结构的布局提供现成的参考。

  • 为你提供一种方法,发现程序使用的自定义数据结构时,帮助你创建自己的,可用作内存布局的数据结构

  • 如果IDA没有出现结构体窗口可以在views->open subviews->Structures(或者是视图->打开子视图->结构体)()

Enums

  • 枚举类型,在反汇编的时候ida会自动识别一部分,之后人为识别然后再添加到该部分
  • 显示检测到的标准枚举数据类型(C enum),可以自定义枚举类型

Strings

  • views->open subviews->Strings打开窗口(视图->打开子视图->子串)

  • 显示的是从二进制文件中提取出来的一组字符串,以及字符串所在的地址

  • 从中可以查找程序中使用的字符串(有时也可以用Hex view查勘字符串,但是一般在string窗口中检索想要的关键字符串)

  • 与交叉引用相结合可以快速定位字符串,跟踪到程序中引用这个字符串的位置

Names

  • 显示全局名称

  • 名称是指对一个程序虚拟地址的符号引用

    • F常规函数

    • L库函数

    • I导入的名称

    • C命名代码

    • D数据

    • A字符串数据

Impots

  • 查看当前程序使用了哪些模块的哪些函数

  • 根据导入表生成

Exports

  • 查看当前程序导出了哪些函数

  • 根据导出表生成

硬编码操作(ACDU)

  • 在某些程序的反编译过程中,IDA可能将原本是数据的部分当成了指令,把指令部分当成了数据,此时就需要我们人工的手动进行干预,因此我们需要了解IDA的ACDU这四种硬编码显示模式。

  • ACDU可以将一段数据类型转化成代码(C)数据(D)未定义的二进制数据(U)字符(A)

  • 按下(A)

IDA上方使用栏

文件(File)

新建实例(New Instance)

  • 新建一个IDA项目,可以同时反汇编两个文件

打开(Open)

  • 打开一个二进制文件或者IDA数据库(.idb后缀)文件

加载文件(Load file)

重新加载输入文件(Reload the input file)

  • 反汇编器可能在某个地方反汇编出的结果与预期有偏差

附加二进制文件(Additional binary file)

  • 可能是与该文件关联的动态库文件等

  • 系统启动的文件

IDS/IDT文件

  • 符号文件

PDB file

  • 调试信息文件

DBG file

  • 调试信息文件

TDS file

  • 调试文件

FLIRT签名文件

分析C头文件

  • 如果有源码的话,可以选择该选项打开C头文件,可以帮助后续的逆向工作

生成文件(Produce file)

创建MAP文件

  • 映射信息文件,一般是在动态库里面,表面动态库有哪些函数或者变量是导出的,可用的

创建ASM文件

  • 生成一个汇编的文件,将dll二进制的可执行程序,生成汇编的程序来

创建INC文件

  • 汇编当中用到的头文件

创建LST文件

  • 列表文件,列出一个类似于映射表的东西

创建EXE文件

  • 如果有二进制文件,如果想生成.exe文件,点击此即可,将会封装一些东西

创建DIF文件

  • 两个文件之间有什么差异,生成一个差异

创建C文件

  • 把当前的汇编代码生成C文件

创建HTML文件

  • 字面意思,创建网页文件

创建流程图GDL

  • 函数怎么调用到程序来

创建调用图GDL

  • 程序是怎么调用函数的

创建C头文件

数据库转储到IDC文件

类型数据转储到IDC文件

脚本文件

编辑(Edit)