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. polya定理小结

    polya的精髓就在与对循环节的寻找,其中常遇到的问题就是项链染色类问题. 当项链旋转时有n种置换,循环节的个数分别是gcd(n, i); 当项链翻转时有n种置换,其中当项链珠子数位奇数时,循环节的个 ...

  2. uva 371 - Ackermann Functions

    #include <cstdio> int main() { long int F, S, I, Count, Value, Max, J; while(scanf("%ld % ...

  3. Linux中yum手动安装、手动建立仓库文件夹关联实现关联包自动安装、yum相关命令使用

               yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指 ...

  4. css应用三

    1. Padding与margin Padding为内边距,padding值会计算在width和height之内.如:width:100px:height:100px:padding:10px:该di ...

  5. Map的三种遍历

    import java.util.*;/*** Map的三种遍历方式* @author Administrator**/public class m {public static void main( ...

  6. Linux企业级项目实践之网络爬虫(1)——项目概述及准备工作

    我们在学习了Linux系统编程之后,需要一些实战项目来提高自己的水平,本系列我们通过编写一个爬虫程序,将我们学习的知识进行综合应用,同时在实现项目的过程中逐渐养成一些有用的思维方式,并具有初步的软件开 ...

  7. SRM 599 DIV1

    A 首先发现对于2操作,每种素因子可以单独考虑,然后取出步数最多的计入答案,然后分别加上对每种素因子的1操作; 第二步我犯了个错误,以为最优方案是把素因子指数按二进制操作,在1的位置执行1操作,0的位 ...

  8. hdu 4586 Play the Dice(概率dp)

    Problem Description There is a dice with n sides, which are numbered from 1,2,...,n and have the equ ...

  9. OC 图片圆角实现

    self.imageTouX.layer.masksToBounds=YES; self.imageTouX.layer.cornerRadius=/2.0f; //设置为图片宽度的一半出来为圆形 s ...

  10. (转)Android’s HTTP Clients

    转载自:http://android-developers.blogspot.com/2011/09/androids-http-clients.html Most network-connected ...