当IDA加载后,3个立即可见的窗口分别为IDA-View窗口、函数窗口和消息输出窗口,所有窗口都可通过View▶Open Subviews菜单打开
反汇编窗口
反汇编窗口也叫IDA-View窗口,它是操作和分析二进制文件的主要工具
0.在反汇编窗口中,ESC键的作用与Web浏览器的“后退”按钮类似,遗憾的是,在打开的其他窗口中,ESC键用于关闭窗口
IDA使用术语流来表示某个指令如何继续执行。正常流(也叫做普通流)表示指令默认连续执行。跳转流表示当前的指令跳转到(或可能跳转到)某个非连续性位置。调用流表示当前指令会调用一个子例程。
图形视图
图形视图会让人联想到程序流程图,因为它将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程。
1.IDA使用不同的彩色箭头区分函数块之间各种类型的流。
根据测试条件,
在条件跳转位置终止的基本块可能会生成两种流:
Yes边的箭头(是的,执行分支)默认为绿色,No边的箭头(不,不执行分支)默认为红色。
只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块。
2.可以使用“CTRL+鼠标滑轮”来调整图形的大小:
在图形模式下,IDA一次显示一个函数,键盘缩放控制需要使用“CTRL+加号键”来放大,或使用“CTRL+减号键”来缩小,大型或复杂的函数可能会导致图形视图变得极其杂乱,但图形概况窗口会始终显示完整的块状结构,并用一个虚线框指出你当前所在的图形区域。你可用鼠标在概况窗口中拖动该虚线框,迅速调整到任何想到的位置。
3.平移操作:
除了使用“图形概况”窗口迅速定位图形外,你还可以通过单击和拖动图形窗口的背景来定位图形,注意是背景,不要点到自身上了
4.重新调整块位置:
通过单击指定块的标题栏并将其拖动到一个新位置,用户可以移动图形中的每一个块的位置
5.调整连接线:
在按下SHIFT键的同时,在连接线的任何位置双击鼠标(注意是双击),即可在该位置添加一个新顶点,然后你就可以通过顶点改变连接线的转向了
6.分组和折叠块:
可以对块分组,每个块单独分组,或者与其他块一起分组(使用Ctrl选择多块),并可将分组后的块折叠起来,以减少显示的混乱程度。
折叠块特别有用,可以帮助你追踪已经分析过的块。要折叠块,可以右击块的标题栏,然后在出现的菜单上选择“Group Nodes”。
7.打开行前缀:
要想显示与每个反汇编行有关的其他信息,可以通过Options▶General命令打开IDA常规选项,然后在Disassembly选项卡的可用的反汇编行部分选择相应的选项
8.打开新的反汇编窗口:
如果你想要同时查看两个不同函数的图形,可以通过Views▶Open Subviews▶Disassembly命令打开另一个反汇编窗口。这样打开的第一个反汇编窗口叫做IDA View-A。随后的反汇编窗口叫做IDA View-B、IDAView-C,依次类推。每个反汇编窗口都独立于其他窗口。你完全可以在一个窗口中查看一个图形,在另一个窗口中查看文本列表,或者在3个不同的窗口中查看3个不同的图形。
文本视图
文本显示窗口会呈现一个程序的完整反汇编代码清单(而在图形模式下一次只能显示一个函数),用户只有通过这个窗口才能查看一个二进制文件的数据部分。图形显示窗口中的所有信息均以某种形式存在于文本显示窗口中
1.虚拟地址:
以[区域名称]:[虚拟地址]这种格式显示,如.text:004011C1
2.左边箭头:
实线箭头表示非条件跳转,虚线箭头则表示条件跳转,如果一个跳转(条件或非条件)回到以前的某个地址,这时会使用粗线(实线或虚线),通常表示程序中存在循环
Proximity browser
使用小键盘的(0 Ins)和"+"、“-”组合切换,以图形模式显示程序调用图
以下代码为例:
1. int read_it;
2. int write_it;
3. int ref_it;
5. void sub2callflow(){}
6. void subcallflow(){sub2callflow();}
7. void callflow()
8. {
9. if (ref_it){subcallflow();sub2callflow();}
10. }
12. int main()
13. {
14. int *p = &ref_it;
15. *p = read_it;
16. write_it = *p;
17. callflow();
18. if (read_it == 3)
19. {
20. write_it = 2;
21. }
22. else
23. {
24. write_it = 1;
25. }
26. callflow();
27. }
在proximity view中,当前地址中,它的调用者和被调用者被以边线相连的节点集代替
节点(nodes)代表了函数和被引用的数据(全局变量、字符串等等)
边线(edges)代表了代码或数据之间的交叉引用
如选中callflow函数:
又如选中_main函数:(注意全局变量也是一个node)
Proximity view的node仅显示地址名(函数名或数据标签),不显示反汇编,尽管如此,把鼠标停留在一个node上将显示一个提示窗口,上面列出了简短的反汇编例表,如果
你想看完整的反汇编,那就只有切换模式了(num和+、或空格切换)
Proximity view的node有三种:函数节(Function nodes)、数据节(data nodes )、辅助节(auxiliar nodes)
函数窗口
用于列举IDA在数据库中识别的每一个函数
对应列:(可通过help搜索functions window查找)
1. R - function returns to the caller// 函数返回给调用者
2. F - far function
3. L - library function<span style="white-space:pre"> </span> // 库函数
4. S - static function<span style="white-space:pre"> </span> // 静态函数
5. B - BP based frame. IDA will automatically convert //并使用EBP寄存器(B)引用它的局部变量<span style="white-space:pre"> </span>
6. all frame pointer [BP+xxx] operands to stack
7. variables.
8. T - function has type information
9. = - Frame pointer is equal to the initial stack pointer
10. In this case the frame pointer points to the bottom of the frame
双击Functions窗口中的一个条目,反汇编窗口将跳转到选定函数所在的位置(反汇编窗口会自动打开)
十六进制窗口
对应Views▶Open Subviews▶Hex dump,十六进制窗口可以配置为显示各种格式,并可作为十六进制编辑器使用,和在反汇编窗口中一样,可以同时打开几个十六进制窗口。第一个叫做Hex View-A,第二个叫做Hex View-B,依次类推。
0. 同步关联:
默认情况下,第一个十六进制窗口会与第一个反汇编窗口同步,你也可以通过在任一窗口中右击选击Synchronize
同步后,在一个窗口中滚动鼠标,另一个窗口也会滚动到相同的位置(同一个虚拟地址),选中地址会高亮
1.编辑:
右击菜单,选择Edit菜单项(F2)可将十六进制窗口转变为编辑器,这时可以自由编辑,完成编辑后,你必须提交或取消更改才能返回查看模式(F2保存,ESC撤消)
选中一块数据,按CTRL+C可以复制,被选中的为灰色(不包括蓝色部分),如下,选中的数据为34 FF FF FF B9 3(注意,最后是3,因为33只有一半被灰)
2.其他进制:
可以使用上图中的Data Format菜单项选择各种显示格式,如1、2、4、8字节十六进制,带签名的十进制,或不带签名的十进制整数及各种浮点格式。你可以使用Columns菜单项更改显示的列数,使用Text选项打开或关闭文本块
3.??显示
问号表示IDA无法识别给定的虚拟地址范围内的值,如果程序中包含一个bss节,就会出现这种情况。通常,bss节并不占用文件的空间,但加载器会扩展这一节,以适应程序的静态存储要求。