⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap9-3-2.htm.primary

📁 加密与解密,软件加密保护技术与解决方案,看雪文档!
💻 PRIMARY
📖 第 1 页 / 共 2 页
字号:
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">PUSH EAX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">LEA EAX,a3</td>
      <td width="341" height="14" valign="bottom" align="left">; 令EAX指向a3,也就是指向字符“%1X”。</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">PUSH EAX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">LEA EAX,a4</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">PUSH EAX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">CALL wsprintfA</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left"> 
        <p>LEA EAX,a4</p>
      </td>
      <td width="341" height="14" valign="bottom" align="left">; 令EAX指向a4。因为程序最后显示的就是EAX寄存器所指向的内存地址的数据。</td>
    </tr>
  </table>
  <p>  输入如下图所示:</p>
  <p align="center"><img src="Image/6.JPG" width="520" height="400" align="middle"> 
  </p>
  <p>  可以看到这与上面的反汇编代码基本相同。点击编译就可以很容易的得到一个注册机了。</p>
  <p>  生成的注册机如下图所示(这只是我写的外观,你也可以自行修改):</p>
  <p align="center"><img src="Image/4.GIF" width="279" height="238" align="middle"></p>
  <p>  需要说明的是因为这只是我写的一个模板,所以我也在程序中使用了几个变量。<br>
      请不要再重复声明:hCursorHandle、hInstance、hIcon、hTempEbp、hInput、hMode以免出错。<br>
      还有就是你一定要在指令结束时令EAX指向正确的注册码地址。</p>
  <p>  这种算注册码的方法不是直接从用户所输入的序列号来计算注册码的,所以并不适用于所有情况。有时我们可能需要根据用户所填入的序列号来计算注册码。考虑到这种情况所以我在程序初使时令EAX指向第一个编辑框(也就是输入序列号的窗口)收到用户输入的数据,令EBX指向第二个编辑框收到用户输入的数据,令ECX指向第三个编辑框收到用户输入的数据。你如果要对用户输入的序列号或用户名等信息进行操作,那么可以就对EAX、EBX、ECX进行操作。</p>
  <p>  下面的代码是本例根据用户所填入的序列号来计算注册码的方法:</p>
  <table width="87%" border="0" cellspacing="0" cellpadding="0" height="38" align="center">
    <tr> 
      <td width="270" align="left" valign="top">MOV ECX,EAX</td>
      <td width="341" valign="bottom" align="left">; EAX指向用户输入的八位序列号,现在暂将它移动到ECX寄存器</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">XOR EBX,EBX</td>
      <td width="341" valign="bottom" align="left">; 以下是一段典型的将内存中的ASCII码转换为十六进制代码。</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">n1:</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">MOVZX EAX,BYTE PTR [ECX]</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">OR AL,AL</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">JZ n3</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">CMP AL,3Ah</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">JC n2</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">SUB AL,7</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">n2:</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">SUB AL,30h</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">SHL EBX,4</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">ADD EBX,EAX</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">INC ECX</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">JMP n1</td>
      <td width="341" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" align="left" valign="top">n3:</td>
      <td width="341" valign="bottom" align="left">; 我想以上的一段代码应该懂汇编就能写的出(如果不是很明白,那么你对我编写好的注册机用TRW调试一次就知道了)。</td>
    </tr>
    <td width="270" align="left" valign="top">PUSH EBX</td>
    <td width="341" valign="bottom" align="left">; 最后的十六进制结果都保存在寄存器EBX中<br>
      ; 将EBX入栈,这是为了将EBX寄存器的数据保存起来。因为经过CPUID这个指令后EBX的值将被修改。然后后面就和上面一样照抄程序中的指令。以下计算注册码的方法很简短。但在实际的破解过程中,程序的算法可能会相当复杂。这就需要你通过调试或反汇编将关键的运算指令都找出来,再写进来。</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">MOV EAX,1</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">CPUID</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">POP ECX</td>
      <td width="341" height="14" valign="bottom" align="left">; 恢复EBX的值到ECX寄存器</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">XOR EDX,EDX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">MUL ECX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">ADD EAX,EDX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">PUSH EAX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">LEA EAX,a3</td>
      <td width="341" height="14" valign="bottom" align="left">; 令EAX指向a3,也就是指向字符“%1X”。</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">PUSH EAX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">LEA EAX,a4</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">PUSH EAX</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left">CALL wsprintfA</td>
      <td width="341" height="14" valign="bottom" align="left">&nbsp;</td>
    </tr>
    <tr> 
      <td width="270" height="14" valign="top" align="left"> 
        <p>LEA EAX,a4</p>
      </td>
      <td width="341" height="14" valign="bottom" align="left">; 令EAX指向a4。因为程序最后显示的就是EAX寄存器所指向的内存地址的数据。</td>
    </tr>
  </table>
  <p>下图分别是采用方案二和方案三编译后的窗口界面:</p>
  <p><img src="Image/8.GIF" width="279" height="267">  <img src="Image/7.GIF" width="279" height="274"></p>
  <p>  如果你不采用这种方法编写那么也可以使用程序中的另一个功能“另类注册机”。它和CrackCode2000一样,也是通过拦截程序指令并显示出注册码。 
    我之所以再写一个是因为以前的CrackCode2000提供的拦截选项非常有限,而且也不对Wide格式(出现在VB程序中用00将ASCII码分隔开)提供支持,还有一个毛病是在有些程序中会出现莫名的非法操作或无法获得注册码的情况(就好比这个例子程序)。 
    另外它的界面也太简陋了,只是一个消息框。所以我用汇编写了这个另类注册机非常小巧,它最多可以设置100个断点(其实可以更多,但好象没这个必要),以及在每个断点处中断多少次,如下图所示:</p>
  <p align="center"><img src="Image/1.gif" width="405" height="343"></p>
  <p>  对于以上界面的说明:程序名称和中断地址的设置,这个我想用不着多说,会破解的人都懂。 而获取注册码的方式上需要说明一下,我是这样考虑的:寄存器方式-因为注册码可能是会放在寄存器中比较,并且可能经过十进制或十六进制的转换, 
    所以就提供了一个寄存器方式及十进制或十六进制的选项。 内存方式-是指:如设置为EDX,即指注册码保存在EDX所指向的内存地址中(而不是寄存器里)这样就为获取注册码提供了更多的选择。 
  <p>  可以自定义在弹出的对话框中将显示的主页、邮件和窗口标题,如下图所示:</p>
  <p align="center"><img src="Image/2.GIF" width="404" height="342"></p>
  <p align="left">  生成的注册机有二个可选界面如下图所示:</p>
  <p align="center"><img src="Image/3.GIF" width="255" height="172">  <img src="Image/9.GIF" width="294" height="188"></p>
  <p align="left">  需要说明的一点是这个对话框只在拦截成功的时候出现。</p>
  <p align="left">  除此之外还有一个制作破解补丁的附加工具,制作界面如图所示。</p>
  <p align="center"><img src="Image/10.GIF" width="389" height="404"></p>
  <p align="left">  这是完成界面。</p>
  <p align="center"><img src="Image/11.GIF" width="340" height="314"></p>
</blockquote>
<div align="right"></div>
<p align="center"><a href="../Catalog.htm"><img src="../image/navtoc.gif" width="84" height="23" border="0"></a><a href="Chap9-3-1.htm"><img src="../image/Navprev.gif" width="80" height="23" border="0"></a><a href="../APPEN-A/append-A.htm"><img src="../image/navnext.gif" width="83" height="23" border="0"></a></p>
<hr width=735>
<div align="center"><span class="p9"><font size="2"><span class="p9"><font size="2"><span class="p9">Copyright 
  &copy; 2000-2001 <a href="http://www.pediy.com/">KanXue Studio</a> All Rights 
  Reserved.</span></font></span></font></span></div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -