IDA Pro 基础学习 (2016-09-26 )
IDA 的窗口可以通过view->open subview 中的菜单项来打开。
ctrl-1 是快捷键打开选择窗口。再选择要打开的窗口.
窗口为我们提供信息表格整理,
导航(双击),跳转,及搜索供我们找到感兴趣的东西。
跳转:
有一个菜单项search. 在jump 菜单下,有一堆快速跳转快捷键,简述几个。
- Ctrl-L: 跳转到名称,然后选择Label
- G: 跳转到地址, 可以输入Label
- X: 在Label 上输入x, 可以打开交叉参考窗口,选择跳转到你期望的地址
搜索:
- IDA 的文本搜索ALT-T,
- 二进制搜索ALT-B 及
- 其它搜索(代码搜索,数据搜索等)
反汇编窗口,16进制窗口,names 窗口,strings窗口,函数窗口. 函数调用窗口.
菜单栏–>选项–>常规–>反汇编–>机器码字节数,填入一个数反汇编即可以显示机器码了。
1. IDA 可以有多个反汇编窗口和多个hex 窗口
对代码的注释
.plt:08048374 ; void srand(unsigned int seed) // 已经找到了函数原型
.plt:08048374 _srand proc near ; CODE XREF: main+42 ▽p 该代码由main 引用, p 为procedure
.plt:08048374 jmp ds:off_8049940 // 跳转到一个地址,该地址在.got.plt节内存中
.plt:08048374 _srand endp
.plt 为procedure linkage table 节
.got.plt:08049940 off_8049940 dd offset srand ; DATA XREF: _srand ▲r 该数据由_srand 引用, r 为read, w为write
// 还有 o 偏移量交叉引用。引用的是地址而不是值,例如虚函数表只有o引用
srand 是一个外部符号地址,由连接器来确定。不在本程序内。
点击某个符号,例如_srand, 然后敲击”X”快捷键,会打开交叉引用窗口。窗口内容是交叉引用列表。
方便浏览和跳转。
2. IDA 可以把一组汇编指令折叠,方法,点击窗口标题,快捷菜单项group node
3. names 窗口:
是二进制文件的所有全局名称。名称是对一个程序的虚拟地址的符号描述。
名称有类型: F(函数-常规) L(库函数) I(导入函数) D(数据) A(字符串)
G(命名代码- IDA 在符号表中找到了一个名称,但未发现任何对它的引用,出现此情况)
IDA 自动生成的名称不会进入此窗口,它们是:
sub_xxxx //函数
loc_xxxx //位置
byte_xxxx //数据 byte, word, dword 及其它
word_xxxx
dword_xxxx
unk_xxxx //大小未知的数据块
4. strings 窗口
显示二进制文件中搜索到的字符串,窗口快捷菜单中可以设置字符串搜索选项。
配合交叉参考很重要。
IDA view 窗口中中文字符乱码,但strings 窗口中显示正常。
导入表,导出表,结构体表,枚举表
导入表。 win程序在idata 节
段窗口。 签名窗口,类型库窗口,问题窗口
./pelf libgcc.a
将会生成libgcc.a 的pat 文件 libgcc.pat
./sigmake libgcc.pat libgcc.sig
将会生成签名文件
在类型库窗口->可以查看已经加载的类型库
类型库,记录了一些数据类型,函数原型,可以知道数据结构的名称,大小和布局,从头文件中收集,用以注释反汇编代码。
如何生成自己的类型库? 例如,从structs.h 生成structs.til, 你可能需要修改头文件使满足tilib 要求
tilib -c -hstructs.h structs.til
想要查看类型库内容,可以用tilib 工具,例如
tilib -l structs.til
手工加载方式: 在类型库窗口中右击鼠标,在菜单中选择Load Type Library
加载了你可能也看不到什么变化,因为structs窗口及local-type 窗口都没有什么变化, 它是作为标准的数据类型存在于idb 文件中.
不知为什么IDAy 把查看一下类型库信息搞得这么隐蔽呢? 希望它的新版本能改进这一点, 我现在用的是IDA68
还有一种加载数据类型的方式是file->load file->parse c header. 但我不知道它把信息到底加到哪里去了? local type 窗口是看见了一部分,但很少,
大部分都不见了, 既然类型库已经走通了, 那直接分析头文件搞不清楚也就算了, 反正这一块做的界面不够友好!
### 1. 哑名更改.
与位置有关的名称(函数名称,全局变量名称),栈帧变量名称。自动生成的名称没有多少意义。
我们难以了解它的用途,对了解程序的行为也没有帮助。
所有,需要我们更改为有意义的函数名称,正确的函数原型。(参数类型,参数名称)及有意义的局部
变量名称, 这些都是N 快捷键需要做的。
IDA 能够很好的扩散名称。
;可重复注释(可以很好的扩散),
shift+;(就是:) 为常规注释
IDA 的字符串是一种”虚拟”的可重复注释
函数原型参数会扩散到调用处。
函数原型如果添加可重复注释,会扩散到调用处。
option->general 中有对反汇编项的定制。确定显示或者不显示什么项。
例如: numbers of opcode bytes 可以显示对应的操作码, 默认为0字节不显示。
stack pointer, 可以显示每条指令对应的栈指针。默认关闭。
另,栈指针也是可以调整的.,针对调用莫个外部函数时
格式化指令中的操作数, 可以用你定义的常量来表达这些操作数,例如作为偏移值的成员变量名等。
操作函数: 创建,删除,修改属性等,前面叙述过一部分,在菜单edit->function 子菜单下。
补充:
ida6.8 中文显示乱码问题.(反编译一个ubuntu 下的elf 文件)
这个是编码问题, 先找到
Options->ASCII String Style..。选择Change Encoding。
打开的窗口中有至少四个选项:,,UTF8,UTF16LE。
选择UTF8
选择Set Default Encoding
8-bit and multibyte string, 选择UTF8
则乱码解决!
IDA 还可以导出数据库和类型数据库为IDC文件, 这个IDC 文件可能很庞大,但也给了我们一种方法, 编辑这个IDC文件再把它导入回去,这样来完成同步.