wallier 发表于 2009-12-5 22:11

注册机和补丁制作

第一节 概念介绍 何为注册机?注册机就是针对某一软件,通过一定算法算出注册码的程序。我们写注册机时,一般都要了解注册码的算法(这当然是通过跟踪调试了解的),之后用汇编语言或其它高级语言来把算法还原。这样大家可根据自己的要求输入注册码,如根据自己的姓名,公司的名称注册。
  目前共享软件有两种注册方式:
  一 种是交费后,作者给寄有全部功能的 Register软件,原来的Shareware根本没有某些功能;   第二种交费后, 作者给你个注册码(Register Number),注册后功能就无限制了 。 共享软件注册前后基本相同 , 只是功能受限制 ,或者使用时间受限制 ,或者经常出现要求注册的画面 , 等等 。
  我们平时所接触的共享软件是第二种,通过算出注册码或打补丁使该软件有注册后的功能。
  软件的破解也分两种:
  一是、补丁( patches ), 这些小程序的功能是用来改变某种软件内某些特定的部位, 因此它们的作用通常只限于某一个软件的版本。请勿使用针对不同版本所设计的 patch,必须注意所使用软件版本的版本号与 patch 是否相同 。倘若使用不当,将导至错误信息,会破坏程序,严重时也有可能死机!
  二是、序列号 (serial number) 和注册码 (key generator) 就显的安全多了。有时候旧版的序号亦适用于新出的版本,就算不能用也毫无伤害。只有在极少数的情况下软件作者会设下某些陷阱,当使用者输入黑名单上的序号后 , 软件会自动销毁而无法使用。
  通过补丁和注册机可以大大方便用户的注册,就是目前有不少的程序,它的注册码都与硬件有关,就是在每一台机上安装都有一个机器码,要把这个机器码E-MAIL给作者, 作者把收到的机器码用注册程序算出注册码后再寄回给用户,这样做使得软件的防复制方面加强了,但造成了不少用户的麻烦,因为只要用户一重装系统或升级主板 ,就要重新去注册了。对于这种程序,一般初学者只能在内存中找到自己机器的注册码,但这种注册码到了其它的机器上又不能用了。所以要求大家能自己写出注册机来。
  而有的软件注册码计算很复杂,或只是试用版,到期就停止使用,根本无法输入注册码。对这类软件只能通过改动原程序代码指令,但如何让大家很方便地解除限制,当然你可把改动的字节告诉大家,用二进制编辑工具修改,但很不方便。所以大家有必要自己制作补丁程序,只要用户运行该补丁程序,让它帮你改动指定的代码,就可解除原软件限制,是不是很方便。


1、文件补丁制作今天我们接触补丁制作工具是CodeFusion,界面制作也不错,它有以下功能:
1、可以自动比较补丁前后的差别
2、可以对字节逐个补丁,也可以使用普通和模板两种查找、替换;
3、补丁前后的文件尺寸可以不同;
4、可以对单个文件补丁,也可以处理多个不同盘、不同目录、甚至名字并不匹配的多个文件;
5、界面文字和链接等完全定制;
6、可以使用内置和外部的压缩器;也可以不压缩自行修改窗体;

为了使初学者能更快掌握这一工具使用,我就把一补丁最常用的制作过作写下来。
  首先建立一个临时目录C:\TEMP(只是为了下面讲述的方便罢了).并在其下建立两个子目录,分别为C:\TEMP\1\以及 C:\TEMP\2\. 以网络吸血鬼NET VAMPIRE 3.2为例: 将没有CRACK的主程序VAMPIRE.EXE拷到C:\TEMP\1\目录下. 将已经CRACK的主程序VAMPIRE.EXE拷到C:\TEMP\2\目录下.
(图一)是用CodeFusion制成的补丁程序运行的界面。
http://www.pediy.com/tutorial/chap9/Image/code00.gif
(图一)界面还是不错的,只要你用用CodeFusion,你就发现它很容易上手。第一步、运行CodeFusion,界面如图二:http://www.pediy.com/tutorial/chap9/Image/code01.gif
(图二)图一和图二中的数字1、2、3、4、5是彼此对应的,要得到(图一)结果只需在(图二)中键入你自己的说明即可。你自己定制好界面可以存盘,存盘名是*.cfp,以后你只要打开该文件,就可出现所要的界面。很简单,自己摸索一下就能掌握。第二步、定制好界面后,可以按预览按钮(就是上面的眼睛图标)看看界面自己是否满意,满意后按下一步。http://www.pediy.com/tutorial/chap9/Image/code02.gif(图三)在图三中,按(1)处的绿色的十字,以添加原文件(在这里是吸血鬼的原主文件),按1后出现左边的一窗口,按2选择吸血鬼的原主文,选好按Ok即可。第三步、这一步按图四的1处的绿色十字,出现如下结果:http://www.pediy.com/tutorial/chap9/Image/code03.gif(图四)按上图中的2处是文件比较。第3处是Byte-path offset,在原文件中指定的地址处打字节补丁。第4处是Find &Replace,在原文件查找替换字节。第五处是Truncate offset,从指定地址处切断原文件。3,4,5的用处我在这里就不写了,大家可自己试试。第四步、用鼠标按图四中的2处(File Compare)出现图五,选择己被crack的文件,进行比较,在这里是C:\TEMP\2\目录下, 已经CRACK的主程序VAMPIRE.EXE。http://www.pediy.com/tutorial/chap9/Image/code04.gif(图五)在1 处选择C:\TEMP\2\目录下, 已经CRACK的主程序VAMPIRE.EXE。下一步按第2处的compare,进行两文件的比较,比较结束后按Ok,再按下一步。第五步,这是最后一步,出现图六。http://www.pediy.com/tutorial/chap9/Image/code05.gif(图六)在这界面上的各项选项就以默认值为主,它们都是些压缩选项,压缩补丁以保护你的版权。最后一步按1处(Make win32 Executable),选择路径、文件名,生成你的补丁。好了你可以把这补丁散发给大家,真可谓,辛苦你一人,方便千万人啊!该软件的其它功能,大家自己再摸索一下,是不是很直观好用。

wallier 发表于 2009-12-5 22:13

好长啊大家慢慢看吧!

wallier 发表于 2009-12-5 22:13

本帖最后由 wallier 于 2009-12-5 22:17 编辑

对了,还有注册机制做如下

wallier 发表于 2009-12-5 22:14

本帖最后由 wallier 于 2009-12-5 22:16 编辑

注册机制作工具

这个注册机编写器以前一直是我自己为写注册机而编写的,通过它只要略有汇编基础很快就能写出一个注册机。而不需要再过多的了解程序的指令算法。 整个程序体实际上只是我用汇编写的一个模板。所以大家也可以在其中自定义自己的界面和提示信息。可以用VC++或BC++等资源编辑工具自行修改key1.res资源文件,但请不要修改它们对应的ID号。   点击此下载例子程序,主要用来举例说明这个程序的使用(我先假设自己并不太懂Win32汇编)。
   通过动态调试或反汇编例子程序可以得到以下注册码的计算过程:
xxxx:00401077 CALL GetCommandLineA
xxxx:0040107C CMP BYTE PTR ,22
xxxx:0040107F JNZ 401082
xxxx:00401081 INC EAX
xxxx:00401082 MOV CX,WORD PTR
xxxx:00401085 MOV WORD PTR ,CX
xxxx:0040108C MOV WORD PTR ,5C
xxxx:00401095 PUSH 0
xxxx:00401097 PUSH 0
xxxx:00401099 PUSH 0
xxxx:0040109B PUSH 0
xxxx:0040109D PUSH DWORD 00403058
xxxx:004010A2 PUSH 0
xxxx:004010A4 PUSH 0
xxxx:004010A6 PUSH DWORD 0040306C
xxxx:004010AB CALL GetVolumeInformationA
…………    …………
…………    …………
xxxx:0040111E MOV EAX,1
xxxx:00401123 CPUID
xxxx:00401125 MOV ECX,DWORD PTR
xxxx:0040112B XOR EDX,EDX
xxxx:0040112D MUL ECX
xxxx:0040112F ADD EAX,EDX
xxxx:00401131 PUSH EAX
xxxx:00401132 PUSH DWORD 0040303E    ; 在这里下D 40303E可以看到数据窗口中显示为“%1X”
xxxx:00401137 PUSH DWORD 0040305C
xxxx:0040113C CALL wsprintfA
  对于以上的指令并不需要过多的了解它在干什么,只要将其中的每个地址改成一个变量地址的声明,然后再原封不动的抄到注册机编写器的代码窗口中即可。
  这是写好的声明:
a1 dd 0; 这是一个双字的内存空间,对应于上面的403058。
;(因为40109D处的指令是DWORD 403058,所以用dd,如果是WORD就用dw,如果是BYTE就用db)a2 dd 0; 对应于上面的40306Ca3 db "%1X",0; 对应于上面的40303E指向的字符串a4 db 20 dup (0)
; 这是20个字节的内存空间,用来存放输出的注册码,对应于上面的40305C  输入如图所示:http://www.pediy.com/tutorial/chap9/Image/5.GIF

这是写好的程序代码:CALL GetCommandLineA CMP BYTE PTR ,22h; 后面加h表示是十六进制JNZ n1 INC EAX n1: MOV CX,WORD PTR MOV WORD PTR a2,CX MOV WORD PTR a2+2,5Ch PUSH 0 PUSH 0 PUSH 0 PUSH 0 LEA EAX,a1; 令EAX指向a1PUSH EAX PUSH 0 PUSH 0 LEA EAX,a2 PUSH EAX; 令EAX指向a2CALL GetVolumeInformationA; 当然这几条语句也可以直接写成
invoke GetVolumeInformationA,addr a2,0,0,addr a1,0,0,0,0
的形式MOV EAX,1 CPUID MOV ECX,a1 XOR EDX,EDX MUL ECX ADD EAX,EDX PUSH EAX LEA EAX,a3; 令EAX指向a3,也就是指向字符“%1X”。PUSH EAX LEA EAX,a4 PUSH EAX CALL wsprintfA LEA EAX,a4
; 令EAX指向a4。因为程序最后显示的就是EAX寄存器所指向的内存地址的数据。  输入如下图所示:
http://www.pediy.com/tutorial/chap9/Image/6.JPG   可以看到这与上面的反汇编代码基本相同。点击编译就可以很容易的得到一个注册机了。
  生成的注册机如下图所示(这只是我写的外观,你也可以自行修改):
http://www.pediy.com/tutorial/chap9/Image/4.GIF  需要说明的是因为这只是我写的一个模板,所以我也在程序中使用了几个变量。
  请不要再重复声明:hCursorHandle、hInstance、hIcon、hTempEbp、hInput、hMode以免出错。
  还有就是你一定要在指令结束时令EAX指向正确的注册码地址。
  这种算注册码的方法不是直接从用户所输入的序列号来计算注册码的,所以并不适用于所有情况。有时我们可能需要根据用户所填入的序列号来计算注册码。考虑到这种情况所以我在程序初使时令EAX指向第一个编辑框(也就是输入序列号的窗口)收到用户输入的数据,令EBX指向第二个编辑框收到用户输入的数据,令ECX指向第三个编辑框收到用户输入的数据。你如果要对用户输入的序列号或用户名等信息进行操作,那么可以就对EAX、EBX、ECX进行操作。
  下面的代码是本例根据用户所填入的序列号来计算注册码的方法:
MOV ECX,EAX; EAX指向用户输入的八位序列号,现在暂将它移动到ECX寄存器XOR EBX,EBX; 以下是一段典型的将内存中的ASCII码转换为十六进制代码。n1: MOVZX EAX,BYTE PTR OR AL,AL JZ n3 CMP AL,3Ah JC n2 SUB AL,7 n2: SUB AL,30h SHL EBX,4 ADD EBX,EAX INC ECX JMP n1 n3:; 我想以上的一段代码应该懂汇编就能写的出(如果不是很明白,那么你对我编写好的注册机用TRW调试一次就知道了)。PUSH EBX; 最后的十六进制结果都保存在寄存器EBX中
; 将EBX入栈,这是为了将EBX寄存器的数据保存起来。因为经过CPUID这个指令后EBX的值将被修改。然后后面就和上面一样照抄程序中的指令。以下计算注册码的方法很简短。但在实际的破解过程中,程序的算法可能会相当复杂。这就需要你通过调试或反汇编将关键的运算指令都找出来,再写进来。MOV EAX,1 CPUID POP ECX; 恢复EBX的值到ECX寄存器XOR EDX,EDX MUL ECX ADD EAX,EDX PUSH EAX LEA EAX,a3; 令EAX指向a3,也就是指向字符“%1X”。PUSH EAX LEA EAX,a4 PUSH EAX CALL wsprintfA LEA EAX,a4
; 令EAX指向a4。因为程序最后显示的就是EAX寄存器所指向的内存地址的数据。下图分别是采用方案二和方案三编译后的窗口界面:
                                                                                 http://www.pediy.com/tutorial/chap9/Image/8.GIF  http://www.pediy.com/tutorial/chap9/Image/7.GIF
  如果你不采用这种方法编写那么也可以使用程序中的另一个功能“另类注册机”。它和CrackCode2000一样,也是通过拦截程序指令并显示出注册码。 我之所以再写一个是因为以前的CrackCode2000提供的拦截选项非常有限,而且也不对Wide格式(出现在VB程序中用00将ASCII码分隔开)提供支持,还有一个毛病是在有些程序中会出现莫名的非法操作或无法获得注册码的情况(就好比这个例子程序)。 另外它的界面也太简陋了,只是一个消息框。所以我用汇编写了这个另类注册机非常小巧,它最多可以设置100个断点(其实可以更多,但好象没这个必要),以及在每个断点处中断多少次,如下图所示:
http://www.pediy.com/tutorial/chap9/Image/1.gif  对于以上界面的说明:程序名称和中断地址的设置,这个我想用不着多说,会破解的人都懂。 而获取注册码的方式上需要说明一下,我是这样考虑的:寄存器方式-因为注册码可能是会放在寄存器中比较,并且可能经过十进制或十六进制的转换, 所以就提供了一个寄存器方式及十进制或十六进制的选项。 内存方式-是指:如设置为EDX,即指注册码保存在EDX所指向的内存地址中(而不是寄存器里)这样就为获取注册码提供了更多的选择。   可以自定义在弹出的对话框中将显示的主页、邮件和窗口标题,如下图所示:
http://www.pediy.com/tutorial/chap9/Image/2.GIF  生成的注册机有二个可选界面如下图所示:http://www.pediy.com/tutorial/chap9/Image/3.GIF  http://www.pediy.com/tutorial/chap9/Image/9.GIF  需要说明的一点是这个对话框只在拦截成功的时候出现。  除此之外还有一个制作破解补丁的附加工具,制作界面如图所示。http://www.pediy.com/tutorial/chap9/Image/10.GIF  这是完成界面。http://www.pediy.com/tutorial/chap9/Image/11.GIF

空白的影子 发表于 2009-12-6 00:08

不错,支持~~~~~~~~

淡泊 发表于 2009-12-6 02:02

学习:)eee:handshake

wa126 发表于 2009-12-6 09:20

很详细,很强大,建议加精

gxliujian 发表于 2009-12-8 14:11

应该是好东西

石头学破解 发表于 2009-12-8 14:29

很不错啊,学习了。

吃肉也不胖 发表于 2009-12-13 00:08

记号,好好学习一下。谢谢楼主。
页: [1] 2
查看完整版本: 注册机和补丁制作