PG:43
27.IDA的目录结构
{
a. cfg(配置文件)
b. idc(包含IDA内置脚本语言IDC所需的核心文件)
c. ids(目录包含一些符号文件【IDA语法中的IDS文件】,这些文件用于描述可被加载到IDA的二进制文件引用的共享库的内容,包括 函数所需参数的数量,信息和返回类型。)
d. loaders(目录用于识别和解析PE或ELF等已知文件格式的IDA扩展)
e. plugins(目录包含IDA所需的插件)
f. procs(目录包含IDA版本所支持的处理器模块,处理器模块为IDA提供机器语言-汇编语言转换功能)
g. sig(目录包含IDA在各种模式匹配操作中利用的现有代码的签名)
h. til(目录包含一些类型库信息,IDA通过这些信息记录特定于各种编译器库的数据结构的布局)
}
PG:53
40.关闭IDA数据库
(任何时候关闭IDA,都会显示 Save database(保存数据库))
{
a. Don't pack database(不打包数据库)
b. Pack database(Store) (打包数据库(储存))
c. Pack database(Delflate)(打包数据库(压缩))
d. Collect Garbage(收集垃圾)
e. Don't save the database(不保存数据库)
PG:55
41.IDA桌面介绍
{
a. View->Toolbars(显示或隐藏工具栏)
b. Options->Colors彩色水平带(导航带)
c. View->Open Subviews(打开其他数据显示窗口)
d. Options->General->Use Graph View by Default(默认以视图形式打开)
e. Message(消息窗口,显示IDA输出的信息:进程有关的状态消息,以及由用户操作导致的错误信息。)==控制台输出设备
f. Name/String(数据显示窗口)
}
42.IDA中可以分析的标志
{
a. You may start to explore the input file right now(现在可以开始研究输入文件了)
b. The initial autoananlysis has been finished(初始分析已经完成)
}
PG:59
43.IDA桌面提示和技巧
{
a. IDA的显示而言,屏幕越大越好
b. View->Open Subviews(回复你无意关闭的数据显示窗口)
c. Windows->Reset Desktop(可迅速将桌面恢复到原始状态)
d. Windows->Save Desktop(保存用户设置的桌面布局)
e. Windows->Load Desktop(读取用户储存的桌面布局)
f. Open->Font(修改字体)Disassembly( [,dis?'sembli] n. 拆卸;分解)
}
PG:60
44.IDA的基本规则
{
a. 不提供撤销功能指令
b. 几乎所有的操作都有与其对应的菜单项、热键和工具栏按钮。
c. IDA提供方便的、基于上下文的鼠标右键操作菜单。
}
45.IDA对二进制文件分析时,会创建8个窗口。
{
a. 3个立即窗口(IDA-View窗口,Named窗口和消息输出窗口)
b. 反汇编窗口(基本块不包括分支,从头执行到尾的最大指令序列,入口【块的第一条指令】和出口【块的最后一条指令】)
(基本块的第一条指令通常是分支指令的目标,而最后一条指令则是分支指令)
(绿色:执行分支;红色;不执行分支;蓝色:指向下一个块)
}
PG:63
46.控制图形视图显示方式
{
a. 平移(鼠标拖动,你会我会大家会)
b. 重新调整块的位置(单击指定块的标题栏,可以移动其位置;拖动连接线的顶点,可以手动改链接线的路径。在按下Shift键的同时,双击连接线的任何位置,即可在此位置添加新的顶点。)
c. 分组和折叠块(可以对块分组,单独分或者与其他块分在一组;并折叠起来,减少显示的混乱程度。折叠块特别有用;菜单上选择“Group Nodes”)
d. 创建其他反汇编窗口(View->Open->Subviews->Disassembly)
}
PG:65
52.Names窗口(列举了二进制文件的所有全局名称)Names编码方案:
{
a. F,常规函数。IDA认为这些不是库函数
b. L,库函数。IDA通过签名匹配的算法来识别库函数(如果不存在,将被标记为F常规函数)
c. I,共享导入函数的名称。 与库函数的区别:导入的名称没有代码,而库函数的主体将在反汇编代码清单中显示。
d. G,命名代码,这些是已命名的程序指令位置,IDA认为它们不属于任何函数。当IDA在程序的符号中找到一个名称,但没有发现被程序调用时。
e. D,数据。已命名数据的位置通常表示全局变量。
h. A,字符串。 这是一个被引用的数据位置,其中包括IDA已知的字符串类型,如以空字节结束的ASCII字符串。
}
53.常用前缀
{
a. sub_xxxxxx :地址xxxxx处的子列程。
b. loc_xxxxxx :地址xxxxx处的一个指令。
c. byte_xxxxxx :地址xxxxx处的8位数据。
d. word_xxxxxx :地址xxxxx处的16位数据。
e. dword_xxxxxx :地址xxxxx处的32位数据。
f. unk_xxxxxx :地址xxxxx处的未知大小数据。
}
54.String窗口
{
a. 打开:View->Open Subviews->Strings
b. 设置:Setup Strings窗口用于指定IDA扫描字符串的类型(默认扫描的字符串类型包含5个字符的C风格,以null结尾的7位ASCII字符串)
(Borland Delphi二进制文件则往往使用2个字节长的Pascal字符串)
{
值得注意的两个选项:
1. Display only defined strings(仅显示已定义字符串;IDA将不会自动扫描其他类型的字符串)
2. Ignore instructions/data definition(忽略指令/数据定义)【扫描各种字符,包括无用的,除非是你实在找不到什么有用的信息了。】【作用:确保IDA会在所有可能发现字符串的地方扫描各种类型的字符串】
}
}
55.次要IDA窗口
{
a. 十六进制窗口(每行显示16个字节,以及其对应的ASCII字符)
(如果程序包含一个bss节,bss节不占用文件的空间,但加载器会扩展这一节,以适应程序静态储存的要求)
b. 导出窗口(列出文件的入口点、给其他文件使用的函数和变量)
(导出窗口提供与objdump(-T);readelf(-S);dumpbin(/EXPORTS)等命令行工具类似的功能)
c. 导入窗口(只有在二进制文件使用共享库时,IDA才需要导入窗口。)
(静态的二进制文件不存在外部依赖关系,因此不需要导入其他内容。由于被导入的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址)
(对于导入窗口:导入窗口仅显示二进制文件想要动态加载器自动处理的符号,二进制文件选择使用dlopen/dlsym或LoadLibrary/GetProcAddress等机制自行加载的符号将不会在导入窗口中显示)
e. 函数窗口(列出函数库的每个函数 R返回调用方 EBP寄存器(B)引用它的局部变量)
f. 结构体窗体(显示二进制文件中使用的任何复杂的数据结构(如C结构体和联合))
g. 枚举窗口(枚举窗口有点类似于结构体窗口)
(如果检测到(C enum),它将在枚举窗口中列出该数据类型。你也可以使用枚举来代替整数常量,提高反汇编代码的可读性。【也可自定义枚举类型,并将其使用在经过反汇编的二进制代码中】)
}
b. 签名窗口(签名用于识别由编译器生成的常用的启动顺序,以确定可能已被用来构建未定二进制文件的编译器。)
(签名还可用于将函数规划为由编译器插入的已知函数,或者因为静态链接而添加到二进制文件中的函数。)
(添加签名:按INSERT键或右击窗口,IDA会提供Apply new signature(应用新签名)。)
c. 类型库窗口(IDA从常用的编译器的文件头中搜索到的 有关预定义数据类型和函数原型的信息【通过判断为反汇编代码 添加注释】)
(添加库:按INSERT键或右击窗口,选择Load Type Library(加载类型库)。)
e. 函数调用窗口(一个函数可以调用其他函数,也可以被其他函数调用)
(IDA交叉引用(xfefs)是用于生成函数调用窗口的机制、)
f. 问题窗口(显示反汇编二进制文件时遇到的困难,以及如何处理这些困难。)
(BOUNDS问题:如果无法确定调用或者跳转的目标,或者不在程序的虚拟地址范围内,就会发生。)
(DECISION问题:表示IDA决定将一个地址上的字节作伪指令而非数据进行反汇编,即使这个地址在递归下降指令过程中未被调用。)
}
PG:75
72.IDA导航
{
a. 双击导航(每个位置都分配了虚拟地址)
(交叉引用被格式化为 一个名称和一个十六进制偏移值)
b. 跳转到地址(Jump->Jump to Address中 按下热键G)
c. 导航历史记录(Jump->Jump to Previous Position(跳转到前一个位置);后退返回按“ESC”)
(Jump->Jump to next Position(跳转到下一个位置);“CTRL+ENTER”)
}
73.栈帧
{
a. 栈帧(stack frame)栈帧是在程序的运行时栈中分配的内存块,专门用于特定的函数调用。
b. 栈帧(激活记录)调用函数的详细步骤
{
a.调用方将被调用函数所需的参数放入到该函数所采用的调用约定指定的位置。如果参数被放到运行时栈上,该操作可能导致程序的栈指针发生改变。
f. 其他调用约定(调用约定特定于语言、编译器、CPU的,如果遇到由更少见的编译器生成的代码,可能需要你自己进行一番研究【注意:优化代码、定制汇编语言代码和系统调用】)
(如果输出函数(如库函数)是为了供其他程序员使用,必须遵守调用约定。;如果函数仅供内部程序使用,则该函数需要采用只有函数的程序才了解的调用约定,【VC++中使用/GL选项,以及在GUN gcc/g++中使用regparm关键字】)