启动界面介绍:

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:一般无需修改 |