IDA对于各位师傅应该无需简介了,如果写的不对的地方,还望师傅们多多包涵。
讲解的时候会涉及到笔者在学习和使用时候的理解。
启动界面介绍:
这里选择Go键,打开以后
把我们要分析的文件拖到ida即可
这里按我们的默认选项点击OK即可。
选择中可能需要理解的为:
关闭界面介绍:
当我们打开的时候我们会发现,在这个文件下面多了几个数据库文件,这些都是当前ida程序自己要用的文件。
这些文件一般涉及在我们要调试完,关闭IDA时候的选择。
关闭时候会出现这几个选项
IDA的窗口和界面介绍:
首先,我们可以在view-open subviews打开各种类型的窗口
当我们第一次打开ida,会显示这样的视图
按下space(空格键),会进入文本结构的界面。
导航栏:
函数窗口:
名称窗口:
状态指示器(最下面):
主窗口中的反汇编窗口
十六进制窗口:
strings窗口:
导入表:
导出表:
识别出来的结构体视图:
枚举类型:
函数操作:
会用到的小技巧:
显示硬编码:
选中options的此选项
加载C语言头文件:ctrl+F9
退回上一位置:ESC
前进到下一位置:ctrl+enter
跳转指令:G(Go)
跳转到某一区段: ctrl+s
搜索指令:alt+t
字节数据搜索:alt+B
修改名字标识符:n(name):
任何引用的地方,都会改成这个名字(方便逻辑上看清楚)
解决视图错乱:
当IDA显示错误的时候:
数据类型操作快捷键:
这里
我们以90(nop指令相当于python中的pass):一般以字节对齐的方式出现
作为演示
按下A指令后的效果
按下d,一开始以一个字节显示一个,再按一个d为两个字节为单位(dw),再按一下为db四个字节
按下shift+8
新增加结构体类型:在Structures窗口
选择此选项
便会派生出你命名的结构体
按D可以在结构体中添加成员(类型按d,alt+q{结构体}修改,名字按n修改)
修改数据显示:
注释:
函数调用查找:
交叉引用:x
平常会在逆向分析中,如果一个函数加密,如decode(x),我们可以按x去看看这个decode()函数,然后分析其中逻辑去写出逆算法.
IDA patch:
有时候我们会遇到反汇编,但是只要我们把反汇编的函数nop掉,它便不会起作用
ctrl+alt+k去修改指定位置的汇编代码(keypatch插件)
类型操作:
IDAPYthon:
相关脚本介绍:大家可以去看雪论坛搜一下,有几篇很好的介绍IDApython。
HexRays反编译器(F5):
对于HexRays形成的反汇编看的时候需要一定的技巧
我们以一个简单题(来自攻防世界Reversing-x64-Elf-100)这道题为例
可能懵逼的一点是&v3是什么意思,其实这相当于对一个多维数组进行运算,精确到了每个字母
我们平常定义数组的样子,一般是这种char a[]={}
节选于逆向工程实战:
IDA动态调试:
远程动态调试(一般用于linux上的文件调试):
NEW:打开IDA同时弹出对话框选择要打开的文件
Go:单独打开ida,打开界面将文件拖入
Previous,或者下面的列表项:快速打开之前的的文件
这里选择Go键,打开以后
NEW:打开IDA同时弹出对话框选择要打开的文件
Go:单独打开ida,打开界面将文件拖入
Previous,或者下面的列表项:快速打开之前的的文件
这里选择Go键,打开以后
Manual Load:基地址重定向,并且可以显示PE头部信息,
比如我们在一些病毒调试的时候,修复IAT时候可能用到,不过在进入界面以后里面也可以设定的。
Manual Load:基地址重定向,并且可以显示PE头部信息,
比如我们在一些病毒调试的时候,修复IAT时候可能用到,不过在进入界面以后里面也可以设定的。
第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
第二个选项及图中选项:就是把这几个数据库文件打包为
1
个(如。i64文件),下次打开我们分析的文件的时候,打开这个文件即可。
第三个选项:不会删掉数据库文件,而是打包压缩到存储的文件里面去了。
下面两个选项
第一个选项:回收垃圾,如果打包文件太大了,可以选用这个选项,清理不必要的内存
最后一个选项:当分析时候写错了,选中最后一个,最后一次打开的操作不保留了。(解决错误操作)
第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
第二个选项及图中选项:就是把这几个数据库文件打包为
1
个(如。i64文件),下次打开我们分析的文件的时候,打开这个文件即可。
第三个选项:不会删掉数据库文件,而是打包压缩到存储的文件里面去了。
下面两个选项
第一个选项:回收垃圾,如果打包文件太大了,可以选用这个选项,清理不必要的内存
最后一个选项:当分析时候写错了,选中最后一个,最后一次打开的操作不保留了。(解决错误操作)
大窗口是流程图(ctrl
+
滑动滚轮
=
变大|变小),可以看到明显的条件判断,红色为条件为false,绿色条件为true
蓝色为无条件跳转
图中以incaseformat为例,这样更方便我们理解上下逻辑。
比如这里可以上面顺腾摸瓜的发现了,fileexists,病毒自身判断自己是否存在的行为。
大窗口是流程图(ctrl
+
滑动滚轮
=
变大|变小),可以看到明显的条件判断,红色为条件为false,绿色条件为true
蓝色为无条件跳转
图中以incaseformat为例,这样更方便我们理解上下逻辑。
比如这里可以上面顺腾摸瓜的发现了,fileexists,病毒自身判断自己是否存在的行为。
这里我们可以根据地址颜色来分辨这个位置的数据类型(就是前面.text:
00xxxxxx
)
黄色:未定义数据类型
黑色:代码
灰色:数据
跳转表示:
虚线:条件跳转
实线:无条件跳转
颜色须知:
在IDA自动把识别的API标为红色
在病毒分析时候我们会看到调用各种API
windows API查询网址:
https:
/
/
docs.microsoft.com
/
zh
-
cn
/
windows
/
win32
/
apiindex
/
windows
-
api
-
list
?redirectedfrom
=
MSDN
这里我们可以根据地址颜色来分辨这个位置的数据类型(就是前面.text:
00xxxxxx
)
黄色:未定义数据类型
黑色:代码
灰色:数据
跳转表示:
虚线:条件跳转
实线:无条件跳转
颜色须知:
在IDA自动把识别的API标为红色
在病毒分析时候我们会看到调用各种API
windows API查询网址:
https:
/
/
docs.microsoft.com
/
zh
-
cn
/
windows
/
win32
/
apiindex
/
windows
-
api
-
list
?redirectedfrom
=
MSDN
这里显示程序的不同类型数据,不同的颜色代表PE中不同的块,就如我们在文本结构的界面看到颜色相呼应
这里显示程序的不同类型数据,不同的颜色代表PE中不同的块,就如我们在文本结构的界面看到颜色相呼应
这里会列出IDA所有解析出来的函数,关联开始地址,结束地址,长度,类型等相关属性。
我们可以利用ctrl
+
F去筛选,比如我这里是当时分析incaseformat,筛选有关于time的函数
ida对于不能识别出来的函数,会以sub_开头,后面再加上函数的起始位置
这里会列出IDA所有解析出来的函数,关联开始地址,结束地址,长度,类型等相关属性。
我们可以利用ctrl
+
F去筛选,比如我这里是当时分析incaseformat,筛选有关于time的函数
ida对于不能识别出来的函数,会以sub_开头,后面再加上函数的起始位置
快捷键:shift
+
F4
这里会显示出一些名称字符串,如函数名称,字符串名称,变量名称等
快捷键:shift
+
F4
这里会显示出一些名称字符串,如函数名称,字符串名称,变量名称等
这里显示
"AU:idle"
,表示IDA已经完成对程序的自动化分析,我在看是不是卡死了,会看状态指示器。
这里显示
"AU:idle"
,表示IDA已经完成对程序的自动化分析,我在看是不是卡死了,会看状态指示器。
当前文件十六进制显示形式
F2可对其数据进行修改,修改后再次按F2即可应用
当前文件十六进制显示形式
F2可对其数据进行修改,修改后再次按F2即可应用
快捷键:shift
+
f12
这个大家应该比较熟悉,做CTF题中,我们一般会先运行拿到程序,比如它会显示
input
your flag:之类,
这便是我们定位关键点的方向。
快捷键:shift
+
f12
这个大家应该比较熟悉,做CTF题中,我们一般会先运行拿到程序,比如它会显示
input
your flag:之类,
这便是我们定位关键点的方向。
当前模块用了那些模块的那些函数
同样可以用于在病毒分析的时候,对于引用dll文件和API的分析
当前模块用了那些模块的那些函数
同样可以用于在病毒分析的时候,对于引用dll文件和API的分析
IDA的反汇编由各个函数结合而成,比如控制流程图以函数为单位生成和显示
bp
-
based frame;该函数的栈指针为ebp寄存器
arg_0等是IDA友好的提示,相对栈指针偏移量为
8
的函数参数
var局部变量,arg参数
__cdecl调用约定
有时候,我们修改了程序,想要F5反汇编但不行,这是因为IDA并没有把它识别为一个函数,一般以push eb(base)p
/
rbp指令开头为一个函数的起始地址(因为要堆栈平衡,保存现场,进行压栈操作)
在函数起始的汇编代码处,按p
快捷键
删除函数:在函数窗口选择函数,按delete键
修改函数:在函数窗口ctrl
+
E,反汇编窗口alt
+
p(指定函数细节,如开始结束位置,bp寻址,参数属性)
定义函数:p
结合上面解释举几个小列子:
mov [ebp
+
var_var_4],
0
;给局部变量var_4赋值
0
IDA的反汇编由各个函数结合而成,比如控制流程图以函数为单位生成和显示
bp
-
based frame;该函数的栈指针为ebp寄存器
arg_0等是IDA友好的提示,相对栈指针偏移量为
8
的函数参数
var局部变量,arg参数
__cdecl调用约定
有时候,我们修改了程序,想要F5反汇编但不行,这是因为IDA并没有把它识别为一个函数,一般以push eb(base)p
/
rbp指令开头为一个函数的起始地址(因为要堆栈平衡,保存现场,进行压栈操作)
在函数起始的汇编代码处,按p
快捷键
删除函数:在函数窗口选择函数,按delete键
修改函数:在函数窗口ctrl
+
E,反汇编窗口alt
+
p(指定函数细节,如开始结束位置,bp寻址,参数属性)
定义函数:p
结合上面解释举几个小列子:
mov [ebp
+
var_var_4],
0
;给局部变量var_4赋值
0
可在蓝色区域填写一行显示字节(硬编码一行最多
16
字节),每一行硬编码对应几个汇编代码。
可在蓝色区域填写一行显示字节(硬编码一行最多
16
字节),每一行硬编码对应几个汇编代码。
在做CTF题目中,F5可能报错
"xxxx positive sp value has been found"
图中勾选stack Pointer使sp可见
ALT
+
T(search
-
test):找地址
alt
+
k:修改值
有个师傅讲的比较容易理解这个地方:
函数开始和结束时候,栈顶指针必须指向同一个地方
函数的局部变量是在栈上分配的
-
-
-
减少sp值
回收的时候
-
-
-
增加sp的值
故sp指向的地方应该不变
在IDA中,假设函数开始时候sp为
0
,那么最后sp也应该回到
0
在做CTF题目中,F5可能报错
"xxxx positive sp value has been found"
图中勾选stack Pointer使sp可见
ALT
+
T(search
-
test):找地址
alt
+
k:修改值
有个师傅讲的比较容易理解这个地方:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-2-14 11:10
被leishi-yanmu编辑
,原因: