设为主页 | 加入收藏 | 繁體中文

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

  顾名思义,写注册机来破解软件注册的要领,便是仿照你的注册码生成算法大概逆向注 册码验证算法而写出来的和你一模一样的注册机。要是被写出注册机,你的软件只好收费了。大概你必须更换算法,但曩昔注过册的合法用户都得自愿更换注册码了。
  上期《与暴力破解过招》的要领固然可以制止爆破,但注册机的威胁照旧存在的。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找到漏洞。加密字符串不需要太复杂的算法,随便找一个疾速的对称算法就可以了。
  末了提醒大家一句,不要在加密上花太多的工夫!你应该把更多的工夫和精力都用来完善你的软件,如许会更合算。借用一位前辈的话来忠告大家吧:花点工夫考虑你本身的软件,看看它是否值得掩护?要是没人用你的软件,掩护也就没故意义了,不要过高估计你的软件“对天下的紧张性”!
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: