工具使用-IDA从入门到理解

作者ID:leishi-yanmu

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

启动界面介绍:

这里选择Go键,打开以后:

把我们要分析的文件拖到IDA即可。

这里按我们的默认选项点击OK即可。选择中可能需要理解的为:

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

关闭界面介绍:

当我们打开的时候我们会发现,在这个文件下面多了几个数据库文件,这些都是当前IDA程序自己要用的文件。

这些文件一般涉及在我们要调试完,关闭IDA时候的选择。

关闭时候会出现这几个选项:

第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。

第二个选项及图中选项:就是把这几个数据库文件打包为1个(如。i64文件),下次打开我们分析的文件的时候,打开这个文件即可。

第三个选项:不会删掉数据库文件,而是打包压缩到存储的文件里面去了。

下面两个选项

第一个选项:回收垃圾,如果打包文件太大了,可以选用这个选项,清理不必要的内存

最后一个选项:当分析时候写错了,选中最后一个,最后一次打开的操作不保留了。(解决错误操作)

IDA的窗口和界面介绍:

首先,我们可以在view-open subviews打开各种类型的窗口:

当我们第一次打开IDA,会显示这样的视图。

大窗口是流程图(ctrl+滑动滚轮=变大|变小),可以看到明显的条件判断,红色为条件为false,绿色条件为true。

蓝色为无条件跳转。

图中以incaseformat为例,这样更方便我们理解上下逻辑。

比如这里可以上面顺腾摸瓜的发现了,fileexists,病毒自身判断自己是否存在的行为。

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

这里我们可以根据地址颜色来分辨这个位置的数据类型(就是前面.text:00xxxxxx)

黄色:未定义数据类型

黑色:代码

灰色:数据


跳转表示:

虚线:条件跳转

实线:无条件跳转


颜色须知:

在IDA自动把识别的API标为红色

在病毒分析时候我们会看到调用各种API

windows API查询网址:

https://docs.microsoft.com/zh-cn/windows/win32/apiindex/windows-api-list?redirectedfrom=MSDN

导航栏:

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

函数窗口:

这里会列出IDA所有解析出来的函数,关联开始地址,结束地址,长度,类型等相关属性。

我们可以利用ctrl+F去筛选,比如我这里是当时分析incaseformat,筛选有关于time的函数。

ida对于不能识别出来的函数,会以sub_开头,后面再加上函数的起始位置。

名称窗口:

快捷键:shift+F4

这里会显示出一些名称字符串,如函数名称,字符串名称,变量名称等。

状态指示器(最下面):

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

主窗口中的反汇编窗口

十六进制窗口:

当前文件十六进制显示形式。

F2可对其数据进行修改,修改后再次按F2即可应用。

strings窗口:

快捷键:shift+f12

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

导入表:

当前模块用了那些模块的那些函数。同样可以用于在病毒分析的时候,对于引用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

会用到的小技巧:

显示硬编码:

选中options的此选项

可在蓝色区域填写一行显示字节(硬编码一行最多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

加载C语言头文件:ctrl+F9

退回上一位置:ESC

前进到下一位置:ctrl+enter

跳转指令:G(Go)

经常与动态调试相结合

比如我们在x32dbg或者OD找到关键函数点,用G去定位

跳转到某一区段:ctrl+s

搜索指令:alt+t

Search up:向上搜索

Find all occurences:把所有符合条件的列成一张表(这个比较好用,因为有时候你搜的关键字全局不止一个)

在ida中我们用alt+t去搜索相关的incaseformat事件关键字

字节数据搜索:alt+B

修改名字标识符:n(name):

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

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

解决视图错乱:

winodws-resetdesktop 将各个窗口位置重置-savedesktop 保存设置好的窗口布局

当IDA显示错误的时候:

数据类型操作快捷键:

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修改)

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

修改数据显示:

光标移到常量处,右键

Octal:八进制显示

char(R):常量

Enum(M):将常量转为枚举中一个值

Invert sign:将常量按照补码解析为负数

Bitwise negate:将常量按位取反

注释:

在IDA的注释也注重与汇编和C语言注释结合

第一个按分号 ;

其他像这里跳的也会由此注释

第二个shift+;(:)

没有其他地方副本的注释

incaseformat中我们分析出相关的关键点,可以在后面加个注释,方便理解

函数调用查找:

交叉引用:x

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

会显示该函数被调用情况,函数地址,调用函数名称,调用方式。

该函数调用其他函数的调用情况,调用地址。

IDA patch:

有时候我们会遇到反汇编,但是只要我们把反汇编的函数nop掉,它便不会起作用。

ctrl+alt+k去修改指定位置的汇编代码(keypatch插件)。

IDA自带的patch功能:

edit-patch program-assemble

保存patch:

edit-patch program-apply patches to input file

类型操作:

选中函数或者变量按Y键,输入C类型,IDA便会自动解析并应用。

支持局部变量类型,参数类型,函数原型,全局变量类型,结构体,枚举。

shift+F1会调出Local Types窗口,按insert键(右键)从中可以操作C语言简单类型,IDA会解析并存储其中的类型。

当然类型不能随便乱改。如果将一个长的变量改的比较短,会报出:

"sorry,can not change variable type"错误

IDAPYthon:

IDA内置了一个python环境

执行Python脚本文件:alt+F7,file+scrip file

打开脚本面板:shift+F2-----scripting language+python

比如:

我们可以用其对函数进行解密操作。

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

HexRays反编译器(F5):

伪代码

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

对于HexRays形成的反汇编看的时候需要一定的技巧。我们以一个简单题(来自攻防世界Reversing-x64-Elf-100)这道题为例。

可能懵逼的一点是&v3是什么意思,其实这相当于对一个多维数组进行运算,精确到了每个字母。

我们平常定义数组的样子,一般是这种char a[]={}。

在这个测试中我只取了&a[0],按道理来说应该输出a,但却输出了abc。

那是因为是因为字符串在C语言中本身就是指针形式存在,它存放是第一个元素的首地址。

我们可以只要理解数组是一个连续的内存空间,它的标识符记录的就是它第一个元素的地址,我们都知道变量名只不过是内存地址的别称,那么数组中有那么多元素,那么多内存地址,编译器选择了第一个元素来表示。

有时候我们F5会失败,堆栈不平衡,调用约定失败等原因造成。

比如:两个调用约定清理参数空间方法不一样,跟踪栈指针会出现问题。

节选于逆向工程实战:

在举一个小列子加深印象:

unsigned __int64 v2; //rbp 相当于C中long long类型

v1=*((_DWORD*)v2+14) //指针位移,v2指针加14后,位置就是(uint32)V1

IDA动态调试:

在需要分析代码的地方按下F2下断点

被接管调试器:windbg

F9运行

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

1、将对应版本的服务端放在远程调试机器中

2、如linux_server64

chmod +x ./linux_server64

sudo ./linux_server64

选择IDA调试器:Remote Linux debugger

在ida-debugger-process options

application:调试程序

Input file:与application一致

Hostname:ipconfig

port:一般无需修改

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 1、简介 反汇编工具把二进制文件作为输入,经过处理后输出这个文件的汇编代码。在iOS逆向中,常用的反汇编工具主要是...
    呆呆滴木木菇凉阅读 21,263评论 12 17
  • 当IDA加载后,3个立即可见的窗口分别为IDA-View窗口、函数窗口和消息输出窗口,所有窗口都可通过View▶O...
    LiuJP阅读 2,356评论 0 0
  • File , Edit , Jump , Search , View , Debugger , Options ,...
    LiuJP阅读 2,416评论 0 0
  • ”Pwn”是一个黑客语法的俚语词 ,是指攻破设备或者系统 。发音类似“砰”,对黑客而言,这就是成功实施黑客攻击的声...
    charlie_heng阅读 21,185评论 3 19
  • 一 : 反编译 获取到需要的apk 包,利用反编译工具进行反编译. 反编译工具:Android Killer 首先...
    赤色追风阅读 846评论 0 1