Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
反汇编基础学习(四),希望能够帮助你!!!。
在将文件加载到IDA中完成初步分析后,需要手动分析。锁业需要对IDA用户界面有充分的了解。
IDA用户界面的基本规则:
IDA不提供撤销功能: 意外操作需要手动恢复到上一步
几乎所有操作都有其对应的菜单项,热键和工具栏按钮: 可以根据需要自定义显示哪些按钮,或增加哪些按钮
IDA提供方便的、基于上写下文的鼠标右键操作菜单: 可以用来执行一些常见操作
默认情况下会对文件的初始加载分析阶段创建七个显示窗口,包括三个已经显示的IDA-view window、Functions window、Output window(反汇编窗口、函数窗口、消息输出窗口) 。如果意外关闭窗口,可以通过View->Open Subviews菜单重新打开。
反汇编窗口是操作和分析二进制文件的主要工具。反汇编窗口有两种显示格式:默认的基于图形的视图和面向文本的列表视图。可根据偏好选择,若想用文本列表作为默认汇编视图可用Option->General->IDA Options->Graph->取消Use graph view by default(默认使用图形视图)选项,也可用空格键在两种模式之间切换。
图形视图与流程图相似,它将一个函数分解成许多基本块,以生动地显示该函数由一个块到另一个块的控制流程。
基本块:指一个不包含分支,从头执行到尾的最大指令序列。因此,每个基本块都有唯一的入口点(块中第一条指令)和退出点(块中最后一条指令)。基本块中第一条指令通常是分支指令的目标,而最后一条指令则往往是一条分支指令。
在视图中不同颜色箭头代表函数之间各种类型的流,根据测试条件,在跳转位置终止的基本块可能生成两种流:Yes边的箭头(执行分支)默认为绿色;No边的箭头(不执行分支)默认为红色;只有一个后继的基本块会利用一个(蓝色箭头)正常边,指向下一个即将执行的块。
流:表示某个指令如何继续执行,正常流(普通流)表示指令默认连续执行,跳转流表示当前的指令跳转到(或可能跳转到)某个非连续性位置,调用流表示当前指令会调用一个子进程。
可根据需要,用View->OpenSubviews->Disassembly打开另一个反汇编窗口,用不同类型同时查看不同的部分。但每次只能显示一个函数,而且相应的,图形中隐藏详细的信息。也可以通过Options->General->Disassembly选择后缀为(graph)的选项,可以看到
面向文本的反汇编窗口是查看和操作IDA生成的反汇编代码的传统显示窗口,文本显示窗口会显示一个程序的完整反汇编代码清单,只有通过这个窗口才能查看一个二进制文件的数据部分。
在文本视图中,反汇编代码分行显示,虚拟地址默认显示,通常格式是 [区域名称]:[虚拟地址],如图中 .text:004010E0。
图中1.叫做箭头窗口,用于描述函数中的非线性流程,实线表示非条件跳转,虚线箭头代表条件跳转,当出现 一个(条件或非条件)跳转将控制权转交给程序中的某个之前的地址,这时会使用粗线(实线或者虚线),一般出现这类逆向流程,就表示程序中存在循环。
图中2.处的声明,是IDA对函数帧栈布局的最精确估算。IDA会对函数栈指针及函数使用的任何栈帧指针的行为进行仔细分析,从而计算出该函数的帧栈的结构。
帧栈(或激活记录):是指在程序运行时栈中分配的一个内存块,其中包含传递给一个函数的参数和该函数声明的局部变量。帧栈在函数的入口点位置分配,在函数退出时释放。
图中3.为注释,以分号开头属于交叉引用,图中是代码交叉引用(不是数据交叉引用),表示另一个程序将控制权转交给交叉引用注释所在位置的指令。
交叉引用详解
函数窗口用于列举IDA在数据库中识别的每一个函数,如下图所示。
可以通过双击跳转到相应的函数所在的位置。
sub_17EDD2F .rdata 00000000017EDD2F 000000DE 00000008 00000000 R...B..
由这一行可以得出:函数名为sub_17EDD2F,函数位置在.rdata部分地址为00000000017EDD2F 函数长为336字节(十六进制为DE字节)。
除反汇编、函数和输出窗口外,IDA还在桌面上打开许多选项卡式的窗口。这些窗口用于提供备选或专门的数据库视图,是否使用还是取决于二进制文件的特点和对IDA的熟练程度。
可以显示各种格式的代码,默认为十六进制代码,每行显示十六个字节,以及对应的ASCII字符,和反汇编窗口一样,用户也可以同时打开多个十六进制窗口Hex View-1、2、3……默认情况各窗口时同步的,且与反汇编窗口也是相对应的,一个窗口的翻页和选中会在十六进制窗口也同步翻页和突出显示相应内容。在反汇编窗口选中一个项目,十六进制窗口的回应字节也会突出显示。
在十六进制窗口内右键->Synchronize with->取消选中IDA View-A 可以停止上述的同步,右键->Edit 可以转换为十六进制编辑小窗口,右键->Date Format 可以选择不同的显示格式,如1、2、4、8字节十六进制,带签名的十进制,或不带签名的十进制帧数及各种浮点格式。也可通过右键->Columns菜单项更改显示的列数,右键->Text选项打开或关闭文本块。
有时十六进制窗口显示的全是问号,这表示IDA无法识别给定的虚拟地址范围内的值。如果程序中包含一个bss节,就会出现这个情况,通常bss节不占用文件空间,但加载器会扩展这一节,以适应程序的静态存储要求。
bss节: bss节由编译器创建,用于保护程序的所有未初始化的静态变量。因为没有为这些变量指定初始值,所以没有必要在程序文件镜像中为它们分配空间;只需在程序的一个头文件中注明其大小。当程序执行时,加载器会为其分配所需的空间,并将整个数据块的初始值设为0。
导出窗口列出文件的入口点。这包括程序的执行入口点(在程序的头文件部分指定),以及任何由文件的导出给其他文件使用的函数和变量。通常,用户可在共享库(例如Windows DLL文件)中找到导出的函数。导出的项目按名称、虚拟地址和序列(如果可用)排列。对于可执行文件,导出窗口中至少包括一个项目:程序的执行入口点。IDA将这个入口点取名为start。导出窗口中
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章