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

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

2021-2-14 08:36
31412

IDA对于各位师傅应该无需简介了,如果写的不对的地方,还望师傅们多多包涵。
讲解的时候会涉及到笔者在学习和使用时候的理解。

 

启动界面介绍:
图片描述

1
2
3
4
NEW:打开IDA同时弹出对话框选择要打开的文件
Go:单独打开ida,打开界面将文件拖入
Previous,或者下面的列表项:快速打开之前的的文件
这里选择Go键,打开以后

这里选择Go键,打开以后
图片描述
把我们要分析的文件拖到ida即可
图片描述
这里按我们的默认选项点击OK即可。
选择中可能需要理解的为:

1
2
Manual Load:基地址重定向,并且可以显示PE头部信息,
比如我们在一些病毒调试的时候,修复IAT时候可能用到,不过在进入界面以后里面也可以设定的。

关闭界面介绍:
当我们打开的时候我们会发现,在这个文件下面多了几个数据库文件,这些都是当前ida程序自己要用的文件。
这些文件一般涉及在我们要调试完,关闭IDA时候的选择。
图片描述
关闭时候会出现这几个选项

1
2
3
4
5
6
7
8
9
10
第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
 
第二个选项及图中选项:就是把这几个数据库文件打包为1个(如。i64文件),下次打开我们分析的文件的时候,打开这个文件即可。
 
第三个选项:不会删掉数据库文件,而是打包压缩到存储的文件里面去了。
 
下面两个选项
第一个选项:回收垃圾,如果打包文件太大了,可以选用这个选项,清理不必要的内存
 
最后一个选项:当分析时候写错了,选中最后一个,最后一次打开的操作不保留了。(解决错误操作)

IDA的窗口和界面介绍:
图片描述
首先,我们可以在view-open subviews打开各种类型的窗口
图片描述
图片描述
当我们第一次打开ida,会显示这样的视图

1
2
3
4
5
6
7
大窗口是流程图(ctrl+滑动滚轮=变大|变小),可以看到明显的条件判断,红色为条件为false,绿色条件为true
 
蓝色为无条件跳转
 
图中以incaseformat为例,这样更方便我们理解上下逻辑。
 
比如这里可以上面顺腾摸瓜的发现了,fileexists,病毒自身判断自己是否存在的行为。

按下space(空格键),会进入文本结构的界面。
图片描述
图片描述
图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这里我们可以根据地址颜色来分辨这个位置的数据类型(就是前面.text:00xxxxxx)
黄色:未定义数据类型
黑色:代码
灰色:数据
 
 
跳转表示:
虚线:条件跳转
实线:无条件跳转
 
颜色须知:
在IDA自动把识别的API标为红色
在病毒分析时候我们会看到调用各种API
windows API查询网址:
https://docs.microsoft.com/zh-cn/windows/win32/apiindex/windows-api-list?redirectedfrom=MSDN

导航栏:
图片描述

1
这里显示程序的不同类型数据,不同的颜色代表PE中不同的块,就如我们在文本结构的界面看到颜色相呼应

函数窗口:
图片描述
图片描述

1
2
3
4
5
这里会列出IDA所有解析出来的函数,关联开始地址,结束地址,长度,类型等相关属性。
 
我们可以利用ctrl+F去筛选,比如我这里是当时分析incaseformat,筛选有关于time的函数
 
ida对于不能识别出来的函数,会以sub_开头,后面再加上函数的起始位置

名称窗口:
图片描述

1
2
快捷键:shift+F4
这里会显示出一些名称字符串,如函数名称,字符串名称,变量名称等

状态指示器(最下面):
图片描述

1
这里显示"AU:idle",表示IDA已经完成对程序的自动化分析,我在看是不是卡死了,会看状态指示器。

主窗口中的反汇编窗口
图片描述
十六进制窗口:
图片描述

1
2
当前文件十六进制显示形式
F2可对其数据进行修改,修改后再次按F2即可应用

strings窗口:
图片描述

1
2
3
快捷键:shift+f12
这个大家应该比较熟悉,做CTF题中,我们一般会先运行拿到程序,比如它会显示input your flag:之类,
这便是我们定位关键点的方向。

导入表:
图片描述

1
2
当前模块用了那些模块的那些函数
同样可以用于在病毒分析的时候,对于引用dll文件和API的分析

导出表:
图片描述

 

识别出来的结构体视图:
图片描述

 

枚举类型:
图片描述

 

函数操作:
图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

会用到的小技巧:
显示硬编码:
图片描述

 

选中options的此选项
图片描述

1
可在蓝色区域填写一行显示字节(硬编码一行最多16字节),每一行硬编码对应几个汇编代码。
1
2
3
4
5
6
7
8
9
10
11
在做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

加载C语言头文件:ctrl+F9
图片描述

 

退回上一位置:ESC

 

前进到下一位置:ctrl+enter

 

跳转指令:G(Go)
图片描述
图片描述

1
2
经常与动态调试相结合
比如我们在x32dbg或者OD找到关键函数点,用G去定位

跳转到某一区段: ctrl+s

 

搜索指令:alt+t
图片描述
图片描述

1
2
3
Search up:向上搜索
Find all occurences:把所有符合条件的列成一张表(这个比较好用,因为有时候你搜的关键字全局不止一个)
在ida中我们用alt+t去搜索相关的incaseformat事件关键字

字节数据搜索:alt+B
图片描述

 

修改名字标识符:n(name):
图片描述

1
任何引用的地方,都会改成这个名字(方便逻辑上看清楚)

任何引用的地方,都会改成这个名字(方便逻辑上看清楚)
解决视图错乱:
图片描述

1
2
winodws-reset desktop 将各个窗口位置重置
       -save desktop 保存设置好的窗口布局

当IDA显示错误的时候:
数据类型操作快捷键:

1
2
3
4
5
A(ASCII):当前数据以字符串来显示,以该位置为起点定义一个"\0"结尾的字符串
C(code):当前数据以代码的形式显示,以此为起始位置进行递归反汇编,
D(Data):当前数据以数据形式显示,一直按D键这个位置,会以1字节,2字节,4字节,8字节,循环显示
U(undefined):未定义,普通原始字节的形式显示
*键:定义数组并设置相关属性

这里
我们以90(nop指令相当于python中的pass):一般以字节对齐的方式出现
作为演示
图片描述
按下A指令后的效果
图片描述
按下d,一开始以一个字节显示一个,再按一个d为两个字节为单位(dw),再按一下为db四个字节
图片描述
图片描述

 

按下shift+8
图片描述

 

新增加结构体类型:在Structures窗口
图片描述
选择此选项
图片描述
图片描述

 

便会派生出你命名的结构体
图片描述
按D可以在结构体中添加成员(类型按d,alt+q{结构体}修改,名字按n修改)
图片描述

1
右键也可以修改类型为数组array,在其他IDA其他地方可以alt+q,局部变量为p,引用这个结构体

修改数据显示:
图片描述

1
2
3
4
5
6
光标移到常量处,右键
Octal:八进制显示
char(R):常量
Enum(M):将常量转为枚举中一个值
Invert sign:将常量按照补码解析为负数
Bitwise negate:将常量按位取反

注释:
图片描述
图片描述

1
2
3
4
5
6
7
8
9
在IDA的注释也注重与汇编和C语言注释结合
 
第一个按分号 ;
其他像这里跳的也会由此注释
 
第二个shift+;(:)
没有其他地方副本的注释
 
incaseformat中我们分析出相关的关键点,可以在后面加个注释,方便理解

函数调用查找:
交叉引用:x
图片描述

 

平常会在逆向分析中,如果一个函数加密,如decode(x),我们可以按x去看看这个decode()函数,然后分析其中逻辑去写出逆算法.
图片描述
图片描述

1
2
会显示该函数被调用情况,函数地址,调用函数名称,调用方式
该函数调用其他函数的调用情况,调用地址。

IDA patch:
有时候我们会遇到反汇编,但是只要我们把反汇编的函数nop掉,它便不会起作用
图片描述
图片描述
ctrl+alt+k去修改指定位置的汇编代码(keypatch插件)
图片描述
图片描述

1
2
3
4
5
IDA自带的patch功能:
edit-patch program-assemble
 
保存patch:
edit-patch program-apply patches to input file

类型操作:
图片描述
图片描述
图片描述

1
2
3
4
5
6
7
选中函数或者变量按Y键,输入C类型,IDA便会自动解析并应用
支持局部变量类型,参数类型,函数原型,全局变量类型,结构体,枚举
shift+F1会调出Local Types窗口,按insert键(右键)从中可以操作C语言简单类型,IDA会解析并存储其中的类型
 
当然类型不能随便乱改
如果将一个长的变量改的比较短,会报出
"sorry,can not change variable type"错误

IDAPYthon:
图片描述
图片描述

1
2
3
4
5
6
IDA内置了一个python环境
执行Python脚本文件:alt+F7,file+scrip file
打开脚本面板:shift+F2-----scripting language+python
 
比如:
我们可以用其对函数进行解密操作

相关脚本介绍:大家可以去看雪论坛搜一下,有几篇很好的介绍IDApython。

 

HexRays反编译器(F5):
图片描述
图片描述

1
2
3
4
伪代码
第一行为函数原型
然后局部变量的声明区域,注释代表这个变量所在的位置,右键"collapse declaration"收起
最后函数语句

对于HexRays形成的反汇编看的时候需要一定的技巧

 

我们以一个简单题(来自攻防世界Reversing-x64-Elf-100)这道题为例
图片描述

 

可能懵逼的一点是&v3是什么意思,其实这相当于对一个多维数组进行运算,精确到了每个字母
我们平常定义数组的样子,一般是这种char a[]={}
图片描述

1
2
3
4
5
6
7
8
9
在这个测试中我只取了&a[0],按道理来说应该输出a,但却输出了abc
那是因为是因为字符串在C语言中本身就是指针形式存在,它存放是第一个元素的首地址
我们可以只要理解数组是一个连续的内存空间,它的标识符记录的就是它第一个元素的地址,
我们都知道变量名只不过是内存地址的别称,那么数组中有那么多元素,
那么多内存地址,编译器选择了第一个元素来表示。
 
 
有时候我们F5会失败,堆栈不平衡,调用约定失败等原因造成。
比如:两个调用约定清理参数空间方法不一样,跟踪栈指针会出现问题

节选于逆向工程实战:
图片描述

1
2
3
在举一个小列子加深印象:
unsigned __int64 v2; //rbp 相当于C中long long类型
v1=*((_DWORD*)v2+14) //指针位移,v2指针加14后,位置就是(uint32)V1

IDA动态调试:
图片描述
图片描述
图片描述

1
2
3
在需要分析代码的地方按下F2下断点
被接管调试器:windbg
F9运行

远程动态调试(一般用于linux上的文件调试):
图片描述

1
2
3
4
1,将对应版本的服务端放在远程调试机器中
2,如linux_server64
chmod +x ./linux_server64
sudo ./linux_server64

图片描述
图片描述

1
2
3
4
5
6
选择IDA调试器:Remote Linux debugger
在ida-debugger-process options
application:调试程序
Input file:与application一致
Hostname:ipconfig
port:一般无需修改

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-2-14 11:10 被leishi-yanmu编辑 ,原因:
收藏
点赞42
打赏
分享
最新回复 (42)
雪    币: 19586
活跃值: (60133)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2021-2-14 10:05
2
1
感谢科普分享!
雪    币: 11323
活跃值: (4063)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 2021-2-14 10:16
3
1

学习了,多谢楼主哟
雪    币: 12098
活跃值: (15499)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2021-2-14 12:01
4
1
感谢分享
雪    币: 2358
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rescuo 2021-2-14 18:51
5
1
写的很不错,扎实的基础!
雪    币: 4934
活跃值: (1058)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
xcbyao 2021-2-15 08:36
6
1
对新手很有帮助,感谢分享
雪    币: 6655
活跃值: (3280)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
htpidk 2021-2-15 08:58
7
1
挺详细的,写的很好
雪    币: 5133
活跃值: (4439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
gamehack 2021-2-15 09:58
8
1
感谢分享,辛苦了!
雪    币: 13
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cloverlove 2021-2-16 16:00
9
1
感谢分享,
麻烦大佬帮忙看看。
https://bbs.pediy.com/thread-266047.htm
雪    币: 310
活跃值: (1917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 2021-2-17 19:56
10
1
感谢楼主
雪    币: 83
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
disheng_zxhy 2021-2-18 12:39
11
1
写的不错,收藏,有空在看。
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无双侯 2021-2-25 09:07
12
1
太棒了 收藏
雪    币: 118
活跃值: (304)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
oceanxing 2021-2-25 11:59
13
1
真详细,感谢感谢。 
雪    币: 4300
活跃值: (1937)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GeaC 2021-3-16 10:38
14
1
简易入门,感谢分享
雪    币: 121
活跃值: (1517)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxRea 2021-4-27 17:07
15
1
感谢科普分享!
雪    币: 589
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_vrhiprpv 2021-7-9 20:52
16
1
楼主的IDA在哪下的
雪    币: 3935
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nqxcwl 2021-7-11 17:29
17
1
mark ~~
雪    币: 642
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peterfile 2021-7-11 23:07
18
1
好文,鼓励
雪    币: 3275
活跃值: (1361)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小阿呆 2021-7-12 06:39
19
1
谢谢讲解,很详细~~~~~~~~·
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_emjbsbpe 2022-3-29 15:23
20
1
雪    币: 377
活跃值: (1383)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kira_yamato 2022-3-30 16:00
21
1
学习了
雪    币: 5182
活跃值: (3270)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
樂樂 2022-3-30 18:28
22
1
感谢楼主分享 学习了
雪    币: 119
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
渗透 2022-3-30 19:28
23
1
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_zenpuhjo 2022-4-1 18:04
24
1
学习了
雪    币: 260
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
beijingren 2022-4-1 22:15
25
1
太需要这种教程了,感谢楼主认真码字!
游客
登录 | 注册 方可回帖
返回