OD调试学习笔记7—去除未注册版软件的使用次数限制
OD调试学习笔记7—去除未注册版软件的使用次数限制
本节使用的软件链接 (想自己试验下的可以下载)
一:破解的思路
仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需要你掏腰包来获得更多的功能或者解除限制。那么我们就可以逆向的来思考,如果该程序成功的注册后,那么程序的行为必将发生变化,如NAG去除了,如功能限制没有了等等。也就是说,程序的代码的走法也会跟未注册的时候截然不同。因为程序的行为改变了,那么决定它所有行为的代码走法也会发生变化。
二:认识OD的两种断点
- OllyDBG从原理上来区分,有两种不同的断点:软件断点和硬件断点。
- 也许会有朋友说那不是还有内存断点吗?
- 内存断点严格来说是属于一种特殊的软件断点。
- 内存断点:
– 内存断点每次只能设置一个,假如你设置了另一个内存断点,则上一个会被自动删除。
– 设置一个内存断点,会改变整块(4KB)内存的属性,哪怕你只设置一个字节的内存断点。
– 另外还需要提一下的是,内存断点会明显降低OD的性能,因为OD经常会校对内存。
- 软件断点:
– 当我们按下F2设置的断点就是软件断点。
– 设置该断点的原理是在断点处重写代码,插入一个int3中断指令,当CPU执行到int3指令的时候,OD就可以获得控制权。
- 硬件断点:
– 这个原理跟软件断点不同,硬件断点的可行性依赖于CPU的物理支持。
– 传说中,有这么一些寄存器,它们只用于调试,我们称为调试寄存器:Dr0~Dr7
– 其中Dr0~Dr3四个寄存器用来存放中断地址,Dr4、Dr5保留不使用,Dr6、Dr7用来记录Dr0~Dr3的属性(如读,写还是执行,单位是字节,字还是双字)。
– 因此,这就解释了为啥硬件断点只有四个,天生不足哈。
- 要如何来区分何时使用何种断点呢?
- 这两种断点在使用上都有它们自身的限制,只要搞清楚它们各自的特性就知道何时该用哪个了。
- 例如软件断点就只能在OD的CPU界面下,在数据段它下不了,在一条指令的中间它也下不了。
- 在我们这个例子中,断点我们想下在windows的动态链接库里,我们需要用到硬件断点,因为用软件断点下在dll文件中是不会保存的,重启程序后将丢失断点。
实验开始
调试软件:VisualSite Designer.exe,这是一个类似photoshop的软件
软件来源:www.fishc.com(小甲鱼OD调试篇7)
运行软件发现有使用次数的限制,并且关闭程序后有广告弹出,如下图:


三 去除使用次数的限制
找到诸如NAG窗口调用处的方法:
一路F8,遇到停止的call处(或者说遇到NAG的call处)设置断点,再F7进入。直到找到最终call出NAG的地方。
注意:在上述的过程中,设置断点的方式有两类:(1)程序领空处设置软件断点,(2)动态链接库,即系统领空处设置硬件断点。

上图即为最终调用NAG的call处,这句call语句执行的有两件事:(1)计数器减一,即剩余使用次数减一(2)弹出程序。
将该处汇编为:mov
eax,1
保存修改,再执行,提示使用次数限制的NAG窗口便消失了。
四 去除广告
od运行程序,关闭软件主界面,弹出广告

Od界面按下暂停键,按下【k】查看堆栈调用情况,如下图:

发现只有一个是来自应用程序的堆栈,其他都是动态链接库的(系统),跟随到该处地址,如下图所示:

将图中的call直接nop掉,再保存修改载入,广告就没有了!
以上是程序行为未发生改变时的破解,接下来讲程序行为发生改变后的破解。
五 程序行为改变后的破解
程序行为发生改变是指注册前和注册后的行为发生改变,或者说表现在程序可用和程序不可用时的行为有了不同。
如本例程序,如果把限制的使用次数用完会发生什么事情?很简单,程序就不给我们打开了呗!那程序不给我们打开了,它的代码走的路线就会不同,即代码行为发生了改变。
判断代码走的路线有两种方案,一种是条件判断,一种是jump+变量(后一种以后再介绍)
这里用第一种,od载入原始程序(从未修改过的最初版)从开始一直F8走,碰到跳转(黄色的)进行注释,跳转实现的注释Y,未实现的注释N。就这样耐心地注释到最终调用nag窗口的地方。为什么要这么做呢?这可以说是破解程序的不二选择,或者说是最保守的方法。注释完成后,将软件使用次数用完,使程序行为发生改变。
注释的目的是就是为了和行为发生改变后的代码做对比,通过对比,找出不一样的关键处,也就知道了程序行为改变的原因了。这种方法可以称为破解的绝对方案(也就是绝对行得通的方案)
按照此方法,对比不同的地方,如下图:

上图中的jle是导致代码行为发生改变的“重要嫌疑犯”,该跳转在程序可用时(软件使用次数未用完)是未实现跳转,现在程序不可用时(软件使用次数用完了)变为了跳转实现,又是在最靠近NAG的地方,所以它引起了我们的注意!
于是,尝试修改这条jle指令,在它上方将test eax,eax修改为mov eax,1。因为在test eax,eax处eax的值显示为0,将其改为1的话,应该就使其不跳转了。
如下图:

修改后,保存。载入修改后的程序,运行,发现虽然NAG窗口提示剩余使用次数为0次,但依然可以进入使用软件了。
同理运用之前说过的方法再去除广告和NAG窗口之后,一个没有使用次数限制,没有广告,没有NAG的软件就呈现在我们面前了!

OD调试学习笔记7—去除未注册版软件的使用次数限制的更多相关文章
- OD调试6—使未注册版软件的功能得以实现
OD调试6—使未注册版软件的功能得以实现 本节使用的软件下载链接 (想动手试验的朋友可以下载来试试) 继续开始我OD调试教程的学习笔记. 本次试验对真正的程序进行逆向.(之前的都是为破解而专门设计的小 ...
- spring cloud(学习笔记)高可用注册中心(Eureka)的实现(二)
绪论 前几天我用一种方式实现了spring cloud的高可用,达到两个注册中心,详情见spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一),今天我意外发现,注册中心可以无限 ...
- PX01关于手机屏SPI触摸调试学习笔记
上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.xk-image. ...
- PX01关于手机屏IIC触摸调试学习笔记
相关文件下载: 上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.x ...
- 学习笔记:暴力破解WIFI小软件
小弟 自己的学习笔记,做练习的 ,缺陷还很多,做到无法解决速度问题就不想做下去了,如果要看的话 主要是思路问题,获取句柄,控制句柄而已,代码比较简单.大神勿喷啊 破解DEMO源码:http://dow ...
- Jquery学习笔记(9)--注册验证复习(未用到ajax)
纯复习,在$(this).val()这里浪费了时间,val()只适合input里面的value值,如果是span等标签里包裹的文本要用text()!! <!DOCTYPE html> &l ...
- spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一)
最近在学习的时候,发现微服务架构中,假如只有一个注册中心,那这个注册中心挂了可怎么办,这样的系统,既不安全,稳定性也不好,网上和书上找了一会,发现这个spring cloud早就想到了,并帮我们解决了 ...
- Windows调试学习笔记:(二)WinDBG调试.NET程序示例
好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...
- Windows调试学习笔记:(一)WinDBG中加载SOS和CLR
最近产品环境出现了部分服务器当机情况,虽然重启之后问题就不出现了.但本着彻底解决问题的态度,想要找到root cause.多次尝试Visual Studio失败(可能是代码惊醒了优化和签名)之后,决定 ...
随机推荐
- noip2015运输计划
二分+LCA+查分前缀和 #include<iostream> #include<cstring> #include<cstdio> #include<alg ...
- 公众号的秘密,知道一个biz就够了
公众号的秘密,知道一个biz就够了 微信对于我来说,最有价值的是一个学习渠道,特别是搜狗微信搜索(http://weixin.sogou.com/)能够很方便的搜索公众账号和文章内容,PC端就能够获得 ...
- mysql索引之唯一索引
mysql 的唯一索引一般用于不重复的字段,一般会把表中的id设为唯一索引,创建唯一索引的目的不是为了提高查询速度,而是为了避免数据重复,注意:唯一索引可以有多个,但是列值必须唯一,创建唯一索引使用关 ...
- jquery节点查询
jQuery.parent(expr) //找父元素 jQuery.parents(expr) //找到所有祖先元素,不限于父元素 jQuery.children ...
- POJ1961 KMP算法
POJ1961 问题重述: 输入一个长度为l的字符串S,求所有S的由字串重复排列而成的前缀,并输出前缀的长度以及该前缀的最大重复度. AC代码: //Memory: 5700K Time: 641MS ...
- .NET winform 在listview中添加progressbar
找了好长时间没找到,后来索性自己写了一个: 首先,在往listview加载数据的事件里添加progressbar: foreach (string d in arr) { ; item = new L ...
- EAT/IAT Hook
标 题: EAT/IAT Hook 作 者: Y4ng 时 间: 2013-08-21 链 接: http://www.cnblogs.com/Y4ng/p/EAT_IAT_HOOK.html #in ...
- 认识 web 服务器端脚本语言 PHP
---恢复内容开始--- 变量 定义:定义之后,值可以改变的量.PHP中的变量可以先后赋值为不同类型的值. 语法格式:$变量名 = 值; 常量 定义:常量:一旦声明之后,值就不能再改变的量. 语法格式 ...
- Gradle Android客户端程序打包(基于gradle 2.10版本验证通过)
一.前言 目前正在准备从eclipse开发环境向AndroidStudio迁移,提前过去探探路,不出所料,原来gradle脚本果然报错,无法运行,想想索性把本地的gradle一起升级到最新版本,毕竟1 ...
- Pick two points at random from the interior of a unit square, what is the expected distance between them?
My solution is as folllowing. This integration is hard to solve. I googled it, and found the result ...