注册码原理

****源自:http://zhidao.baidu.com/question/31846674.html
<注册码的原理>
     一般是以计算机硬件(如主板,网卡,硬盘)的唯一序列号作为注册源,通过一定的算法(即注册机)来形成所谓的注册码!一般的程序通过在程序中设置一个全局变量来进行注册码的记录;  
  时间的实现类似于:  
  CString   last   =   "2002/02/20";  
  int   year,month,day,getyear,getmonth,getday;  
  CTime   date   =   CTime::GetCurrentTime();   
  getyear     =   date.GetYear();  
  getmonth   =   date.GetMonth();  
  getday   =   date.GetDay();   
  year   =   atoi(last.Left(4));  
  month   =   atoi(last.Mid(4,2));  
  day     =   atoi(last.Right(2));   
  次数可以在注册表里设置一个键值来判断,若有此键,则说明已经到期!
  一般情况下软件的注册是通过比较来实现的,也就是说软件本身就是注册机,因为他本身就有个真正的注册码,用他来和你所输入的注册码做比较。不过有的是明码比较有的是加密比较,以明码比较来说:我们已经知道了软件自己可能会产生注册码的有的在内存中有的在软件中有的在注册表中,更有甚者是有个通用的万能注册码。 
   输入注册码成功是因为软件中用了跳转,也就是说。当你输入的号码和真正的注册码比较完的时候有个跳转
跳转分为一下几个类型
若相等则跳
若不相等则跳
无条件跳
若小于则跳
若大于则跳
若大于等于则跳
若小于则跳
若小于等于则跳

****源自:http://wenda.tianya.cn/wenda/thread?tid=19828046e94a5592

    大部分注册算法的原理是:软件或者用户自己触发了软件的注册模块-》软件跳转到注册认证模块。-》弹出注册窗口-》用户输入注册名+注册码A,把它们存放在内存中。然后软件的注册码验证部分根据用户输入的注册名生成正确的注册码B并和用户输入的注册码A做对比。如果结果为相同则注册通过,并运行“注册成功”后面的程序分支,比如解除各种软件限制。如果不相同则提示“无效的注册码,请重新输入!”或者“Invalid key!”等等警告。 
    知道了原理,我们只要用SOFTICE和TRW2000等汇编调试软件去做软件的动态反汇编。来找到软件注册部分的入口(这个过程就不细说了,有兴趣去看看汇编调试和软件破解的资料)
   破解:
这时候后如果我们在软件的注册失败的那段代码前面加一个跳转,说得容易理解一点就是:跳过软件注册码验证失败后应该运行的分支,而将它转到注册成功的那个分支上。那么这时候不管你输入的注册码是对是错,都会提示注册成功。直接将它跳到注册通过的那个程序分支上。这是一种破解方式。还有一种就是直接屏蔽注册窗口,这个最简单,在那段窗口代码前面加一个跳转指令。这个适合于那种频繁弹出注册窗口但软件功能并没有限制的注册软件
   注册机:
通过反汇编和调试器跟踪来得到软件的注册码验证部分的汇编代码,然后根据它写出来的逆向算法生成的注册程序。就是注册机了
   内存注册机:
跟简单了,因为经过上面的步骤,你已经知道的那个软件的注册算法。知道它会在做注册认证的时候将用户输入的注册码和正确的注册码做对比。把正确内存里的注册码取出来就OK了。所以内存注册机的使用方法都是:先开注册机,用注册机载入软件。然后你随便输入一个注册码,按确定。软件会提示注册失败,因为你的注册码是错误的。不过这个时候正确的注册码已经被内存注册机截取到了

****源自:http://bbs.hnitr.com/archiver/?tid-61478.html

注册码、使用期限相对于收费而言的,注册码可以达到一台电脑只能安装一次的效果,使用期限可以达到超过期限不能使用的效果。
(1)获取机器硬盘序列号(因设计者而异,根据获取类型、种类等结果而不同)
(2)序列号根据一系列的算法(加密的范畴)得出注册码
(3)注册码根据一系列的算法得出注册号(算法因人而异,千奇百怪)
     也就是说,在软件刚开始安装的时候,其实注册码已经算出来了,就存放在你的电脑中,只不过不知道放在哪而已。由使用者算出注册码,发给开发者,开发者得出注册码回发使用者,使用者输入注册码,与电脑中存储的对比,成功就注册成功,否则就注册失败。
     使用期限也是一个道理,软件只记录安装时候的计算机时间,每启动软件一次,就对比一次时间,当对比本地时间>安装时间的时候也就过期啦,而且不要指望修改系统时间,对比本地时间也可能被记录,一旦时间和对比本地时间有出处,也是会误认为过期滴。
     至于使用次数就是毛毛雨了,每启动一次加1而已,当大于软件里设定的最大次数,就伴随的失效了。使用期限和次数可以有傻瓜破解的办法,就是重做系统,使用。到期限后,在重做系统,重安,在使用,太麻烦,不推荐~@~

****源自:http://www.20cn.net/ns/hk/crack/data/20040307044057.htm
<注册机破解法的原理以及应对方法>

认识注册机破解法
      顾名思义,写注册机来破解软件注册的方法,就是模仿你的注册码生成算法或者逆向注册码验证算法而写出来的和你一模一样的注册机。如果被写出注册机,你的软件只好免费了。或者你必须更换算法,但以前注过册的合法用户都得被迫更换注册码了。

      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不了解BlowfishMD5算法的原理,也不会逆向推测它们,但他们了解你的校验算法的流程和算法名,便可马上从网上找到类似的Blowfish和MD5算法包,从而模拟你的软件仿造出注册机。

    如果你用不常见的,算法如Skipjack(NASA美国航天局标准算法)、LOKI3-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找到漏洞。加密字符串不需要太复杂的算法,随便找一个快速的对称算法就可以了。

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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页