软件逆向分析.ppt_第1页
软件逆向分析.ppt_第2页
软件逆向分析.ppt_第3页
软件逆向分析.ppt_第4页
软件逆向分析.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,逆向分析,逆向工程概述 调试器和反汇编器 逆向分析实例 断点 专用工具,逆向工程,逆向工程,Reverse Engineering, R.E. 工程(Engineering):从原理到产品 逆向工程的基本思想:从产品到原理(再到产品),军事中的逆向工程,USA, Boeing B-29,USSR, TU-4,军事中的逆向工程,前苏联SVD狙击步枪,国产79/85狙击步枪,软件逆向工程,软件逆向工程是通过反汇编和调试等手段,分析计算机程序的二进制可执行代码从而获得程序的算法细节和实现原理的技术。 研究对象:没有公开源代码的计算机程序,主要是已经经过编译的二进制可执行代码(如Win32平台上的P

2、E文件,包括exe,dll等文件格式),与开放源代码的开源软件不同,用户无法修改已经编译成型的可执行文件,或者无法获知程序内部的算法。 逆向工程类似于软件工程中的“黑盒”测试。 需要借助跟踪调试手段,从二进制机器代码开始分析程序。 工作过程与软件工程相反,这就是“逆向工程”这个名词中“逆向”的来源。,软件逆向工程,逆向工程的主要应用,软件破解(cracking):破解软件的版权保护措施,让用户不支付授权费用就可以无限制使用软件的全部功能; 病毒和恶意程序(malware)分析:分析病毒、恶意程序的传播机制和危害并设计出解决办法; 系统漏洞分析:分析漏洞原理,设计补丁程序或者编写利用程序(Exp

3、loit)。,分析不公开的文件格式、协议等; 分析Windows或Mac平台上的硬件驱动程序,编写linux下的相应驱动; 挖掘消费电子产品的潜能; 挖掘操作系统未文档化的API,发现更多系统内幕; 计算机犯罪取证,逆向工程的其他应用,逆向工程的历史,最早出现在20世纪80年代,APPLEII主机上的游戏破解。 逆向工程最早的应用是软件破解。 合法性至今存在很大争议。,Windows End-User License Agreement,总结,逆向工程的分析方法是从一个已经成型的产品开始逐步向下分解,以期最后在更高的层次上抽象出产品的技术细节。,目 录,逆向工程概述 调试器和反汇编器 逆向分析

4、实例 断点 专用工具,调试器和反汇编器,逆向工程的研究对象:特定硬件平台上的可执行二进制代码 逆向工程的研究手段:跟踪与调试 两种关键工具:调试器和反汇编器,调试器,调试器(Debugger):加载被调试的目标程序(或进程),并对它进行动态跟踪和调试。 与源码调试的区别:是对程序的二进制可执行代码直接进行调试。 各种语言开发环境中自带的调试器功能有限,难以胜任逆向工程的需要。采用专门的调试器,常用调试器 - SoftICE,Ring 0级内核调试器; 通过网络进行远程调试 ; 支持单机的、源程序级的调试能力; 支持Windows NT/9x,功能强大;,常用调试器 - OllyDBG,Olly

5、DBG(简称ODBG)工作在Ring3下,无需注册免费使用,最新版本是1.10。书中使用ODBG进行实例讲解。,1,2,3,4,反汇编窗口 寄存器窗口 堆栈窗口 转存(dump)窗口,常用调试器 - WinDBG,WinDBG是微软出品的调试器,可以用于源代码调试和系统内核调试,还能分析dump文件,和Windows结合紧密。WinDBG是基于命令使用的调试器。,反汇编器,反汇编的概念:把二进制代码翻译成汇编助记符。 调试器中自带简单的反汇编引擎,但是这些反汇编引擎功能有限,专业反汇编器可以更好的分析代码。,xor ebx, ebx,0 x33,0 xDB,汇编助记符,二进制代码,汇编,反汇编

6、,反汇编器 IDA Pro,IDA Pro (Interactive Disassembly Pro) 功能强大,能反汇编多种硬件平台的指令集,配有众多的反汇编选项; 能根据目标程序的编译器识别出很多函数和参数甚至结构体并且自动标注。 支持改名,内建简单调试器以及支持很多高级功能。,反汇编器 W32DASM,W32Dasm是一个轻量级的反汇编工具 对小型文件进行反汇编时速度很快 它的优点是使用方便容易上手,缺点是难以对大的文件进行反编译。,目 录,逆向工程概述 调试器和反汇编器 逆向分析实例 断点 专用工具,实例1 直接内存查看,Win32进程内存空间 当进程开始后,各种数据和资源会以一定结构

7、组织起来映射到主存。默认情况下,Win32系统上每个用户进程可以占有2GB的私有地址空间,操作系统占有剩下的2GB地址空间。 进程的代码和各种资源都会在进程内存空间里出现,可以用内存查看工具查看进程内存以获取一些信息例如字符串等。,实例1 cont.,运行目标程序BS.Crackme.2.exe 主窗口上有两个文本框,分别用于输入用户名和序列号这两个注册信息。在用户名文本框中输入用户名newbie,下面随便填入一个注册码11223344,点击check按钮,crackme弹出一个对话框提示输入的注册码错误。,暂时关闭对话框。打开WinHEX,点击工具栏上的Open RAM按钮,弹出对话框选择想

8、要打开的进程内存。 选中Primary Memory后点击OK打开BS.Crackme.2.exe的进程内存空间。,实例1 cont.,1,2,crackme是特意选择给出的特例,程序通过用户名计算出注册码,然后直接用字符串比较函数明码比较输入的假注册码和真注册码是否一致,并且在比较后没有及时清除内存中暂时保存的真正的注册码。 基于编程经验,真假注册码在内存中的位置相距不远,可以尝试搜索内存中的“假注册码”,并在周围寻找正确结果。 按Ctrl+F打开文本搜索对话框,填入11223344并且选择ANSI编码在内存尽心查找定位。,实例1 cont.,“11223344” 在内存中一共出现了两次,在

9、第二次的内存附近可以看到输入的用户名和假注册码,在假注册码的下面是一串数字,猜测是正确注册码。 将这个字符串填进crackme的主界面,点击check按钮显示注册成功。,实例1 cont.,这个crackme是特意选择的例子,仅仅为了说明问题,并不具有普遍适用性。 用查看内存的方法之所以能够起作用,根本原因还是程序中计算注册码后使用了明文字符串比较,并且没有及时清除内存中的敏感信息。,实例1 cont.,实例2,实例2的仍然使用实例1的BS.Crackme.2.exe 利用调试器根据注册信息找到注册码计算的代码,并且通过跟踪计算过程逆向出注册码的计算过程。 Crackme的注册流程:填入注册信

10、息后计算出正确的注册码并与从用户界面上输入的注册码进行比较;结果正确则弹出对话框提示注册成功,反之提示失败。 从编程角度来说,一般会在校验过后在用户界面上或者用弹出对话框的形式给用户是否已经注册成功的提示,用于提示的代码应该距离注册码校验的地方不远 可以通过观察程序的提示信息(或者其他注册成功的表现)来定位计算和校验注册码的关键代码。,可以利用提示字符串作为切入点来完成逆向工程的任务。 ODBG有一个强大的字符串引用查找插件Ultra String Reference,可以在程序中搜索ASCII和Unicode编码的字符串。 在反汇编窗口中点击右键,在选项菜单中可以看到有Ultra Strin

11、g Reference的选项,选择第一项Find ASCII。 搜索完毕后ODBG会显示搜索结果,可以看到注册成功时显示的“correct way to go, you got it.”。,实例2,实例2,在该字符串上双击,ODBG就会自动跳转到对该字符串引用的反汇编代码处。 向上卷动一些代码,鼠标点击0 x00401542这行代码使之高亮显示,按F2键在这里设置断点,然后按F9让程序运行起来,切换到crackme的界面。 填入用户名和注册码点击check按钮以后ODBG捕捉到断点,程序被中断,ODBG自动激活,并且eip就停在断点地址0 x00401542上。这时就可以用调试器来跟踪程序。单

12、步运行,观察堆栈和内存数据,可以了解注册流程。 函数在开始处定义了3个CString类型的字符串,分别用于存放用户名、用户输入的注册码和由程序计算的真正注册码。,实例2,点击check按钮后,函数调用CWnd:GetDlgItemText()函数取得用户界面上文本框控件里用户输入的内容。 函数用一个循环来根据用户名计算注册码,结果放在一个无符号整型变量uRegCode中; 在完成计算后,将调用CString:Format()函数将这个无符号整型值格式化输出到strCode中(CString类型)。 在进入循环之前,uRegCode变量已经有了一个初值0 x81276345用于计算注册码。 每次

13、从注册用户名中取出一个字符,将其加到uRegCode上,然后异或uRegCode和i左移8位的值(i在这里是循环控制变量),接着计算用户名长度uLen和i的乘积并对结果取反再与i+1相乘。,实例2,计算过程可以用下面的程序来表达: for(i = 0; i uLen; i+) uRegCode = (uRegCode + strUserNamei) (i 8) * (i + 1) * (uLen * i); 在计算过程结束之后,存放在uRegCode中的正确注册码被放入eax寄存器中并作为CString:Format()的参数压栈,最后调用CString:Format()将这个值格式化输出到s

14、trCode中,并与通过CWnd:GetDlgItemText()取得的用户输入的注册码进行比较。 也可以在CString:Format()这里下个断点观察内存验证结果。 分析出了注册算法,可以为这个crackme编写一个简单的算法注册机(也称keygen,Key Generator)。,实例2,或者可以通过修改代码来完成,就是使用在解密技术上称为“爆破”的方法实现。 在0 x40163B处函数调用一个子函数进行字符串比较,返回的结果放在eax中,然后用test指令测试eax中的值是否为0,并根据结果用一个跳转来实现程序流程的控制。 修改“关键跳转”的跳转条件。,实例2,这里要用到ODBG的汇

15、编功能,所谓汇编就是从指定的地址开始写入我们自己的代码。 在jnz这条代码上双击,或者按空格键,将弹出一个汇编窗口,这样就可以开始汇编了。 修改代码有一个原则,就是修改后的代码字节数必须少于或者等于被修改的那条指令代码的长度,否则汇编后会影响到后面我们不想改变的代码。( 80X86指令集各条指令的长度是不一样的 ,汇编前后字节数必须一样) 可以有两个方法:第一,把jnz改成jz,改换跳转实现的条件;第二,把这条跳转指令全部修改为nop。,实例2,目 录,逆向工程概述 调试器和反汇编器 逆向分析实例 断点 专用工具,断点概念,高级语言编写的源代码经过编译连接之后生成的目标代码数量巨大,在海量的代

16、码中我们关心的关键代码往往只占很小一部分,而且在通常的情况下无法确知这些代码的位置。 断点的作用就是在恰当的时机中断正在被调试的进程的执行,并把进程的控制权交给调试器,调试器接管进程的控制权之后,就能对进程进行跟踪调试。 断点有很多种类型,如:函数执行断点,各种内存访问断点,IO端口读写断点,中断向量断点,消息断点等。其中最为常用的是函数执行断点。 例如要在程序中获得对话框中一个文本框中用户输入的文本,就会用到GetWindowText()函数。如果对MessageBox()函数下断点,每当程序运行到调用MessageBox()函数的地方就会被调试器中断。,实例3,实例是PhoxCM3.EXE

17、,该程序采用序列号保护机制,逆向的目标是找出序列号。 运行一下目标程序,随便输入一个序列号,软件检测序列号错误以后弹出对话框提示“Wrong Code!”。,实例3,在反汇编窗口的右键菜单里找到“查找”选项,在弹出的子菜单中选择“当前模块中的名称”,ODBG自动搜索程序中调用的函数,并将它们在窗口中列出。 可以看到窗口中从User32.dll中输入的GetWindowTextA() 函数,在上面点击右键,选择“在每个参考上设置断点”,ODBG会给程序中所有引用到GetWindowTextA() 函数的地方加上断点。,实例3,断点设置好之后,按F9让程序运行起来。在界面上的文本框中输入注册码,点

18、击OK按钮之后程序执行到GetWindowTextA()函数就会被中断下来。 GetWindowTextA() 函数执行完成后,将缓冲区的首地址存入ebx寄存器,然后调用了GetWindowTextLengthA()函数取得用户输入的注册码长度并比较注册码长度是否等于12H。如果长度不符合就从0 x4011BB处跳走,调用MessageBox()提示注册失败。,实例3,再向下看代码,发现程序连续对存放注册码的字符数组中的一组字符做比较,如果都等于预先设定的值,则注册成功。所以正确的注册码长度应该为18位,形式应该为FiXreXWorXxXSuXXxX,其中大写X的位置可以用任意字符替换。,目

19、录,逆向工程概述 调试器和反汇编器 逆向分析实例 断点 专用工具,专用工具,目前Windows操作系统上有多种语言开发平台,每种语言的编译器在编译源代码生成Win32平台上的可执行程序时都有各自不同的特点。根据这些特点,可以针对各种编译器编译的程序使用不同的专用工具,方便我们的逆向分析。 例如由Visual FoxPro,Java开发的程序可以直接通过专用反编译工具反编译到源代码;部分的.Net程序可以通过Reflector反编译到源代码;Delphi开发的程序可以在调试之前首先使用DEDE分析;VB编译的软件可以用专用的WKT调试器进行P-Code的调试等等。 前面没有提及该工具,适当介绍。,PE信息查看工具PEiD,一般直接反汇编或者用调试器调试之前我们通常都会先用一些PE文件查看工具先期获取一些PE文件的信息,如程序使用什么编译器编译的,查看区段,是否已经被加壳等。 PE信息查看工具有很多种,比如PE-Scan,PEiD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论