首页
社区
课程
招聘
[原创]工具使用-IDA从入门到理解
发表于: 2021-2-14 08:36 35229

[原创]工具使用-IDA从入门到理解

2021-2-14 08:36
35229

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编辑 ,原因:
收藏
免费 44
支持
分享
最新回复 (42)
雪    币: 26398
活跃值: (63257)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢科普分享!
2021-2-14 10:05
1
雪    币: 12317
活跃值: (5073)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

学习了,多谢楼主哟
2021-2-14 10:16
1
雪    币: 14488
活跃值: (17488)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2021-2-14 12:01
1
雪    币: 2359
活跃值: (343)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
写的很不错,扎实的基础!
2021-2-14 18:51
1
雪    币: 4934
活跃值: (1057)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
对新手很有帮助,感谢分享
2021-2-15 08:36
1
雪    币: 7344
活跃值: (4044)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
挺详细的,写的很好
2021-2-15 08:58
1
雪    币: 6078
活跃值: (5485)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
8
感谢分享,辛苦了!
2021-2-15 09:58
1
雪    币: 13
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享,
麻烦大佬帮忙看看。
https://bbs.pediy.com/thread-266047.htm
2021-2-16 16:00
1
雪    币: 300
活跃值: (2452)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢楼主
2021-2-17 19:56
1
雪    币: 83
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
写的不错,收藏,有空在看。
2021-2-18 12:39
1
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
太棒了 收藏
2021-2-25 09:07
1
雪    币: 118
活跃值: (304)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
真详细,感谢感谢。 
2021-2-25 11:59
1
雪    币: 5168
活跃值: (2815)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
简易入门,感谢分享
2021-3-16 10:38
1
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢科普分享!
2021-4-27 17:07
1
雪    币: 591
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
楼主的IDA在哪下的
2021-7-9 20:52
1
雪    币: 3935
活跃值: (192)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
mark ~~
2021-7-11 17:29
1
雪    币: 642
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
好文,鼓励
2021-7-11 23:07
1
雪    币: 3275
活跃值: (1436)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢讲解,很详细~~~~~~~~·
2021-7-12 06:39
1
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
2022-3-29 15:23
1
雪    币: 392
活跃值: (1438)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习了
2022-3-30 16:00
1
雪    币: 6195
活跃值: (4201)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
22
感谢楼主分享 学习了
2022-3-30 18:28
1
雪    币: 119
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
2022-3-30 19:28
1
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
学习了
2022-4-1 18:04
1
雪    币: 265
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
太需要这种教程了,感谢楼主认真码字!
2022-4-1 22:15
1
游客
登录 | 注册 方可回帖
返回
//