怎么制作破解版软件 怎么破解

首先,我们要明确一点:
理论上没有破解不了的软件,但不代表破解软件比开发容易一万倍 。
反破解的目的不是做一个无法破解的软件,而是让破解软件的成本远大于购买软件的成本 。现在,笔者简单展示几种有代表性的软件破解 。当然,要理解下面的内容,需要有一点C语言的编程基础 。
先说最简单的软件破解 。假设我们写了一个软件,它的注册方法代码如下
#include "stdio.h"#include "string.h"int main(){char Key哦,不,结束了 。我还是被抓住了 。;printf("请输入注册码:");gets(Key);if (strcmp(Key,"abc123456")==0)printf("注册成功");elseprintf("注册失败");}
把他编译成exe运行 。
我该怎么破解?超级简单 。你可以把这个程序的后缀改成txt,打开,搜索注册码,然后翻看密钥就可以找到了 。
不要笑,即使在今天,仍然有大量的软件使用这种软件保护机制,但这些软件大多不是很有价值,比如xx管理系统、计算器等等,或者软件作者别有用心 。你可能会问,有什么问题?这种保护机制的问题是,目前大多数编译器会直接在可执行文件结构中存储字符串常量,所以如果你硬编码了密钥,那么上面的破解方法
然后,我们进入防破解2.0时代为了与时俱进,我们对上面的代码稍作改动 。
#include "stdio.h"#include "string.h"#include "windows.h"#include "math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;sprintf(Key,"%x",iID*8 123456);printf("你的机器码是%x\n",iID);printf("请输入注册码:");gets(iKey);if (strcmp(Key,iKey)==0)MessageBoxA(0,"注册成功","",MB_OK);elseMessageBoxA(0,"注册失败","",MB_OK);}
现在“TXT”破解方法已经没用了 。看,钥匙找不到了 。
【怎么制作破解版软件 怎么破解】这个保护手段怎么样?是不是很熟悉的公式?这个机器码可以根据网卡MAC、CPU型号、内存大小等生成 。当然密钥算法也可以用MD5,SHA等来做 。而不是简单的8加123456相乘 。总之从机器码到注册码都可以玩算法 。
然而,这有什么用呢?打开ollydbg,打破MessageBoxA(即弹出窗口的功能) 。
然后输入错误的注册码,命中断点 。很快,我们就来到了逻辑处理码,判断注册码是否正确 。
猜猜如果我们为了判断注册码是否正确(nop指令填充)而删除这段代码会发生什么
你会发现,捧草,无论我输入什么,都是注册成功 。
那么问题出在哪里?你发现万恶之源始于MessageBox函数 。正是这个功能让我们找到了注册码判断码 。今天,非常非常大的一部分软件仍然在使用这种二三十年前使用的保护方法 。每年MessageBox被破解的软件都死掉,可以绕地球三圈 。这种保护机制让所谓的软件在发布后十分钟就被破解,悲剧收场 。
这时候你吸取惨痛的经验,mmp,还有一颗痣 。由于MessageBox不好用,我就是不用,所以你把代码改成下面这样
#include "stdio.h"#include "string.h"#include "windows.h"#include "math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;sprintf(Key,"%x",iID*8 123456);printf("你的机器码是%x\n",iID);printf("请输入注册码:");gets(iKey);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);}
看,啧啧 。只要你没有输入正确的注册码,我就直接退出软件(或者跳转到别的地方),看你怎么办 。
不幸的是,“注册成功”这个词每年都会背叛你 。打开ollydbg,查找字符串引用,然后双击 。
[32]
你注意到在这样的地方判断注册码确实不靠谱,于是你改变了策略,把检查注册码的代码复制N遍,或者一个字符一个字符的检查注册码的准确性 。有的人把注册成功之类的话加密或者混淆,需要的时候再拿出来 。
#include "stdio.h"#include "string.h"#include "windows.h"#include "math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;sprintf(Key,"%x",iID*8 123456);printf("你的机器码是%x\n",iID);printf("请输入注册码:");gets(iKey);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);}
放心吧,不管你抄多少遍,发现只是时间问题,吃枣就破解了 。同时,只要你想用明文字符串,迟早都要解密 。这种方法类似于添加upx压缩shell,只需等待数据解压,一切又会是明文 。所以及时解密比较明智,使用后立即擦除明文,可能会耽误更长时间 。但这还是时间问题 。
你开始发现,主动出击不如找出内奸,就是我们出名是为了解决问题而不是解决问题 。最后你开始攻击调试器,然后你成功进化到反破解V2.5时代 。
这个时候就不得不介绍一个古老却非常有名的函数了 。
IsDebugPresent
你可能有点困惑 。这个功能是做什么用的?简单来说,当我们破解一个程序时,大多数情况下,我们会打开一个叫调试器的东西,对软件进行反编译和分析 。呃,这才是重点 。IsDebugPresent函数可以检测我们的程序是否被调试器附加了 。想想吧 。一般情况下,我们在使用软件的时候会用到调试器 。如果你给我附上调试器,你肯定会想干坏事 。
所以,你开始像这样写代码:
#include "stdio.h"#include "string.h"#include "windows.h"#include "math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;if (IsDebuggerPresent()){MessageBoxA(NULL,"小样,就你还破解我的程序,回家喝奶去吧","",MB_OK);return 0;}sprintf(Key,"%x",iID*8 123456);printf("你的机器码是%x\n",iID);printf("请输入注册码:");gets(iKey);if (strcmp(Key,iKey)==0)printf("注册成功");elseexit(0);}
因此,下次ollydbg加载并调试您的程序时,将会出现以下场景 。
很长一段时间(包括现在)很多软件或者加密壳都会检查自己是否有调试器调试 。例如,tls段将在加载时执行 。如果他们检查到正在被调试和破解,就会设置一个标签,让程序运行到无用的地方或者干脆退出重启 。也有办法通过使用变形的PE头让调试器无法加载 。
可惜还是没用 。例如,IsDebugPresent可以通过修改FS寄存器的标志位使其完全不点火 。同样的手段包括但不限于检查int 3软中断、Raw调用、查询PEB、检查调试权限和父进程等等 。有办法绕过它 。
暗桩,只要插上,总能一根一根拔出来 。
好吧,我们还能做什么?不,别担心 。一只脚比另一只高 。现在我们正处于最流行的3.0版VMP时代 。
首先澄清一下,这里的VMP不是VMP壳 。它被称为虚拟机保护 。简单来说,为什么我们对破解软件如此熟悉?不仅仅是因为我们太熟悉x86 x64 arm的汇编指令集 。如果我们自己发明一套指令集,然后用这套指令集编写程序,在自己的虚拟机上运行,那么,当破解者进来的时候,我们看到的就是一脸的傻样 。
遗憾的是,VM的运行机制决定了它可能会造成几十倍甚至上百倍的性能损失 。因此,必须使用VMP来保护不是性能瓶颈的关键代码,否则您的软件将像
那么,VMP保护机制是否完善?当然不是 。说白了,VMP只能延长分析时间 。如果你让VMP变得足够复杂,足以让一个破解者喝醉,但如果这个时间足够长,你的软件足够有价值,足以让人们想要破解它,他们仍然可以充分分析你的VM的运行机制 。等你的VM运行机制搞清楚了,软件离倒下也就不远了 。
不过你放心,分析VM机的执行机制比自己写VM机麻烦多了 。毕竟一个是你需要通过代码去猜测别人的想法,一个是你自己的想法转化成代码 。因此,基于此,可以说:
破解软件比做软件简单 。很多时候是不存在的!
你可能会问为什么市面上那么多软件,那么多游戏,那么多听起来那么牛逼的防护软件,结果却被破解了 。它们在发出后仅仅一天就被破解了 。
其实大问题在于这种商业保护软件(比如保护壳),因为这些保护壳大部分都会卖给大量的软件开发者 。在叫树有一种说法,这就像流行的VMP保护机制 。之所以能受到保护,是因为它的运行机制不明确 。如果你自己用这个软件,而你的软件又不值钱,除非大boss 空寂寞冷 。不然谁有那个闲工夫分析你的虚拟机是怎么运行的,但是商业保护壳就不一样了 。不管它采用什么样的保护机制,只要分析清楚,使用这种保护机制的软件几乎都会倒下,而且在灰色行业 。这种破解甚至是相当赚钱的,只要这个保护机制不更新,一次投入,长期回报 。所以只能说,第一次分析要花很长时间,然后只会花很长时间 。
所以,其实买一个商业保护壳的保护效果并没有想象中的那么强,很可能在灰色行业是无效的 。就算是有防反基础的码农也可能自己写,效果更好 。当然,一个软件被破解的概率并不高,还是我之前说的那句话:反破解不是让软件无法破解,而是让破解软件的成本远大于购买软件的成本 。
毕竟你说你的软件开源了没人喜欢用,你还整天琢磨怎么防止被破解 。
然后你会开始问,有没有更强大的防破解技术?看来我们之前说的无非是拖延时间 。呃,我们必须正确对待这件事 。不管是加密还是解密,其实说白了,最终都是在拖延时间 。看看那些加密算法 。根据他们的数学理论,如果你要解密他们,他们的计算量就算把全世界所有的计算机加起来,也足够你计算三个末日了 。
不过不用担心,还有更厉害的方法 。想想吧 。为什么之前说那么多软件都被破解了?最关键的原因之一是我们可以得到代码 。即使这个代码已经是一堆编译好的汇编指令,只要我们有了这堆代码,迟早还是能搞清楚这个程序是怎么回事,然后对症下药干坏事 。
就像给你一袋面粉,程序就是面包机 。你往面包机里塞面粉做面包 。有一天,你很好奇 。面包机是怎么做出一片面包的?你把面包机拆开,然后你就知道面包机是怎么回事了 。
那么有什么方法可以让用户不知道我们的代码是什么样的呢?就像你给面包师面粉做面包,这个面包是怎么做出来的?你只能希望看到面包师是否有心情告诉你 。
为此,有请一个相当普及和通用的早期游戏反破解工具(物理) 。
现在你可能看起来像个问号,但我不是在跟你开玩笑 。在2000年,大多数游戏都在光盘上运行,但盗版也很容易 。一旦拷贝了光盘里的数据,就可以拷贝一万张盗版光盘,于是游戏厂商想办法,就想到了锤子 。
操作方法很简单 。拿个锤子和钉子,在光盘上钉几道划痕,造成人为的坏磁道,然后把数据刻录到正确的扇区 。这样虽然程序还能正确运行,但是光头在读取光盘的时候,就无法读取了,所以你会发现打开光盘后,没有关键文件,无法复制游戏或者程序,同时会标记坏轨的位置 。这个标记在游戏运行的时候也会被检查,所以如果你想盗版,你得拿起锤子,在CD的相同位置打出相同的划痕 。当然,这几乎是不可能的 。
这种技术当年也叫防盗环技术,但不管名字多高大上,本质上和锤钉子是一回事 。遗憾的是,虚拟光盘出现后,也有办法重现光盘的所有数据(包括坏轨) 。所以,这种技术在今天毫无用处,但还是给了我们足够的启发 。
现在让我们进入防破解V3.x时代之所以不叫V4.0,是因为这种技术已经存在很久了,比VMP保护的普及要早得多,可能是最新的理论上无法破解的防破解手段 。
首先,我们谈到了加密狗或Ukey保护,即要运行软件,你需要在电脑中插入一个类似u盘的东西 。其实这个UKey就是一个微型计算机,软件的一些关键算法和代码都在这个Ukey芯片里 。当我们PC上的软件运行时,当我们需要执行这样的关键算法时,我们会将数据传输到这个UKey,然后Ukey会计算出结果 。将其回归到PC的软件中,避免用户直接逆向获取关键算法代码,无法破解 。这就是为什么今天,Ukey保护仍然非常受欢迎 。
不幸的是,UKey保护仍然有许多限制 。第一,带Ukey贼麻烦 。如果Ukey丢了,补办起来很麻烦,跑软件插UKey也很麻烦 。同时,UKey的性能决定了它可能无法执行一些消耗性能和内存过多的代码空,数据交互也会因为带宽和通信延迟造成性能损失,所以和VMP保护机制一样 。也不是省油的灯,开发者水平也不到位 。该保护的代码没有保护,一堆已经保护的无用代码也会给破解者带来机会 。再说了,只要你的软件足够值钱,你是不是太看不起我华强北了?
把Ukey拆开,用某种“药水”剥开外层找到内部芯片,连接上融合的“读针”(有的芯片甚至省去这一步,直接用热风枪读取ROM),然后读出芯片的代码 。
因此,UKey protection也宣告陨落 。
你发现只要把实体的东西交给用户,迟早会有问题 。所以在大多数情况下,这种Ukey保护就变成了一种带有数字证书的网络认证方式 。这种关键代码是从Ukey传到服务器的,数据交互是通过网络完成的 。其实这个保护机制和Ukey保护原理是一样的,没有本质区别 。但考虑到网络带宽的延迟,也有一定的性能损失和设计缺陷 。
需要强调的是,这种网络保护手段必须经过专门设计,以保护程序中一系列关键的“功能性”代码,而不是“防破解”代码(如代码解密和注册验证),因为后者仍然可以清除“防破解”代码或转储代码或伪造本地服务器来实现破解 。那么你期待什么样的X盾呢?x宝可以一劳永逸的保护程序,程序必须由专业的码农专门设计,而不是彩笔,才能达到应有的保护效果 。
但现实情况是,由于用户离线操作和性能延迟的瓶颈,这种网络保护设计往往存在很大缺陷 。所以,不是说这个东西不好,而是理想很丰满,现实很骨气,没办法 。
当然,代码保护的手段很多,花样也很多 。本文仅简单介绍几种有代表性的开裂和防开裂手段 。如果你感兴趣,你想学习:

    推荐阅读