目录
一、IDA
1.1、简介:
1.2、使用方法:
(1)IDA打开文件
(2)IDA主窗口介绍
(3)IDA的基本使用
二、调试器
2.1、简介:
2.2、Ollydbg
(1)主界面
(2)断点操作
(3)代码跟踪操作
2.3、gdb
(1)简介:
(2)安装
(3)基本的调试操作
三、Trace类工具
3.1、简介:
3.2、Qira
一、IDA
1.1、简介:
反汇编工具有很多,但功能最强大、应用最广泛的当属IDA Pro(简称IDA)。在反编译方面,最好的反编译工具为IDA自带的Hex-Ray插件(快捷键为F5),所以这里主要介绍IDA。
IDA支持的文件类型非常丰富,除了包括PE格式、ELF格式之外,还包括DOS、Mach-O、.NET等文件格式。同时IDA还支持几十种不同的处理器架构。
1.2、使用方法:
(1)IDA打开文件
通过菜单栏中的File→Open,选择要分析的目标程序,IDA自动识别出了程序为x86_64的ELF程
序,直接点击OK即可。
(2)IDA主窗口介绍
(1)工具栏区域:常用工具
(2)导航带:加载文件的地址空间的线性视图,其会呈现二进制文件的整个地址范围。不同的颜色表示不同类型的文件
(3)函数窗口:显示了所有的函数
(4)数据显示窗口:数据显示窗口包括:反汇编窗口、反编译窗口、导入表窗口、导出表窗口、结构体窗口等。
(5)消息窗口:是IDA输出的信息,等同于一个控制台输出设备。
(3)IDA的基本使用
(1)函数修正
以push ebp/rbp指令开头的地址为一个函数的起始地址,但是有时候IDA并没有将其正确地识别为函数,此时就需要手动地将其创建为函数,创建函数之后通常就能对该函数进行反编译操作
创建函数的方式为:在函数的起始地址的汇编代码处,点击右键,选择Create Function,对应的快捷键为P
(2)指令修正
在IDA中,如果某些指令或者数据识别有误,可以进行手动修正(如使用快捷键D可转化为数据,使用快捷键C可转化为代码)
(3)数据修正
在数据段中,一个数据的长度可能为1、2、4或8字节,此时可以通过快捷键D来修改为对应的类型。
如果数据段中的某个部分为一个字符串,但是IDA并没有正确识别,那么可以使用快捷键A将其转换为一个ASCII字符串。
(4)注释信息与重命名
修改程序中的变量或者函数名等信息帮助读者理解,点击右键,选择Rename即可进行重命名。
此外,还可以为代码添加注释,使用快捷键“;”可以在反汇编窗口中添加注释,使用快捷键“/”可以在反编译窗口添加注释。
对于一些针对不常用处理器架构编写的程序,可以开启汇编的自动注释功能。开启的方式为勾选界面中的Auto comments
(5)二进制程序的patch
将修正后的多余字节转化为空指令(nop指令,对应的字节码为0x90),这样函数就能够正常地反编译
选择菜单栏中的Edit→Patch program→Change byte功能进行修改
(6)交叉引用
IDA中包含了两类:代码交叉引用和数据交叉引用。
代码交叉引用:
用于表示一条指令将控制权转交给另一条指令。通过代码交叉引用,可以知道哪些指令调用了哪个函数或指令。
数据交叉引用:
可用于追踪二进制文件访问数据的方式。通过数据交叉引用,可以知道哪些指令访问了哪些数据。
二、调试器
2.1、简介:
在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证结果
调试器的两个最基本的特征是:断点设置和代码跟踪。
断点允许用户选择程序中任意位置的某行代码,一旦程序运行到这一行,那么它将指示调试器暂停运行程序,并显示程序的当前状态。
代码跟踪允许用户在程序运行时跟踪它的执行,跟踪意味着程序每执行一条汇编代码然后暂停,并允许用户观察甚至改变程序的状态。
常用的调试器包括:Ollydbg、x64dbg、Windbg和gdb等。其中,Ollydbg可以调试Windows下的32位用户态程序;x64dbg可以调试Windows下的64位应用程序;Windbg是微软提供的调试器,可以对用户程序和系统内核进行调试,但是GUI界面相对来说没有那么友好;gdb是Linux系统下所用的主要调试器。下面主要讲解最常用到的Ollydbg和gdb。
2.2、Ollydbg
Ollydbg(简称OD)是Windows下的一款具有可视化界面的用户态调试工具。OD具有GUI界面,非常容易上手。专用版Ollydbg,该版本具有强大的对抗反调试的功能。
(1)主界面
反汇编窗口:载入程序后,窗口内显示的是程序反汇编后的源代码。
信息窗口:进行动态调试时,窗口内会显示出当前代码行的各个寄存器的信息,或者API函数的调用、跳转等信息,可以用来辅助了解当前代码行的寄存器的运行情况。
数据窗口:默认以十六进制的方式显示内存中的数据。
寄存器窗口:动态显示CPU各个寄存器的内容,包括数据寄存器、指针及变址寄存器、段寄存器,以及控制寄存器中的程序状态字寄存器。
堆栈窗口:显示堆栈的内容。调用API函数或子程序时,通过查看堆栈可以知道传递的参数等信息。
命令行:在原本的OD中是没有命令行的,这个是一个外置的插件,可以方便地在动态调试时输入命令。一般来说,主要是输入下断点或者清除断点的命令。“命令行命令.txt”文件中有详细的命令及
功能介绍,大家可以查看。
(2)断点操作
动态调试时要使程序在关键代码处中断,然后根据显示的动态信息进行动态分析,这就需要对程序下断点。断点有一般断点、内存断点、硬件断点等类型,一般断点是最常使用的断点方式。
1)一般断点
一般断点就是将输入的断点地址处的第一个字节用INT3指令来代替。当程序运行到断点地址时,就会执行INT3指令,Ollydbg就会捕捉到这个指令而中断下来。下断点一般有如下两种方式:
F2键:在反汇编窗口中的代码行上面按F2键就可以下断点。下
断点后,虚拟地址处将呈红色状态。如果想取消断点,再按一下F2键
即可。命令行方式:可以在命令行中使用bp命令下断点。如bp 4516B8
或者bp MessageBoxA。2)内存断点
内存断点分为两种:内存访问断点和内存写入断点。OD每一时刻只允许有一个内存断点。
内存访问断点:在程序运行时调用被选择的内存数据就会被OD中断。根据这个特点,在破解跟踪时只要在关键数据内存中下断点,就可以知道程序在什么地方和什么时候用到了跟踪的数据。该功能对于一些复杂算法的跟踪有很大的帮助。从破解上讲,一个注册码的生成一定是由一些关键数据或者原始数据计算而来的,所以在内存中一定会用到这些关键数据,那么内存访问断点就是比较好的中断方法。
内存写入断点:在程序运行时向被选择的内存地址写入数据就会被OD中断。根据这个特点,在破解时可以跟踪一个关键数据是什么时候生成的,生成的代码段在什么地方。所以,如果不知道一个关键数据的由来,就可以用内存写入断点的方式查看计算的核心。
如果想要设置内存断点,则可以在数据窗口中的十六进制栏内选择一部分内存数据,然后单击鼠标右键出现功能菜单,选择“断点”,然后从中选择内存访问断点或者内存写入断点。
3)硬件断点
硬件断点并不会将程序代码改为INT3指令,如果有些程序有自校验功能,就可以使用硬件断点了。下中断的方法和下内存断点的方法相同,共有三种方式:硬件访问、硬件写入、硬件执行。最多一共可以设置4个硬件断点。
(3)代码跟踪操作
代码跟踪操作主要包括一些常见的快捷键,用于对程序进行动态跟踪。
F9键:载入程序后,按F9键就可以运行程序了。
F7键:单步跟踪(步入),即一条代码一条代码地执行,遇到Call语句时会跟入执行该语句调用地址处的代码或者调用的函数代码。
F8键:单步跟踪(步过),遇到Call语句时不会跟入。
F4键:执行到所选代码。
ALT+F9键:执行到程序领空,如果进入到引用的DLL模块领空,则可以用此快捷键快速回到程序领空。
2.3、gdb
(1)简介:
gdb是一个由GNU开源组织发布的、UNIX/Linux操作系统下的、基于命令行的、功能强大的程序调试工具。
(2)安装
在大多数Linux发行版中,gdb都是默认安装的,如果没有,那么在Ubuntu下可以通过apt-get进行安装
安装命令为:sudo apt-get install gdb
如果需要调试其他架构的elf程序,则可以安装gdb-multiarch
安装命令为:sudo apt-get install gdb-multiarch
此外,gdb也有很多插件,如peda、gef、pwndbg等,这里的插件提供了一些额外的命令,便于对程序进行逆向分析。这些插件都可以在Github上找到,根据其安装说明进行安装即可。图9-9为gdb安装了peda插件之后运行的界面,可以通过peda help命令查看新增的命令。
(3)基本的调试操作
1)启动和结束gdb
2)通用命令
3)断点
4)运行调试目标
5)查看和修改程序状态
6)其他命令
三、Trace类工具
3.1、简介:
通过一定的方式监控并记录程序的运行,然后使分析者在记录的信息中得到程序的一些动态信息
eg:strace工具是Linux下的一个用来跟踪系统调用的工具。一个更为强大的Trace类工具:Qira。
3.2、Qira
官方主页为http://qira.me/,由著名的黑客geohot开发。安装完成之后,运行命令qira-s/bin/ls,这样相当于在4000端口开启服务/bin/ls,使用nc localhost 4000即可连接上去。同时,还会开启3002的Web端口,如图9-10所示。
浏览器Web界面主要包括:
1)最左边两列为fork,每次用nc连一次4000端口,就会多一个fork。图9-10中的两列表示链接过两次4000端口。
2)右边的最上面有4个框,分别对应如下信息。
113表示程序运行的第113条指令。
0表示第0个fork。
0x80484c7表示指令的地址。
0xf6fff01c表示数据的地址。文章来源:https://www.toymoban.com/news/detail-441005.html
3)右边的下面是程序运行的指令、寄存器、内存、调用的系统调
用等。文章来源地址https://www.toymoban.com/news/detail-441005.html
到了这里,关于【软件逆向-分析工具】反汇编和反编译工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!