堆栈认知——逆向IDA工具的基本使用
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆栈认知——逆向IDA工具的基本使用相关的知识,希望对你有一定的参考价值。
参考:逆向-IDA工具的基本使用
地址:https://qingmu.blog.csdn.net/article/details/118862881
目录
- 1、文件的打开与关闭
- 2、窗口介绍:图形 文本 其他窗口
- 3、显示硬编码(ACDU)
- 4、跳转指令 G
- 5、搜索指令(ALT+T)
- 6、修改名称(N)
- 7、创建结构体 修改全局变量 修改局部变量
- 8、注释
- 9、交叉引用
- 10、总结
1、文件的打开与关闭
-
1、F5反编译成C语言
-
2、关闭选项
IDA生成的数据库文件会打包成一个文件,下次使用就不需要打开源文件了,只需要打开这个数据库文件即可。第三个和这个类似
第一个选项会生成四个文件
当IDA很大的时候,这个选项会把很多不用的内存释放掉,保证文件占用的空间很小
关闭的时候此次做的操作不保留。IDA中唯一回退的方式。
2、窗口介绍:图形 文本 其他窗口
2.1、图形界面:
2.2、文本界面:
图形界面与文件界面的切换使用空格键
2.3、反汇编窗口
进入IDA的默认窗口
2.4、 十六进制窗口
2.5、 文件使用的模块(函数)
查看文件使用了哪些模块(函数),其实是根据导入表生成的
2.6、文件导出的模块(函数)
2.7、结构体(IDA识别出来的)
通过符号表识别出来的
2.8、枚举
3、显示硬编码(ACDU)
输入框中填写硬编码的长度,最大16。(我们的可执行程序都是由硬编码组成)。我们改成10看看效果,如下图:
图中的部分就是硬编码。每一行硬编码对应着一行汇编代码。
随便用一段代码举例说明,原始如下:
3.1.1、A
把当前的数据按照字符串来显示
转换成字符串:
3.1.2、C
把当前的数据按照代码来显示
3.1.3、D
把当前的数据用按照数据来显示
按一下表示单字节显示,按两下双字节显示,按三下表示四字节显示,按三下表示八字结显示
3.1.4、U
把当前的数据按照未定义(原始的字节)来显示
4、跳转指令 G
按一下G
在输入框中输入地址就可以进行跳转。
5、搜索指令(ALT+T)
按下alt+t:
6、修改名称(N)
当我们分析一段汇编的时候,分析完成需要对一个函数或一个变量我们有自己的理解,我们需要对它改成我们想要的名称时按N来修改。
例如:
按N修改:
7、创建结构体 修改全局变量 修改局部变量
7.1、创建结构体
在我们使用IDA的时候,我们对一段汇编代码进行解读的时候,发现其为一个结构体,此时IDA并未识别出来,那么我们可以在Structures文件中增加一个结构体。
点击Edit 选择 add struct type。
此时会让我们输入结构体的名称,我们随便输入一个,如下:
此时AAA结构体已经出来了,那么如何向结构体中增加整数,字符,数组,结构体呢?
操作如下:
添加普通类型(db、dw、dd):
选中我们创造的结构体第一哥成员,按D
此时就添加了一个成员,此时field_0的类型为一个字节,我们选中db然后按D就可以更改其字节数(一字节,两字节,四字节)。
此时名称我们也需要修改成我们想要的名称,怎么办呢?
如上面讲解,按N就可以修改
此时名称修改成了a,宽度修改成了两字节。
添加结构体类型
如上述方式先按D添加一个成员。然后选中成员按下alt+q就可以识IDA已有的所有结构体,添加自定义结构体需先自己添加好,如图:
随便选择一个即可。修改结构体的名称和上述一样,按下N即可。
添加数组
如上述方式先按D添加一个成员。
右键我们的成员(db),选择数组,然后修改数组的大小即可。
修改名称一样按N修改,我们修改为C,此时就定义了一个数组名称为C,类型为dw(双子节),长度为10.
此时我们就在IDA中创建了一个结构体。我们就可以在我们的代码中引用这个结构体了。
7.2、修改全局变量
比如说我们选中一个全局变量,我们要修改其为我们刚刚添加的结构体,怎么做呢?
很简单选中这个变量,按下alt+q,此时会列举出这个IDA所有识别出来的结构体,选择我们刚刚添加的结构体即可。
改完他的类型,IDA会自动给我们生成一个名字,这个名称我么也可修改,并且后续用到的这个变量的地方都将修改成我们修改的名称。
7.3、修改局部变量
当我们修改局部变量的时候,快捷键是T,我们需要找到这个结构体并选中结构体的成员点击确定就可以修改了。(IDA会按照偏移把相应的值列出来)
我们逆向的过程,就是给函数起名字,分析结构体,分析出结构体类型,分析出全局变量类型,分析出参数类型,当我们把这些全都分析好,整个逆向的过程也差不多了。
8、注释
注释有三种方式
8.1、分号注释
在一句代码的末端按下分号(;)会跳出一个文本框,此时我们输入注释,则就会在代码的末尾添加上注释。
这么做的话,他不仅会在本行的末尾添加注释,也会在其他跳转到本行的地方也会添加一段注释。有利有弊。
8.2、SHIFT加分号注释
上面我们说了分号注释他不仅会在本行的末尾添加注释,也会在其他跳转到本行的地方也会添加一段注释。那么我们不希望在跳转的地方也显示注释怎么办呢?
shift + ; 注释就可以在其他跳转到本行的地方不会添加注释了
8.3、函数注释
那么,我们在向写C语言函数的时候,我们想在函数的前面加上注释(函数名,参数、返回值等信息)的时候,我们选中函数名,按下分号,此时就可以添加注释了。
9、交叉引用
比如说我们遇到一个函数,我们想看他还被谁引用了,怎么做呢?
当然在函数名的右下角也有显示,但是补全,如下:
那我们如何查看完整的引用呢?
首先选中函数名,点击上方菜单栏的的view,选择open subviews,在选择cross reference,就可查看所用引用这个函数的地方了。
当然我这里找的是main韩式只有一个。
10、总结
IDA的功能还有很多很多,掌握上面流出的一些基本操作,基本的逆向的操作基本是没有问题的,如果还有其他欢迎补充,谢谢。
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系以上是关于堆栈认知——逆向IDA工具的基本使用的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向IDA 工具使用 ( 同步指定的 IDA View 视图 | Hex View 数据格式 | 过滤设置 )
Android 逆向IDA 工具使用 ( 同步指定的 IDA View 视图 | Hex View 数据格式 | 过滤设置 )
Android 逆向IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )
Android 逆向IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )