软件逆向分析.ppt

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算过程可以用下面的程序来表达: for(i = 0; i < uLen; i++) uRegCode = ((uRegCode + strUserName[i]) ^ (i << 8)) * (i + 1) * ~(uLen * i); 在计算过程结束之后,存放在uRegCode中的正确注册码被放入eax寄存器中并作为CString::Format()的参数压栈,最后调用CString::Format()将这个值格式化输出到strCode中,并与通过CWnd::GetDlgItemText()取得的用户输入的注册码进行比较。 也可以在CString::Format()这里下个断点观察内存验证结果。 分析出了注册算法,可以为这个crackme编写一个简单的算法注册机(也称keygen,Key Generator)。 实例2 或者可以通过修改代码来完成,就是使用在解密技术上称为“爆破”的方法实现。 在0x40163B处函数调用一个子函数进行字符串比较,返回的结果放在eax中,然后用test指令测试eax中的值是否为0,并根据结果用一个跳转来实现程序流程的控制。 修改“关键跳转”的跳转条件。 实例2 这里要用到ODBG的汇编功能,所谓汇编就是从指定的地址开始写入我们自己的代码。 在jnz这条代码上双击,或者按空格键,将弹出一个汇编窗口,这样就可以开始汇编了。 修改代码有一个原则,就是修改后的代码字节数必须少于或者等于被修改的那条指令代码的长度,否则汇编后会影响到后面我们不想改变的代码。( 80X86指令集各条指令的长度是不一样的 ,汇编前后字节数必须一样) 可以有两个方法:第一,把jnz改成jz,改换跳转实现的条件;第二,把这条跳转指令全部修改为nop。 实例2 目 录 逆向工程概述 调试器和反汇编器 逆向分析实例 断点 专用工具 断点概念 高级语言编写的源代码经过编译连接之后生成的目标代码数量巨大,在海量的代码中我们关心的关键代码往往只占很小一部分,而且在通常的情况下无法确知这些代码的位置。 断点的作用就是在恰当的时机中断正在被调试的进程的执行,并把进程的控制权交给调试器,调试器接管进程的控制权之后,就能对进程进行跟踪调试。 断点有很多种类型,如:函数执行断点,各种内存访问断点,IO端口读写断点,中断向量断点,消息断点等。其中最为常用的是函数执行断点。 例如要在程序中获得对话框中一个文本框中用户输入的文本,就会用到GetWindowText()函数。如果对MessageBox()函数下断点,每当程序运行到调用MessageBox()函数的地方就会被调试器中断。 ? 实例3 实例是PhoxCM3.EXE,该程序采用序列号保护机制,逆向的目标是找出序列号。 运行一下目标程序,?随便输入一个序列号,软件检测序列号错误以后弹出对话框提示“Wrong Code!”。 实例3 在反汇编窗口的右键菜单里找到“查找”选项,在弹出的子菜单中选择“当前模块中的名称”,ODBG自动搜索程序中调用的函数,并将它们在窗口中列出。 可以看到窗口中从User32.dll中输入的GetWindowTextA() 函数,在上面点击右键,选择“在每个参考上设置断点”,ODBG会给程序中所有引用到GetWindowTextA() 函数的地方加上断点。 实例3 断点设置好之后,按F9让程序运行起来。在界面上的文本框中输入注册码,点击OK按钮之后程序执行到GetWindowTextA()函数就会被中断下来。 GetWindowTextA() 函数执行完成后,将缓冲区的首地址存入ebx寄存器,然后调用了GetWindowTextLengthA()函数取得用户输入的注册码长度并比较注册码长度是否等于12H。如果长度不符合就从0x4011BB处跳走,调用MessageBox()提示注册失败。 实例3 再向下看代码,发现程序连续对存放注册码的字符数组中的一组字符做比较,如果都等于预先设定的值,则注册成功。所以正确的注册码长度应该为18位,形式应该为FiXreXWorXxXSuXXxX,其中大写X的位置可以用任意字符替换。 目 录 逆向工程概述 调试器和反汇编器 逆向分析实例 断点 专用工具 专用工具 目前Windows操作系统上有多种语言开发平台,每种语言的编译器在编译源代码生成Win32平台上的可执行程序时都有各自不同的特点。根据这些特点,可以针对各种编译器编译的程序使用不同的专用工具,方便我们的逆向分析。 例如由Visual FoxPro,Java开发的程序可以直接通过专用反编译工具反编译到源代码;部分的.Net程序可以通过Reflector反编译到源代码;Delphi开发的程序可以在调试之前首先使用DED

文档评论(0)

junjun37473 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档