【IDA PRO权威指南】三
数据与代码转换
在自动分析阶段,数据字节可能被错误分析为代码字节,反之也是。
对反汇编代码重新格式化:删除当前的格式(代码和数据),右击希望取消定义的项目,在结果上下文菜单中选择undefine,就可以取消函数代码数据的定义。就会如下
然后开始重新反汇编,只需要右击第一个字节在上下文菜单中选择code,这样就开始反汇编知道一个已定义的项目和非法指令。
基本数据转换
指定数据大小
使用options setup data types对话框
数据转盘:比如由dw变dd,dd变db,db变dw。
这一过程会使项目变大变小或者保持不变。
处理字符串
IDA能识别打大量字符串格式,c风格,以空字符结尾等等。。。
可以edit strings选择一种字符串风格。
还有一个配置字符串操作的对话框
options general,这里的大多数选项与字符串数据的命名和显示有关。比如 如果关闭了generation names则会为字符串变量提供asc_为前缀的哑名。
还有一些包括字符串名称长度,大小写等操作。
指定数组
IDA也提供了一些工具将这些数据定义组合起来,组成一个单独的数组的定义。需要打开edit-array打开创建数组对话框。
- Array element Width (数组元素宽度)。这个值表示各数组元素的大小(这里为1字节),它由你在打开对话框时选择的数据值的大小决定。
- Maximum possible size (最大可能大小)。这个值由自动计算得出,它决定在遇到另一个巳定义的数据项之前,可包含在数组中的元素(不是字节)的最大数目。你可以指定一个更大的值,但这需要随后的数据项为未定义数据项,以将它们吸收到数组中。
- Number of elements (元素数量)。你可以在这里指定数组的具体大小。数组占用的总字节数可通过“元素数量x数组元素宽度”计算得出。
- Items on a line (行中的项目)。指定在每个反汇编行显示的元素的数量。通过它可以减少显示数组所需的空间。
- Element width (元素宽度)。这个值仅用于格式化。当一行显示多个项目时,它控制列宽。
- Use "dup" construct (使用重复结构)。这个选项可将相同的数据值合并起来,用个重复说明符组合成-项。
- Signed elements (有符号元素)。表示将数据显示为有符号还是无符号的值。
- Display indexes (显示索引)。使数组索引以常规注释的形式显示。如果你需要定位大型数组中的特定数据,可以使用这个选项。选择该选项还将启用Indexes单选按钮,这样就可以选择每个索引值的显示格式。
- Create as array (创建为数组)。不选择这个选项似乎有悖于本对话框的目的,该选项默认处于选中状态。如果你只希望指定-一定数量的连续项目,而不是将它们组合成-一个数组,即可取消该选项。
数组类型与数据结构
讨论的是IDA如何向用户传递数据信息,数据结构如何存储在内存中,如何访问这些数据结构中的数据。其中一个很关键的是了解该变量作为某个函数的参数的用法。
识别数据结构的用法
基本数据结构简单,符合数据结构的各数据项,需要更加复杂的指令序列。
数组成员访问
数组是最简单的符合数据结构。
值得注意的是①的访问是第80个字节位置的整数值,②中的数组访问是偏移量为0,4,。。96字节为止的连续整数值。第一个是通过204计算,第二个是运行中计算,每次计算都要i40
全局分配的数组
在全局数据区分配,可以获得该数组的基址。
栈分配的数组
几乎完全相同
堆分配的数组
一个动态内存堆分配函数分配的。区别在于他笔记序根据内存分配函数返回的地址值,生成对数组的所有引用。
必须先读取heap array的内容
结构体成员访问
访问结构体字段的方式看起来和使用常量索引访问数组元素的方式极其相似。
所需的最小空间由分配结构体中的字段所需的空间总和决定。
全局分配的结构体
访问结构体成员不需要任何算术计算。
栈分配的结构体
也相当难分辨,也不需要任何算术计算。
堆分配的结构体
引用该结构体的唯一线索就是指向该结构体起始地址的指针。
结构体数据
访问①的操作:用索引值乘以数组元素的大小,加上字段的偏移量。
创建IDA结构体
创建一个新的结构体(或联合)
这个窗口已经显示了已有的结构体
这就是创建结构体的对话框
编辑结构体成员
添加字段:D,A星号键。
添加字段过程如下:
- (1)要给结构体添加新字段,将光标放在结构体定义的最后-行(包含ends的那-行)并按
下D键。这时, IDA就会在结构体的末尾添加一一个新字段。新字段的大小取决于你在数据转盘(参
见第7章)上选择的第-个大小。最初,字段的名称为field_ N,这里的N为结构体开头到新字
段(如fie1d_ 0)开头的数字偏移量。 - (2)如果需要修改字段的大小,首先将光标放在新字段的名称上,然后重复按下D键,使数
据转盘上的数据类型开始循环,从而为新字段选择正确的数据大小。另外,你还可以使用
Options ) Setup Data Types来指定一个在数据转盘上不存在的大小。如果新字段是-一个数组,右
击其名称并在上下文菜单中选择Array,将打开“数组规范”对话框(参见第7章)。 - (3)要更改-个结构体字段的名称,单击字段名称并按下N键,或者右击该名称并在上下文
菜单中选择ReName,然后在输人框中输人-一个名称即可。
用栈帧作为专用结构体
使用结构体末班
要知道访问什么类型的结构体,访问什么字段。
导入新的结构体
IDA能解析C的数据声明以及整个头文件
解析C结构体生命。
view open subviews local types
解析头文件
file load file parse c header file解析想要的头文件
tips:
使用标准结构体
在create structure对话框选择add standard structure
本文作者:Corax0o0
本文链接:https://www.cnblogs.com/Corax0o0/p/17302439.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用