我爱电脑技术论坛's Archiver

tianshiren 发表于 2008-6-29 11:14

注册机破解法的原理和应对

顾名思义,写注册机来破解软件注册的方法,就是模仿你的注册码生成算法或者逆向注 册码验证算法而写出来的和你一模一样的注册机。如果被写出注册机,你的软件只好免费了。或者你必须更换算法,但以前注过册的合法用户都得被迫更换注册码了。
Y0d:^ D/I   上期《与暴力破解过招》的方法虽然可以避免爆破,但注册机的威胁还是存在的。Cracker要写注册机必须详细研究你软件的验证模块,这必须先将你的软件脱壳,再反汇编或者用调试器跟踪。市面上许多加壳和保护软件都吹嘘不可能被脱壳,但到目前为止没有一个软件兑现了自己的诺言。由于CPU最终执行的都是有效指令,所以等你的程序自解压完成后再从内存中Dump出来就可以实现脱壳。因此不要在壳上面花很多功夫,因为没有这个必要。
s1Q"t{9VCM] gKfWL6@ LT
  第一招:制造假相
O2Hw7D+o.A5DN/I(k6o
&N*d"n5u2Y   反汇编和调试器跟踪都是不可能防止的,因为所有的Win32程序都必须通过API来调用Windows系统中的关键DLL的(如Kernel32.dll、GDI32.dll等),然而API是可以Hook的。我们只能从自己的代码着手来保护我们的劳动果实了。
MI.w4L9Dm r?ueXfe
  为了自己调试和以后维护的方便,我们一般采用有意义的名字给我们的函数命名,可这给了Cracker可乘之机。例如这样的函数是什么意思大家应该一目了然吧?IsRegistered(),IsLicensed(),LicenseVerify(),CheckReg()……这样Cracker就可以轻松地从数千个函数中找到他的目标——你的注册码校验函数!而且破解Delphi编写的软件还有一件TMG小组的破解利器——DeDe。它可以轻松地看到你软件里的form、Unit和函数名,还可以反汇编一部分代码,更可以和Win32DASM合作反汇编更多的代码,对Delphi编出的程序威胁极大。
(E U'hU N
9y,r,i XZ za   为了不给Cracker创造温馨舒适的破解环境,要故意混乱(Obfuscate)我们的代码,将软件中所有的函数名全部替换成随机生成的函数名。例如Func_3dfsa_fs32zlfv这个函数是什么意思?恐怕只有天知道了。网上有现成的代码混乱器,按你使用的编程语言的种类可以找到一些。但要注意,只有当你要发布软件时才使用它,而且一定注意备份源代码。否则,当你看不懂你自己的代码时就着急了:) 4l)V.C Y4GGIf6zd
']8r mP%YG
  第二招:用公匙,并改名 5^7d g1Q/{(g
xUUqL2k
  另外,一定要使用公开密匙算法保护你的软件。RSA、DSA和El Gamal之类的算法都可以从网上找到。但注意:将你算法单元中所有涉及到算法名称的字符串全部改名。避免被Cracker发现你用的算法而模仿写出注册机来!你还可以张冠李戴,明明用的DSA,将名字全部替换成RSA。 "dtI R*DB*r

\NnKP7f!eIK   其它算法,如对称算法和Hash算法也要注意改名,否则这样: c5Nd%V-Ta4Sl
$T`;DG I-pF%}r%V
  EncryptedCode = Blowfish(MD5(UserName),MD5(Key));
spy,u)Zx
lFSy9d&Q:~   //你的加密算法,使用了Blowfish(对称算法)和MD5(Hash算法) tR*y#g,K(U\
/z VNTf
  虽然那些Cracker不了解Blowfish和MD5算法的原理,也不会逆向推测它们,但他们了解你的校验算法的流程和算法名,便可马上从网上找到类似的Blowfish和MD5算法包,从而模拟你的软件仿造出注册机。 w&?)t]#RC
;qgJ0Y6r!v
  如果你用不常见的,算法如Skipjack(NASA美国航天局标准算法)、LOKI、3-WAY、Safer之类不出名但保密程度很高的算法,并且全部改名,这样就会伤透他们脑筋了。
v9E1\)K$Kn gDV0KS {z |btT+o
  当然,最好把Hash算法也全部改名,会给他们制造更多的困难。但注意,MD5和SHA之类的Hash初始值会被Cracker从内存中找到,这样他就知道你用的Hash了。所以建议同时使用MD5的变形算法Ripe-MD(RMD)128或160或其它的Hash,如Tiger、Haval等算法。
F-VJ`u%I-U
y*? j h1Vc   第三招:阻止别人调试 "S)r,f!t*rb:L*mb

~3V p0[\Y   还有一点,调试器对我们的威胁很大,我们不会让Cracker们舒舒服服地使用SoftICE、TRW或OllyDbg来调试我们的程序。除了常用的MeItICE方法外,这里我给一个笔者写的方法: ({O2P1AjH

+aHbB}H l   {检查自己的进程的父进程是否为Explorer.exe,否则是被调试器加载了}
YY_^tH!Z9nY T
#D4V Z D4n7Q'\Z%{-n {不过注意,控制台程序的父进程在WinNT下是Cmd.exe!}
S!sg u8M?!~7Cq   {注意加载TlHelp32.pas单元}
zp'r lqR d&D*Y6J#?fg4C.O C
  procedure CheckParentProc;
A!e/Q `8m4AXz1l   var //检查自己的进程的父进程
Z vv DGm   Pn: TProcesseNtry32; &Ay-JT8}$C(Me
  sHandle:THandle;
tZ/jo? Kq G9I8j   H,ExplProc,ParentProc:Hwnd;
z&tZP6f8@Gf:^   Found:Boolean; z!mK}YP~N aXl
  Buffer:array[0..1023]of Char; T[;H?)o;r2m&b$H
   Path:string; 6@ w#_H#?/W/FM?
  begin
b4k7qCw!c_6~   H:= 0;
l_~D&bM[(U   ExplProc:= 0;
^C6E-U/t;r?   ParentProc:= 0;
O M]1g2d(^X0g`:~   //得到Windows的目录
Vt?3Q1u4I&A Oq/~   SetString(Path,Buffer) _,PFd0dqdx&I
  GetWindowsDirectory(Buffer,Sizeof(Buffer)- 1)); k rY gs
  Path:= UpperCase(Path)+ '\EX PLORER.EXE';//得到Explorer的路径 2g1zt]%y i%t
  //得到所有进程的列表快照 )h&P];}q@2C,n8{HMtT
  sHandle:= CreateToolHelp32Snap Shot(TH32CS_SNAPALL,0); L;RgsD%` ^b uV/j5mp
  Found:= Process32First(sHandle,Pn);//查找进程
v+MPt1I9L(cQ^   while Found do //遍历所有进程 '_q ag[ H
  begin )I+s"R~;y8oWS%N
  if Pn.szExeFile = ParamStr(0)then //自己的进程 -PucN.o
  begin
a&n#n[Y E   ParentProc:= Pn.th32ParentProcessID://得到父进程的进程ID
N0P$MJ J#M0W)K   //父进程的句柄 *s&H D { |*e"U
  H:= OpenProcess(PRO CESS_ALL_ACCESS,True,Pn.th32Parent ProcessID);
-T&[J YY p UY   end f^k^c&@}0l~~
  else if UpperCase(Pn.szExeFile)= Path then 8e)T(P qeL.r4q'M V
  ExplProc:= Pn.th32ProcessID;//Ex plorer的PID :M1G_1x\%Z ~,B
  Found:= Process32Next(sHandle,Pn);//查找下一个 8x3aNC&QV3i2^
  end;
{1ju;_3[vCx   //父进程不是Explorer,是调试器…… H:E8TE7W^
  if ParentProc <> ExplProc then Qx`0B,l-A#|&A
  begin 3zc q i$R
  TerminateProcess(H,0);//杀之!除之而后快也! :)
t2q#_e#kcg-W/P   //你还可以加上其它什么死机代码来消遣消遣这位可爱的Cracker:) O l.MUT
   end X|p#wXg%{
  end
{Mm9{6D5fb$H;D 8o ~'cXZY @0u\
  你可以在Delphi或者VC中试试,这样可以把Delphi和VC杀掉了,因为你现在用的是Delphi和VC的内置调试器来运行你的程序。调试的时候你还是把它的注释删掉吧,发布时别忘记激活哟!
2zj9vs.Y6AS |YW4~~6W{ f
  第四招:保护字符串 1y F6xt![Nr e

j~q9B.{B\Gv   最后一个问题,这也是一个非常重要的问题:保护你的字符串!字符串在注册模块中非常重要!当一个富有经验的Cracker破解你的软件时,首先做的就是窃取你的字符串。比如他会输入错误的注册码,得到你关于错误注册码的提示,通常是“无效的注册码,请重新输入!”或者“Invalid key(please input again)”等等,然后用OllyDbg进行断点调试或者用WinDASM、IDA Pro等静态分析工具在被他脱壳后的程序中查找那个字符串,找到后进行分析。因此,请一定加密你的字符串! 使用时再临时解密出来,而且要尽量少使用消息提示框,避免被Cracker找到漏洞。加密字符串不需要太复杂的算法,随便找一个快速的对称算法就可以了。 @1C#` nu&chR6g \:y

c C;T'o,B|7k   最后提醒大家一句,不要在加密上花太多的功夫!你应该把更多的时间和精力都用来完善你的软件,这样会更合算。借用一位前辈的话来忠告大家吧:花点时间考虑你自己的软件,看看它是否值得保护?如果没人用你的软件,保护也就没有意义了,不要过高估计你的软件“对世界的重要性”!

wudi3344er 发表于 2008-6-29 14:21

内容详细 明确 不错

LOK 发表于 2008-6-30 22:46

不错的课程,我学习了。

fst10 发表于 2008-7-2 08:59

给注册机破解提供了方向

jackyyf 发表于 2008-7-10 10:32

我..支持k9v.W:q2iF0[z
  我..顶.Y5YB(}W2s)[F
     我...我...我..完全看不懂..

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.