认识注册机破解法
顾名思义,写注册机来破解软件注册的方法,就是模仿您的注册码生成算法或逆向注 册码验证算法而写出来的和您一模相同的注册机。假如被写出注册机,您的软件只好免费了。或您必须更换算法,但以前注过册的合法用户都得被迫更换注册码了。
上期《和暴力破解过招》的方法虽然能够避免爆破,但注册机的威胁还是存在的。Cracker要写注册机必须周详研究您软件的验证模块,这必须先将您的软件脱壳,再反汇编或用调试器跟踪。市面上许多加壳和保护软件都吹嘘不可能被脱壳,但到现在为止没有一个软件兑现了自己的诺言。由于CPU最终执行的都是有效指令,所以等您的程式自解压完成后再从内存中Dump出来就能够实现脱壳。因此不要在壳上面花很多功夫,因为没有这个必要。
第一招:制造假相
反汇编和调试器跟踪都是不可能防止的,因为任何的Win32程式都必须通过API来调用Windows系统中的关键DLL的(如Kernel32.dll、GDI32.dll等),然而API是能够Hook的。我们只能从自己的代码着手来保护我们的劳动果实了。
为了自己调试和以后维护的方便,我们一般采用有意义的名字给我们的函数命名,可这给了Cracker可乘之机。例如这样的函数是什么意思大家应该一目了然吧?IsRegistered(),IsLicensed(),LicenseVerify(),CheckReg()……这样Cracker就能够轻松地从数千个函数中找到他的目标——您的注册码校验函数!而且破解Delphi编写的软件更有一件TMG小组的破解利器——DeDe。他能够轻松地看到您软件里的Form、Unit和函数名,还能够反汇编一部分代码,更能够和Win32DASM合作反汇编更多的代码,对Delphi编出的程式威胁极大。
为了不给Cracker创造温馨舒适的破解环境,要故意混乱(Obfuscate)我们的代码,将软件中任何的函数名全部替换成随机生成的函数名。例如Func_3dfsa_fs32zlfv这个函数是什么意思?恐怕只有天知道了。网上有现成的代码混乱器,按您使用的编程语言的种类能够找到一些。但要注意,只有当您要发布软件时才使用他,而且一定注意备份源代码。否则,当您看不懂您自己的代码时就着急了:)
第二招:用公匙,并改名
另外,一定要使用公开密匙算法保护您的软件。RSA、DSA和El Gamal之类的算法都能够从网上找到。但注意:将您算法单元中任何涉及到算法名称的字符串全部改名。避免被Cracker发现您用的算法而模仿写出注册机来!您还能够张冠李戴,明明用的DSA,将名字全部替换成RSA。
其他算法,如对称算法和Hash算法也要注意改名,否则这样:
EncryptedCode = Blowfish(MD5(UserName),MD5(Key));
//您的加密算法,使用了Blowfish(对称算法)和MD5(Hash算法)
虽然那些Cracker不了解Blowfish和MD5算法的原理,也不会逆向推测他们,但他们了解您的校验算法的流程和算法名,便可马上从网上找到类似的Blowfish和MD5算法包,从而模拟您的软件仿造出注册机。
假如您用不常见的,算法如Skipjack(NASA美国航天局标准算法)、LOKI、3-WAY、Safer之类不出名但保密程度很高的算法,并且全部改名,这样就会伤透他们脑筋了。
当然,最好把Hash算法也全部改名,会给他们制造更多的困难。但注意,MD5和SHA之类的Hash初始值会被Cracker从内存中找到,这样他就知道您用的Hash了。所以建议同时使用MD5的变形算法Ripe-MD(RMD)128或160或其他的Hash,如Tiger、Haval等算法。
第三招:阻止别人调试
更有一点,调试器对我们的威胁很大,我们不会让Cracker们舒舒服服地使用SoftICE、TRW或OllyDbg来调试我们的程式。除了常用的MeItICE方法外,这里我给一个笔者写的方法:
{检查自己的进程的父进程是否为Explorer.exe,否则是被调试器加载了}
{但是注意,控制台程式的父进程在WinNT下是Cmd.exe!}
{注意加载TlHelp32.pas单元}
procedure CheckParentProc;
var //检查自己的进程的父进程
Pn: TProcesseNtry32;
sHandle:THandle;
H,ExplProc,ParentProc:Hwnd;
Found:Boolean;
Buffer:array[0..1023]of Char;
Path:string;
begin
H:= 0;
ExplProc:= 0;
ParentProc:= 0;
//得到Windows的目录
SetString(Path,Buffer)
GetWindowsDirectory(Buffer,Sizeof(Buffer)- 1));
Path:= UpperCase(Path) '/EX PLORER.EXE';//得到Explorer的路径
//得到任何进程的列表快照
sHandle:= CreateToolHelp32Snap Shot(TH32CS_SNAPALL,0);
Found:= Process32First(sHandle,Pn);//查找进程
while Found do //遍历任何进程
begin
if Pn.szExeFile = ParamStr(0)then //自己的进程
begin
ParentProc:= Pn.th32ParentProcessID://得到父进程的进程ID
//父进程的句柄
H:= OpenProcess(PRO CESS_ALL_ACCESS,True,Pn.th32Parent ProcessID);
end
else if UpperCase(Pn.szExeFile)= Path then
ExplProc:= Pn.th32ProcessID;//Ex plorer的PID
Found:= Process32Next(sHandle,Pn);//查找下一个
end;
//父进程不是Explorer,是调试器……
if ParentProc <> ExplProc then
begin
TerminateProcess(H,0);//杀之!除之而后快也! :)
//您还能够加上其他什么死机代码来消遣消遣这位可爱的Cracker:)
end
end
您能够在Delphi或VC中试试,这样能够把Delphi和VC杀掉了,因为您现在用的是Delphi和VC的内置调试器来运行您的程式。调试的时候您还是把他的注释删掉吧,发布时别忘记激活哟!
第四招:保护字符串
最后一个问题,这也是个很重要的问题:保护您的字符串!字符串在注册模块中很重要!当一个富有经验的Cracker破解您的软件时,首先做的就是窃取您的字符串。比如他会输入错误的注册码,得到您关于错误注册码的提示,通常是“无效的注册码,请重新输入!”或“Invalid key(please input again)”等等,然后用OllyDbg进行断点调试或用WinDASM、IDA Pro等静态分析工具在被他脱壳后的程式中查找那个字符串,找到后进行分析。因此,请一定加密您的字符串! 使用时再临时解密出来,而且要尽量少使用消息提示框,避免被Cracker找到漏洞。加密字符串无需太复杂的算法,随便找一个快速的对称算法就能够了。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




