添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

IDA-VIEW /disassembly

空格切换列表、图形视图

图形视图将 一个函数 分解成基本块(基本块是连续执行的指令序列,通常开头是分支指令的目标,最后一条指令是分支指令)

IDA用 流 描述指令执行。正常流(普通流)表示默认执行连续执行,跳转流跳转(或可能跳转)到非连续位置。调用流表示调用子例程

基本块后,红色边(no)表示不执行跳转时,绿色边yes表示执行时。(IDA是静态分析工具,只是提供不同情况时的执行,不是说真的只走yes)。只有一个后续块的用蓝色

列表视图,完整显示程序(不像图形视图只显示一个函数)

Options general disassembly 可以修改显示形式

下图中,前面为虚拟地址(格式为[区域名称]:虚拟地址),2处表示IDA对函数栈帧的判断,详见第六章。

下图中,注释表示交叉引用。详见第九章

下图中虚线表示条件跳转,实线表示非条件跳转。加粗的,向上的线,逆向跳转,通常表示循环

5.1.2 函数窗口

在那个部分(.init)的哪个虚拟地址(80000),找到了该函数。函数长度为0x34 字节。R表示返回调用方,其他可参考IDA--HELP

右键可以设置数据格式。

右键Edit可以修改内容。

通常,在绑定时,选定反汇编窗口的内容,对应的16进制窗口的字节也会高亮显示。滚动一个窗口,对应窗口也会随之调整位置。如图,光标指向0040108C,构成该地址指令的5个字节高亮显示

若16进制窗口显示问好,表示无法识别。如.bss节

5.2.2 exports

列出文件的入口点。包括程序的执行入口点(在程序文件头部分指定),和文件导出给其他文件使用的  函数  和 变量

通常可在共享库找到到处的函数。

名称  虚拟地址  序数(Ordinal)

Export一般至少包含一个项目 start,即程序执行的入口点。标注[main entry]

export还提供objdump -T、readelf -s、dumpin 、EXPORTS类似的功能

5.2.3 imports

显示动态链接的函数。地址为相关导入表条目的虚拟地址。

仅显示动态加载器自动处理的符号,对dlopen/dlsym或LoadLibrary/GetProcessAddress等机制自行加载的符号不显示在此表

5.2.4 结构体窗口

一方面,IDA自动分析函数参数类型和使用的内存,根据签名库匹配,判断二进制文件中使用了哪种结构体。

右键 list 可以看到具体的使用这个结构体的函数

另一方面,可以自定义结构体,用以表示在分析过程中我们自己发现的,程序使用的结构体。在第八章详细讨论

5.2.5 Enums

类似Structures窗口。open-subviews

5.3 其他IDA窗口

5.3.1 strings窗口

提供类似strings 的功能,每次打开都重新扫描数据库,搜索字符串并显示。右键setup 可以更改搜索的字符串的条件(比如长度、风格(windows程序常用的unicode))

结合交叉引用可以追踪字符串、哪里引用了该字符串

Ignore instruction definitions可以忽略数据/代码的定义,扫描全部的字符串。类似strings -a

5.3.2 names窗口

列举IDA识别的所有 全局名称。名称即虚拟地址的符号描述

需要注意的是,IDA在反汇编过程中,会为直接作为代码(分支或调用目标)和数据(读取的、写入到、使用的地址)引用的位置生成名称。

即将某位置命名为函数或数据。

然而有些数据/函数已经在程序符号表命名,IDA会直接使用该表中的名称。若没有,则自动生成。自动生成的名称不会列在Names table

自动命名的规则是类型+虚拟地址

5.3.3 segment 段窗口

IDA常将段(segment)称为节(section)。不要和内存分配搞混

提供了objdump -h,readelf -s,dumpbin /headers 类似的功能

5.3.4 Signatures 签名窗口

IDA使用签名识别函数。如图表示使用vc32rtf签名,识别了501个函数

右键,apply new sig 可以应用新签名,详见12章

5.3.5 类型库type library 窗口

5.3.6 functions calls函数调用窗口

谁调用,调用谁。

IDA使用交叉引用(xrefs)生成此窗口,见第9章

Graphs-function calls可以看见完整的调用图

5.3.7 问题窗口

参考IDA-HELP--Problem List

标注分析过程中遇到的问题

BOUNDS 无法确定调用/跳转的目标,或超出地址范围等等

可以随时使用IDA->Help搜索查看不明白的问题、定义

虚拟地址:与物理地址间的区别

栈帧 程序运行时栈中分配的内存块。包含传递的函数参数和函数的局部变量。栈帧在函数入口点分配,在函数退出时释放

bss节 由编译器创建,保存程序未初始化的静态变量。在程序的文件镜像中没有为它分配空间。只需在程序的一个头文件注明大小,程序执行时,加载器为其分配空间,初始化为0

序数 Ordinal:一些共享库(DLL)可能使用导出序数,使用户可以通过序数而非函数名访问函数。从而加快地址查询速度,隐藏函数名称

导入表:为加载器提供空间,用于在加载所需库并获知导入函数的地址后保存导入函数的地址。一个导入表条目保存一个导入函数的地址。目前的理解是:类似于数组,程序根据所需函数访问相应条目,得到所需调用函数的真实地址。

程序符号表