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

首先,我们要明确一点:
理论上没有破解不了的软件,但不代表破解软件比开发容易一万倍 。
反破解的目的不是做一个无法破解的软件,而是让破解软件的成本远大于购买软件的成本 。现在,笔者简单展示几种有代表性的软件破解 。当然,要理解下面的内容 , 需要有一点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 , 只需等待数据解压,一切又会是明文 。所以及时解密比较明智,使用后立即擦除明文,可能会耽误更长时间 。但这还是时间问题 。