软件逆向分析

软件逆向分析

ID:20488875

大小:932.50 KB

页数:46页

时间:2018-10-13

上传者:U-2174
软件逆向分析_第1页
软件逆向分析_第2页
软件逆向分析_第3页
软件逆向分析_第4页
软件逆向分析_第5页
资源描述:

《软件逆向分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

逆向分析逆向工程概述调试器和反汇编器逆向分析实例断点专用工具 逆向工程逆向工程,ReverseEngineering,R.E.工程(Engineering):从原理到产品逆向工程的基本思想:从产品到原理(再到产品) 军事中的逆向工程USA,BoeingB-29USSR,TU-4 军事中的逆向工程前苏联SVD狙击步枪国产79/85狙击步枪 软件逆向工程软件逆向工程是通过反汇编和调试等手段,分析计算机程序的二进制可执行代码从而获得程序的算法细节和实现原理的技术。研究对象:没有公开源代码的计算机程序,主要是已经经过编译的二进制可执行代码(如Win32平台上的PE文件,包括exe,dll等文件格式) 与开放源代码的开源软件不同,用户无法修改已经编译成型的可执行文件,或者无法获知程序内部的算法。逆向工程类似于软件工程中的“黑盒”测试。需要借助跟踪调试手段,从二进制机器代码开始分析程序。工作过程与软件工程相反,这就是“逆向工程”这个名词中“逆向”的来源。软件逆向工程 逆向工程的主要应用软件破解(cracking):破解软件的版权保护措施,让用户不支付授权费用就可以无限制使用软件的全部功能;病毒和恶意程序(malware)分析:分析病毒、恶意程序的传播机制和危害并设计出解决办法;系统漏洞分析:分析漏洞原理,设计补丁程序或者编写利用程序(Exploit)。 分析不公开的文件格式、协议等;分析Windows或Mac平台上的硬件驱动程序,编写linux下的相应驱动;挖掘消费电子产品的潜能;挖掘操作系统未文档化的API,发现更多系统内幕;计算机犯罪取证逆向工程的其他应用 逆向工程的历史最早出现在20世纪80年代,APPLEII主机上的游戏破解。逆向工程最早的应用是软件破解。合法性至今存在很大争议。WindowsEnd-UserLicenseAgreement 总结逆向工程的分析方法是从一个已经成型的产品开始逐步向下分解,以期最后在更高的层次上抽象出产品的技术细节。 目录逆向工程概述调试器和反汇编器逆向分析实例断点专用工具 调试器和反汇编器逆向工程的研究对象:特定硬件平台上的可执行二进制代码逆向工程的研究手段:跟踪与调试两种关键工具:调试器和反汇编器 调试器调试器(Debugger):加载被调试的目标程序(或进程),并对它进行动态跟踪和调试。与源码调试的区别:是对程序的二进制可执行代码直接进行调试。各种语言开发环境中自带的调试器功能有限,难以胜任逆向工程的需要。采用专门的调试器 常用调试器-SoftICERing0级内核调试器;通过网络进行远程调试;支持单机的、源程序级的调试能力;支持WindowsNT/9x,功能强大; 常用调试器-OllyDBGOllyDBG(简称ODBG)工作在Ring3下,无需注册免费使用,最新版本是1.10。书中使用ODBG进行实例讲解。1234反汇编窗口寄存器窗口堆栈窗口转存(dump)窗口 常用调试器-WinDBGWinDBG是微软出品的调试器,可以用于源代码调试和系统内核调试,还能分析dump文件,和Windows结合紧密。WinDBG是基于命令使用的调试器。 反汇编器反汇编的概念:把二进制代码翻译成汇编助记符。调试器中自带简单的反汇编引擎,但是这些反汇编引擎功能有限,专业反汇编器可以更好的分析代码。xorebx,ebx0x33,0xDB汇编助记符二进制代码汇编反汇编 反汇编器-IDAProIDAPro(InteractiveDisassemblyPro)功能强大,能反汇编多种硬件平台的指令集,配有众多的反汇编选项;能根据目标程序的编译器识别出很多函数和参数甚至结构体并且自动标注。支持改名,内建简单调试器以及支持很多高级功能。 反汇编器-W32DASMW32Dasm是一个轻量级的反汇编工具对小型文件进行反汇编时速度很快它的优点是使用方便容易上手,缺点是难以对大的文件进行反编译。 目录逆向工程概述调试器和反汇编器逆向分析实例断点专用工具 实例1-直接内存查看Win32进程内存空间当进程开始后,各种数据和资源会以一定结构组织起来映射到主存。默认情况下,Win32系统上每个用户进程可以占有2GB的私有地址空间,操作系统占有剩下的2GB地址空间。进程的代码和各种资源都会在进程内存空间里出现,可以用内存查看工具查看进程内存以获取一些信息例如字符串等。 实例1cont.运行目标程序BS.Crackme.2.exe主窗口上有两个文本框,分别用于输入用户名和序列号这两个注册信息。在用户名文本框中输入用户名newbie,下面随便填入一个注册码11223344,点击check按钮,crackme弹出一个对话框提示输入的注册码错误。 暂时关闭对话框。打开WinHEX,点击工具栏上的OpenRAM按钮,弹出对话框选择想要打开的进程内存。选中PrimaryMemory后点击OK打开BS.Crackme.2.exe的进程内存空间。实例1cont.12 crackme是特意选择给出的特例,程序通过用户名计算出注册码,然后直接用字符串比较函数明码比较输入的假注册码和真注册码是否一致,并且在比较后没有及时清除内存中暂时保存的真正的注册码。基于编程经验,真假注册码在内存中的位置相距不远,可以尝试搜索内存中的“假注册码”,并在周围寻找正确结果。按Ctrl+F打开文本搜索对话框,填入11223344并且选择ANSI编码在内存尽心查找定位。实例1cont. “11223344”在内存中一共出现了两次,在第二次的内存附近可以看到输入的用户名和假注册码,在假注册码的下面是一串数字,猜测是正确注册码。将这个字符串填进crackme的主界面,点击check按钮显示注册成功。实例1cont. 这个crackme是特意选择的例子,仅仅为了说明问题,并不具有普遍适用性。用查看内存的方法之所以能够起作用,根本原因还是程序中计算注册码后使用了明文字符串比较,并且没有及时清除内存中的敏感信息。实例1cont. 实例2实例2的仍然使用实例1的BS.Crackme.2.exe利用调试器根据注册信息找到注册码计算的代码,并且通过跟踪计算过程逆向出注册码的计算过程。Crackme的注册流程:填入注册信息后计算出正确的注册码并与从用户界面上输入的注册码进行比较;结果正确则弹出对话框提示注册成功,反之提示失败。从编程角度来说,一般会在校验过后在用户界面上或者用弹出对话框的形式给用户是否已经注册成功的提示,用于提示的代码应该距离注册码校验的地方不远可以通过观察程序的提示信息(或者其他注册成功的表现)来定位计算和校验注册码的关键代码。 可以利用提示字符串作为切入点来完成逆向工程的任务。ODBG有一个强大的字符串引用查找插件——UltraStringReference,可以在程序中搜索ASCII和Unicode编码的字符串。在反汇编窗口中点击右键,在选项菜单中可以看到有UltraStringReference的选项,选择第一项FindASCII。搜索完毕后ODBG会显示搜索结果,可以看到注册成功时显示的“correctwaytogo,yougotit.”。实例2 实例2在该字符串上双击,ODBG就会自动跳转到对该字符串引用的反汇编代码处。向上卷动一些代码 鼠标点击0x00401542这行代码使之高亮显示,按F2键在这里设置断点,然后按F9让程序运行起来,切换到crackme的界面。填入用户名和注册码点击check按钮以后ODBG捕捉到断点,程序被中断,ODBG自动激活,并且eip就停在断点地址0x00401542上。这时就可以用调试器来跟踪程序。单步运行,观察堆栈和内存数据,可以了解注册流程。函数在开始处定义了3个CString类型的字符串,分别用于存放用户名、用户输入的注册码和由程序计算的真正注册码。实例2 点击check按钮后,函数调用CWnd::GetDlgItemText()函数取得用户界面上文本框控件里用户输入的内容。函数用一个循环来根据用户名计算注册码,结果放在一个无符号整型变量uRegCode中;在完成计算后,将调用CString::Format()函数将这个无符号整型值格式化输出到strCode中(CString类型)。在进入循环之前,uRegCode变量已经有了一个初值0x81276345用于计算注册码。每次从注册用户名中取出一个字符,将其加到uRegCode上,然后异或uRegCode和i左移8位的值(i在这里是循环控制变量),接着计算用户名长度uLen和i的乘积并对结果取反再与i+1相乘。实例2 计算过程可以用下面的程序来表达:for(i=0;i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭