学习逆向工程需要熟悉一个反汇编器的使用,学会阅读汇编语言,学会编写脚本和查找资料
IDA是功能很强大的一款反汇编机器,本文保姆级讲解了IDA的基本使用
关于汇编语言的学习我总结了另一篇文章汇编语言快速入门_光无影的博客-CSDN博客
序言
It was the best of times,it was the worst of times,it was the age of wisdom,it was the age of foolishness,it was the epoch of belief,it was the epoch of incredulity.
it was the season of Light,it was the season of Darkness,it was the spring of hope,it was the winter of despair,we had everything before us,we had nothing before us.
we were all going direct to Heaven,we were all going direct the other way.
——A Tale of Two Cities
今天,万物互联,普适计算。整个世界的构造都由程序操纵起来。
A handful of people working at a handful of tech companies steer the thoughts of billions of people every day.
你可曾听过赛博朋克这个词,科幻作家布鲁斯·博斯克创造了这个词。
赛博朋克Cyberpunk是由网络Cyber和朋克Punk组成。
而cyber的词源是控制论cybernetics,是20世纪重要的思想运动。
punk则代表着治理与反叛两个概念的纠缠。
科幻作家布鲁斯·博斯克创造了“赛博朋克”,并把该名设定为自己短篇小说的名字,形容迷失的年轻一代:他们是抗拒父母的权威、与主流社会格格不入、利用电脑技术钻漏洞和制造麻烦的技术宅。经典的赛博朋克角色是边缘且性格疏远的独行者。
赛博朋克深受科幻作者的喜爱,很成功的电影作品有《黑客帝国》。
赛博朋克类小说中的世界是反乌托邦式的,涉及日常生活受到急剧改变的科技影响,普及的计算机化信息笼罩全球,以及侵入性的人体改造。在赛博朋克的作品中,一边是闪烁着霓虹灯光的摩天大楼,富人们在此享受生活,但在阴暗的角落里,到处是黑帮、流氓、抢劫犯的身影,穷人们只能靠电子产品来麻痹自己。闪烁的霓虹灯和摩天大楼上五彩斑斓的大屏幕,让人联想到了《三体》中的超信息时代。
赛博朋克有时也专指这种视觉美学风格。
Hacker ,这个词是用来形容那些热衷于解决问题、克服限制的人。
他们是崇尚自由的,乐于追根究底、穷究问题的特质。
从广义上来说,任何职业都可以成为Hacker 。你可以是一个木匠黑客。不一定是高科技。只要与技能有关,并且倾心专注于你正在做的事情,你就可能成为黑客。
Hacker有别于Cracker,真正的Hacker遵守黑客守则,不破坏任何系统。
IDA是一个功能强大的反汇编器,学习逆向有别于按照一个框架去编写程序,需要灵活的头脑和痴迷于逆向分析的精神。你是在玩解密游戏而不是去建造一座大厦。
本文是将最核心的IDA的使用做了一个总结,删去了为了逻辑严密,内容全面的教科书式的讲解,只总结最和核心有用的实际操作,并且详细配置了图片,对于一些动态调试的具体内容,后续会有专门的博客,将链接贴在这篇文章中,希望大家在阅读完这篇文章之后就能上手使用IDA。
开始阅读核心部分吧
IDA Pro简介
IDA Pro就是一款递归下降反汇编器
反汇编器使用的算法包括:线性扫描反汇编算法、递归下降反汇编算法
IDA并非一款免费软件,为用户提供了一款功能有限的免费版本,不提供最新版本的功能
百度词条:
交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。是最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器!IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或LinuxWinCEMacOS平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。
IDA的基本用法
ida文件加载
可以打开IDA->菜单栏file->open(选择一个二进制文件)
也可以将要分析的二进制文件拖到ida图标上
IDA桌面简介
你看过有关黑客的视频吗,一台性能很高的电脑上下着绿色的字符串雨,黑客盯紧屏幕检索其中的关键信息。
当然这是有一定艺术化处理的,不一定都是绿色的界面。当然你可以根据自己的喜好配置成这样。但是有一点是肯定的,IDA的有关操作需要你查看很多界面,有很多不同的信息需要你整合分析。涉及栈,反汇编代码,反编译代码,程序中包含的字符串等等很多有关需要逆向分析的程序的信息。资深搞逆向工作可以考虑准备一台很大的显示屏。
下面我们来认识一下IDA的这些窗口(View)。
导航带
概况导航栏,也叫作导航带,光标悬停在导航带任何位置会指出其在二进制文件中的位置
Options-color可以修改导航栏的颜色
反汇编窗口
上图是图形视图,按空格键可以和文本视图相互切换
.text:004028EE为区域名称加虚拟地址
图中.text是代码段
Ctrl+“+”可以或者Ctrl加鼠标滚轮实现界面的缩放
views->open subviews->Disassembly可以打开另一个反汇编窗口,每个反汇编窗口互相独立,可以一个查看图形,另一个查看文本
IDA使用不同的箭头颜色来表示不同的流
条件跳转Yes是绿色箭头,No是红色箭头,默认为蓝色箭头
文本窗口右边是箭头窗口
用于描述非线性流程 ,虚线是条件跳转,实线是非条件跳转
粗实线表示程序将控制权交给程序中的以前的某个地址,通常表示程序中存在循环
是反汇编形成的汇编语言代码
按下“;”可以添加注释,用于逆向分析时使用
图中 ; CODE XREF: _main+209↑j是自动生成的表示此处有交叉引用的注释
_main+209↑j表示一个地址,形式是函数+偏移量,↑表示该地址在上面
交叉引用暂不做介绍
函数窗口
为 IDA在数据库中识别的每一个函数,双击一个函数,会跳转到反汇编窗口这个函数所在的位置
十六进制窗口
Hex view
显示的是程序内容和列表的标准十六进制代码
每行十六个字节
还会显示对应的ASCII字符(!!!所以有时string窗口显示的字符串不好查看时,可以打开Hex view查看)
右键->Sychronize with可以选择时是否与某个反汇编窗口相互关联,关联后,两个窗口会同时改变位置
结构体窗口
显示二进制文件中使用的任何复杂的数据结构(C结构体和联合)
使用:
为标准数据结构的布局提供现成的参考
为你提供一种方法,发现程序使用的自定义数据结构时,帮助你创建自己的,可用作内存布局的数据结构
枚举窗口
显示检测到的标准枚举数据类型(C enum)
可以自定义枚举类型
Strings窗口
views->open subviews->Strings打开窗口
显示的是从二进制文件中提取出来的一组字符串,以及字符串所在的地址
从中可以查找程序中使用的字符串(有时也可以用Hex view查勘字符串,但是一般在string窗口中检索想要的关键字符串)
与交叉引用相结合可以快速定位字符串,跟踪到程序中引用这个字符串的位置
Names窗口
显示全局名称
名称是指对一个程序虚拟地址的符号引用
F常规函数
L库函数
I导入的名称
C命名代码
D数据
A字符串数据
ACDU
反汇编的代码并不是完美的,需要手动进行调试
ACDU可以将一段数据类型转化成代码(C),数据(D),未定义的二进制数据(U),字符(A)
例如:
选择一段数据,按下A
交叉引用
概念
交叉引用是一个地址引用一个地址
根据图论的知识,可以把地址看成节点,把交叉引用看成边
分为代码交叉引用和数据交叉引用
代码交叉引用(函数调用,顺序执行和跳转)
三种基本的流
普通流,跳转流,调用流
普通流:就是顺序执行,默认执行流,执行紧跟在后面的指令
跳转流:无条件分支和条件分支分配到一跳转流,注释中出现j后缀
调用流:调用一个函数使用调用流,使用后缀p
数据数据交叉引用
读取交叉引用:访问某个内存位置
写入交叉引用:写入内内存
偏移量交叉引用:引用某个位置的地址
访问交叉引用列表
指定位置Ctrl+x
指定位置Views->Open Subviews->Cross—References
双击一个位置就可以跳转到这个位置
IDA静态分析
静态分析,就是根据反汇编器生成的结果,在不运行这个程序的情况下,逆向分析这个程序的运行过程。
当然反汇编器是机械的根据算法来生成反汇编代码,而逆向和防止逆向是相互竞争的,为了防止逆向,机器代码掺杂了脏字节之类的东西,导致反汇编算法不能正确分析,这是也需要我们手动来调整。而且反汇编生成的代码的变量没有任何实际意义,当我们分析清楚其功能的时候,可以重命名。也可以加注释辅助逆向分析。
名称
IDA会自动生成生成与虚拟地址和与栈帧变量有关的名称,这些名称不能帮助我们认识位置和变量的用途,称为哑名
IDA可以修改名称
修改参数,局部变量,函数名称
按快捷键N可以将光标位置的变量,函数重命名,输入一个空名称IDA会生成默认名称
修改地址的名称
按快捷键N将光标位置的地址重命名
重命名寄存器
按快捷键N将光标位置的寄存器重命名
当编译器将变量分配在寄存器中,而不是程序栈上时
为了更好地引用这个变量,需要重命名寄存器
IDA注释
使用“:”,或者“;”快捷键
函数操作
新建函数
添加一个手动分析,IDA没有分析出来的函数
删除函数
删除一个认为IDA分析错误的函数
代码和数据的相互转换
使用快捷键ACDU
字符串
IDA能是识别大量的字符串格式,默认会搜索并格式化成C风格
可以切换字符串格式
指定数组
IDA生成的反汇编代码很少提供数组大小的信息
只有数组第一个元素被引用
要生成一个便于分析的数组需要手动创建
选择数组第一个元素,菜单栏选择Edit->Array
创建数组的时候,确保将数组中的第一个元素的大小更改为适当的值,从而为数组的元素选择适当的大小
IDA脚本
脚本可以帮助我们完成很多重复的工作,IDA的脚本是针对IDA的工作的脚本。
脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序。
脚本的使用方式和IDC语法
IDA插件
概念
IDA插件是经过编译的,功能更加强大的IDC脚本
通常和热键,菜单关联
插件可能是通用的
处理各种二进制文件或者提供各种处理器体系结构使用
构建插件
插件在Windows上是有效的DLL文件,扩展名为.plx,.pmc,.plx64,lmc64
安装插件
将编译好的插件模块复制到plugins目录当中
插件配置
配置插件通过/plugins/plugins.cfg文件中的设置
IDA动态调试
有时候程序在运行过程中会生成一些关键的数值,而人力通过静态分析的结果模拟程序的运行来推出这些中间的数值可能很麻烦。简单重复的工作是计算机所擅长的而不是人,所以我们可以让这个程序运行起来,得到这些中间过程的数值。这就是动态调试。
调试器通常用于执行以下两种任务(大概了解)
分析与已崩溃进程有关的内存映像,以一种完全受控的方式执行进程
调试会话以一个接受调试的进程为起点
大多数调试器能够依附在一个正在进行的进程上
选择一个进程之后,调试器将捕获该进程的内存快照,以此创建一个临时数据库。除这个正在运行进程的内存映像之外,临时数据库中还包含该进程加载的所有共享库,这使得这个数据库比我们常见的数据库要复杂得多
开始动态调试
1.Debugger->Select Debugger 或按快捷键F9
使用EXE文件可以使用Local Windows Debugger
如果是ELF文件应该放在Linux上用远程调试IDA动态调试ELF文件_光无影的博客-CSDN博客
2.Debuugger->Start Process 或者F9开始调试
3.IDA将显示警告信息
选择Yes,选择No会退出
进程控制
调试器的功能是能严密监控并修改它所调试的进程的行为
所以有一些调试的命令
Continue 继续执行一个暂停的进程。执行将继续,直到遇到一个断点暂停 F9
Pause 暂停一个正在运行的进程 使用工具栏按钮
Terminate 终止一个正在运行的进程
Step into 执行下一条指令,如果下一条是函数调用,就进入函数第一条 F7
Step over 执行下一条指令 如果下一条是一个函数调用,会跨过 F8
Run Until Return 执行当前函数到返回 Ctrl+F7
Run to Cursor 执行进程,直到执行到达当前的光标位置 F9
断点
调试时候执行到设置断点的位置会中断
指定位置F2快捷键设置断点
断点处红色显示
IDA调试器支持硬件断点和条件断点
跟踪
Debugger->Tracing->Tracing Options
IDA的拓展用法
IDA的第三方图形
外部流程图
Views->Graphs->Flow Chart
外部调用图
Views->Graphs->Function Calls
显示函数调用的层次结构
外部交叉引用图
Views->Graphs->Xrefs From
Now, you can try to do some really interesting things with IDA.
Come!
Let's act.