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

软件暴力破解的原理和应对方法

  共享软件是现在世界上软件业比力抢手的话题,海内更是云云。成千上万的中国程序员以极 大的热情投入到这个范畴来,都向往着用辛劳的休息获得丰盛的报答;但,现实并非云云,绝大少数的人都铩羽而归。值得细致的是:除了软件设计和技术上的缘故原由外,最大的缘故原由便是共享软件被破解(Crack)了……
  面临破解
  一个做共享软件的作者,面临的是已经形成团伙的众多破解妙手,海内的什么CCG、BCG,外洋的eGis、King、Core、TNT、DAMN和TMG,皆为水平一流的破解组织。环球盗版软件不少于80%都是由他们的破解的,技术气力连大软件公司都不可小视。
  看到这里,你能否已经灰心了?别怕,虽然现在我们实际上无法完全避免被破解,但如果能够有用地耽搁被破解的时间,并充分打击破解者的自信心,是可以让破解者无法忍耐这种折磨从而最终放弃的。
  破解,通常的做法有两种——暴力破解(爆破)和写注册机。笔者就本身积聚的经验来依次讲解每种破解要领的原理和应对要领,某些关键的例程讲解(Delphi代码),使用C++和VB的朋侪可以本身轻微修正一下。盼望这能对一些老手有些资助,能够更有用地保护本身的休息成果。
  了解暴力破解
  暴力破解简称“爆破”,这是破解手段中最常见的,也是最简略的破解要领。该法最得当于敷衍没有CRC校验的软件,破解老手乐于采用。
  大凡共享软件,验证能否注册大多采用if条件语句来举行果断,纵然你采用了什么RSA或ECC等强力加密算法,也免不了使用if条件语句。这里便是共享软件最为危险的中央,也是爆破手孜孜不倦所寻求的目的。
  例如,你的注册函数类似如下:
  {利用RSA举行注册码的数字署名验证}
  if RSAVerify(MD5(Key),MD5(Code),e,n)then
  ShowMessage('注册乐成!')
  else
  ShowMessage('注册失败!');
  {这里Key是用户输入的注册码,是由你发送给注册用户的,Code是凭据用户输入的用户名自动计算出来的注册码,e是RSA算法的公匙,而n是RSA算法的模数。}
  第一次过招
  上例注册函数纵然使用了强劲的RSA算法举行注册码验证,但依然很容易被破解,我们只需把这里修正为:
  将逻辑果断改为否 
  if not RSAVerify(MD5)Key),MD5(Code),e,n)then
  ShowMessage('注册乐成!')
  else
  ShowMessage('注册失败!');
  这时戏剧性的结果会孕育发生:随便输入任何注册码都可以注册经过,相反输入正确的注册码却无法经过注册。
  要破解如许的软件就必须先反汇编大概跟踪你的程序,找到果断注册码的cmp、test等汇编指令后的关键跳转指令处,通常是je、jz之类的汇编指令,把它们修正为jne或jnz即可,如许常常只必要修正一个字节就可以完善破解了。
  现在大部门共享软件都是用以上要领举行果断,这也是为什么网上被破解的软件漫山遍野的主要缘故原由。由于如许破解着实是太简略了……
  第二次过招
  着实只需把软件的关键代码嵌入到注册码大概注册文件中就可以充分防止破解。
  最简略的要领便是把关键代码(你的软件功能限定部门最关键而且最简略的一个函数)做成一个小DLL(静态链接库),用强力对称算法加密(密匙可以是主程序某一牢固不变的部门或壳的特性Hash值)后天生一个注册文件(License文件,这款式只要你晓得),大概Base64编码后天生一个注册表文件,用户可以双击导入注册表内。
  校验流程如下:已注册用户验证注册码时,先验证有没有文件,没有文件则天然受限定的功能无法使用。如果有注册文件,解密后即天生一个小暂时文件。如果主程序被脱壳大概被修正(爆破),天然Hash值密码不符,解密出来的一定都是渣滓码,没有一点用处。只要没有被修正的主程序才能正确地解码,而且当然只要解密正确的文件才是一个真正的DLL文件,才能被GetProcAddress函数找到欲挪用的关键函数地址。如许只要已注册用户才可以享用到你的软件的全部功能了。云云一来,Cracker破解你的软件就变得很困难了。
  起首,他如果没有注册文件,纵然他把主程序脱壳了,由于受限定的部门和注册文件是联系关系的,他也根本无法修补完备。
  第二,纵然他失掉了你的注册文件,由于是加密文件,他也无法直接利用,如许就欺压他去拆解你的算法,这但是他们最不肯意遇到的事变啊!如果到了这一步,只要真正对加密算法有研讨的Cracker妙手才会连续破解下去。
  第三,你是可以用些小技巧来使他的破解工作越发繁锁。这里我推荐各人使用DSA公开密匙加密算法,它和RSA一样,可以举行数字署名(RSA还可以加密,DSA则只能举行数字署名)。笔者这里选用它的缘故原由便是它有一项十分适用的特性:随机数添补机制。即DSA每次署名都要使用一个随机数K,正由于有这个K的存在,纵然是雷同的用户名和呆板识别码,由DSA加密过的每份注册文件都不会雷同。这对Cracker拆解你的注册文件来说是一个极大的停滞。
  第四,纵然他失掉相识密后的DLL文件,他也必要大幅度地修正主程序大概把你的DLL部门的关键代码拆出来添到主可实行文件中。这就看他对PE文件款式理解得如何了。纵然如许,如果你的程序中有少量的Hash校验和去世机代码,你就耐心等着我们心爱的Cracker同道吐血吧……:)
  最后还要记住:用完这个DLL暂时文件后立刻从内存中卸载此DLL并删失,而且细致在解密之前探测一下,体系中有没有FileMon这个要挟极大的探测器:
  {探测FileMon}
  function DetectFileMon:Boolean;
  begin
  if CreateFile(PChar('\\.\FILEVXD'),
  GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ or FILE_SHARE_WRITE
  nil,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  0 <> INVALID_HANDLE_VALUE then
  Result:= True //如果有,就Down机!
  else
  Result:= False;
  end;
  当然,你可以保护得更好一些:可以不采用暂时DLL,而把解密后的关键代码用WriteProcessMemory这个API函数写入到主可实行文件本身进程被提交(Committed)的内存页面的指定地位去。如许由于磁盘上没有解密后的暂时文件,破解越发困难。事实上,现在世界上最强劲的专业保护软件Amadillo便是用的这种要领。而且这种要领可以充分防止被调试器Dump。但实现起来比力困难,尤其是在WinNT 5以后的操作体系中。
  由于这种要领将注册文件和受限定代码专一联系关系,爆破手拿到你的软件也只要干瞪眼。建议各人都给共享软件加上功能限定,如许比时间和次数限定越发宁静。
 


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

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