OD调试9—实例:深入分析代码完成软件破解

    爆破,是最初级的解决方案,不到万不得已,我们不直接修改JNZ通关。因为这样子的话,我们就享受不到破解、逆向的真正乐趣了。

  了解程序背后按照剧情发展经常会出的一些走法,逆向程序的算法,才能体会逆向的真正乐趣!

  所以,今天的主题是:是男人,就跟进去吧~

  这次还是使用一个比较简单的程序,不然太复杂的话,一步步跟进程序可能会把自己搞崩溃,脑子恐怕不够搞。大家凭自己的能力,能进入多少就进入多少,一分不少,一寸不多!能力是培养出来的,耐心!

  试验软件:MrBills.exe(一个扫描仪软件)

  软件下载链接:http://pan.baidu.com/s/1hq7rKpu

  运行起来看看:

    记住这句注册失败的提示信息。因为它可以作为一个关键的字符串来寻找。

  未注册版的软件一般会限制功能,注册完成后才让你使用所有功能。

  用OD打开这个可执行文件,开始分析:

1 查找字符串:

  Cpu窗口右键->查找所有参考文本字符串->查找注册失败的提示信息”You have entered an xxxxxx”  (注意把进度条拉至文本子串最上方,因为它是从上往下查找的)

  查找结果如下图:

  双击该字串,跟随到cpu窗口代码处。

  在这里我们找到了上方一个突破口—跳转jnz,这里如果jnz跳转的话,就直接来到了注册成功处:”Thank you for registering!”,所以它是一个关键跳转。

2 分析:

  (1)那么跳转jnz的条件判断是由谁引起的呢?

  是在它上方的test  al , al。因为这句会改变寄存器里标志位ZF的值(0或1)。

  test进行的是逻辑与运算(and),如果两个al为1的话,结果为1;两个为0的话,结果为0。它不改变al的值,只会修改标志位。

  此时通过eax寄存器可以看出al为0,所以ZF标志位为1,(运算结果为0时,标志位Z置1),进而jnz不会跳转,即来到注册失败处。

  由此我们就可以推理出,想办法把al的值由0变为1,就可以实现关键跳转,进而使软件注册成功了!!

  (2)那么al的值在哪里被修改过呢?或者说是谁决定了al的值呢?

  可以看到在test语句上方有一个call,我们在win32汇编语言里学过:Call调用函数进行一堆操作之后的返回值都存放在EAX里,也就是说这个call会影响到al的值。(al是eax的最低位/最后一个字节,eax是32位的,al是8位)

  那么这个call就是需要进入分析的,在该处下断点,重载后写入注册信息触发该断点,接着进入这个call里,来到下图:

  进入之后呢,不要盲目地按F8过,先观察下程序内容(很多朋友就一直F8走,寄存器也不看,下面地址也不看,进行了什么样的逻辑关系也不看,就是直接的走,然后就迷路了!)

  观察之后,我们发觉,又出现了两个相连call和test(如上图),这两个call也会影响到我们关注的al的值,所以注释上【需进入】,方便之后进入分析。下面进入第二个call里,如下图:

  进入第二个call里,发现了两个关于al的可疑之处(如上图),mov  bl,al  mov  al,bl  这两句是干啥呢?将al的值给bl,bl的值再还给al….??现在可以推想一下: bl可能是用来暂时保存数据的,al标志着是否已经被注册,它不希望被修改,所以将al保存在bl里面,经过一些操作后,再将bl赋给al。那么在这之前,决定al值得call或许就是一个关键点!我们接着进入上图中的第4个call,如下图:

在这里走过一遍,发现al的值在这里被bl赋为0,这里就是修改的关键点了,将这个al的值修改为1的话,就应该注册成功了,我们先走出去,稍后再来一轮在这里进行修改。

  F8走出这里后回到第二个关键call的位置,如下图:

  继续往下走,我们要绕出去!

  好了,进到几个关键call里用火眼金睛巡视了一番后,终于找到了注册的关键所在,只要把第4个关键call里的al的值修改为1(原来为0),就应该可以注册成功了!

  修改如下:

  修改后点击运行:成功注册了了!!

  点击确定,软件变为了已注册版:

OD调试9—实例:深入分析代码完成软件破解的更多相关文章

  1. OD调试6—使未注册版软件的功能得以实现

    OD调试6—使未注册版软件的功能得以实现 本节使用的软件下载链接 (想动手试验的朋友可以下载来试试) 继续开始我OD调试教程的学习笔记. 本次试验对真正的程序进行逆向.(之前的都是为破解而专门设计的小 ...

  2. OD调试学习笔记7—去除未注册版软件的使用次数限制

    OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需 ...

  3. OD调试篇3-小软件破解1

    OD调试篇3-小软件破解1 要求如下图该软件需要改5个地方,其中1.2是软件未注册而设定限定的添加个数,3.4.5是软件显示的一些未注册的信息. 一. 1.按1运行程序,添加用户添加第五个时出现提示, ...

  4. OD调试4--去除NAG窗口

    OD调试4--去除NAG窗口 nag本意是烦人的意思,nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口.软件设计者可能认为当用户忍受不了试用版中的这些烦人的窗口时,就会考虑购买正式版本. 一 ...

  5. OD调试1--第一个win32程序

    OD调试一:第一个Win32程序的修改 在软件开发的过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误.而在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证分析结果.由于 ...

  6. alert一般用来调试客户端的javascript代码,以及更好的调试方法

    alert一般用来调试客户端的javascript代码 调试利器--console.log 如今主流浏览器(Chrome,IE8及后续版本,FireFox,Opera等)都支持控制台功能. Chrom ...

  7. 逆向---03.mov、test等汇编指令、EAX、关键Call、OD调试技巧

    上一篇:逆向---02.je & jmp & jnz .OD调试 基础知识:(栗子中也会说的)栗子:链接: https://pan.baidu.com/s/1qZbbTvQ 密码: i ...

  8. JavaBean 基础概念、使用实例及代码分析

    JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...

  9. OD调试篇7--笔记及解题报告

    MFC:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows AP ...

随机推荐

  1. php 邮件发送代码-php邮件群发

    php 邮件发送如何进行的呢? php邮件发送是通过smtp协议进行的. 下面是一个php邮件发送的类的一个函数. 文件下载 function sendmail($to, $from, $subjec ...

  2. (转)yum 和 apt-get 用法及区别

    原地址:http://www.cnblogs.com/adforce/archive/2013/04/12/3017577.html 一般来说著名的linux系统基本上分两大类:  1 RedHat系 ...

  3. ZOJ3558 How Many Sets III(公式题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud How Many Sets III Time Limit: 2 Seconds   ...

  4. SDP (Session Description Protocol)

    SDP的描述网络上一大堆中文的,可以看看RFC2327 SDP 信息是文本信息,采用 UTF-8 编 码中的 ISO 10646 字符集.SDP 会话描述如下:(标注 * 符号的表示可选字段):  v ...

  5. CSS实现三角形效果

    类似三角形的形状的元素在网页中可能会用到,我们可以用图片或者CSS元素达到我们想要的效果.这里讲一下是讲自己使用HTML+CSS实现三角形的方式. 为了能够熟悉的使用HTML+CSS构建三角形,我们首 ...

  6. JavaScript键盘事件全面控制代码

    JavaScript键盘事件全面控制,它可以捕获键盘事件的输入状态,可以判断你敲打了键盘的那个键,ctrl.shift,26个字母等等,返回具体键盘值. <html> <head&g ...

  7. uC/OS-II中的中断(转)

    中断是指在程序运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程. 中断服务函数(ISR)是应中断请求而运行的程序. 中断向量就是中断服务函数(ISR)的入口地址, ...

  8. MySQL锁等待分析【1】

    场景: 昨天业务系统上遇到了数据库慢的问题(对dcsdba.og_file_audit表的insert 慢&超时).分析后定位到是由于锁等待造成的.分析过程如下: 1.执行show proce ...

  9. 【转】const的用法,特别是用在函数前面与后面的区别!

    在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const成员函数中,this的类型是一个指向 ...

  10. shell编程技术之-基础知识

    一.脚本结构 linux下shell的脚本,是将一系列命令序列写在一个文本文件,而这个文本文件时可执行的.相对命令行来说,开发效率提高.因此他的构架有2部分构成#!和命令序列.其中#!指明此脚本是用哪 ...