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处(或者说遇到NAGcall处)设置断点,再F7进入。直到找到最终callNAG的地方。

注意:在上述的过程中,设置断点的方式有两类:(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的软件就呈现在我们面前了!

时间: 2024-10-05 22:00:01

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

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

OD调试6—使未注册版软件的功能得以实现 继续开始我OD调试教程的学习笔记. 本次试验对真正的程序进行逆向.(之前的都是为破解而专门设计的小程序) 这次试图对一个“太监版”的程序进行完整化,也就是把限制的功能恢复,把阉割的功能添加等等.用到的知识也是之前提到的,但是会有不同的地方. 试验软件:PixtopianBook.exe(一个通讯录软件) 打开原始程序运行,观察界面: 这是一个通讯录软件,老外写的,很显然,当前是未注册版,试验后发现有功能限制,限制是只能有三个分组,每组不能超过4个人.也就

HTML学习笔记--实例-创建一个注册页面--select两个option出来结果却是四个选项,其中两个空白选项的原因?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

ANDROID_MARS学习笔记_S05_002_给传感器注册listener

1 1 @Override 2 public void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.main); 5 //获取SensorManager对象 6 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 7 //获取光线传感器对象 8

[后缀数组]【学习笔记】【未完】

研究了好长时间....(诶好像莫比乌斯反演时也说过这句话) 参考资料: 1.http://wenku.baidu.com/link?url=Beh6Asxvtm7M2QY5kiPyKKaP87xvBrNBKW9LXOeGKm-WM4GoUM3opnHZ8z-DahF7TRaLZZ4cpUe6jfFF064XUEmAiIDF7t90CpgNfSC3_Pq 2.http://www.cnblogs.com/staginner/archive/2012/02/02/2335600.html 3.htt

python 3.x 学习笔记18 (mysql 未完 )

1.数据库(Database)是按照数据结构来组织.存储和管理数据的仓库 2.RDBMS即关系数据库管理系统(Relational Database Management System)的特点: 1).数据以表格的形式出现 2).每行为各种记录名称 3).每列为记录名称所对应的数据域 4).许多的行和列组成一张表单 5).若干的表单组成database 3.RDBMS 术语 数据库:     数据库是一些关联表的集合..数据表:     表是数据的矩阵.在一个数据库中的表看起来像一个简单的电子表

MyBatis学习笔记(曹锋老师版)

第2讲 这一讲主要讲解了 Mybatis 的主配置文件. 下面是一个示例的配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <c

Spark零基础学习笔记(一)——Python版

由于Scala才刚刚开始学习,还是对python更为熟悉,因此在这记录一下自己的学习过程,主要内容来自于spark的官方帮助文档,这一节的地址为: http://spark.apache.org/docs/latest/quick-start.html 文章主要是翻译了文档的内容,但也在里边加入了一些自己在实际操作中遇到的问题及解决的方案,和一些补充的小知识,一起学习. 环境:Ubuntu 16.04 LTS,Spark 2.0.1, Hadoop 2.7.3, Python 3.5.2, 利用

c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.h 和.cc 中,需要演示某一题直接修改 #define NUM****, 如运行14.30题为#define NUM1430: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful f

Java学习笔记(Javase毕向东版视频)六 常用API对象二

1.基本数据类型对象包装类:见下图 1 public class Test { 2 public static void main(String[] args){ 3 Demo(); 4 toStringDemo(); 5 jdkDemo(); 6 } 7 8 private static void jdkDemo() { 9 //注意:在1.5之后的版本中可以使用下面的形式 简化书写 ,这是版本升级的一个方面 10 Integer i=3; //自动装箱,jdk是Integer i = Int