这个注册机编写器以前一直是我自己为写注册机而编写的,通过它只要略有汇编基础很快就能写出一个注册机。而不需要再过多的了解程序的指令算法。 整个程序体实际上只是我用汇编写的一个模板。所以大家也可以在其中自定义自己的界面和提示信息。 可以用VC++或BC++等资源编辑工具自行修改key1.res资源文件,但请不要修改它们对应的ID号。
在目录目录 EXAMPLE 下有一个例子程序,主要用来举例说明这个程序的使用(我先假设自己并不太懂Win32汇编)。
通过动态调试或反汇编例子程序可以得到以下注册码的计算过程:
xxxx:00401077 CALL GetCommandLineA
xxxx:0040107C CMP BYTE PTR [EAX],22
xxxx:0040107F JNZ 401082
xxxx:00401081 INC EAX
xxxx:00401082 MOV CX,WORD PTR [EAX]
xxxx:00401085 MOV WORD PTR [0040306C],CX
xxxx:0040108C MOV WORD PTR [0040306E],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 [00403058]
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 | ; 对应于上面的40306C |
| a3 db "%1X",0 | ; 对应于上面的40303E指向的字符串 |
a4 db 20 dup (0) | ; 这是20个字节的内存空间,用来存放输出的注册码,对应于上面的40305C |
这是写好的程序代码:
| CALL GetCommandLineA CMP BYTE PTR [EAX],22h | ; 后面加h表示是十六进制 |
| JNZ n1 | |
| INC EAX | |
| n1: | |
| MOV CX,WORD PTR [EAX] | |
| MOV WORD PTR a2,CX | |
| MOV WORD PTR a2+2,5Ch | |
| PUSH 0 | |
| PUSH 0 | |
| PUSH 0 | |
| PUSH 0 | |
| LEA EAX,a1 | ; 令EAX指向a1 |
| PUSH EAX | |
| PUSH 0 | |
| PUSH 0 | |
| LEA EAX,a2 | |
| PUSH EAX | ; 令EAX指向a2 |
| CALL 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寄存器所指向的内存地址的数据。 |
输入如:
可以看到这与上面的反汇编代码基本相同。点击编译就可以很容易的得到一个注册机了。
生成的注册机如下图所示(这只是我写的外观,你也可以自行修改):
需要说明的是因为这只是我写的一个模板,所以我也在程序中使用了几个变量。
请不要再重复声明:hCursorHandle、hInstance、hIcon、hTempEbp、hInput、hMode以免出错。
还有就是你一定要在指令结束时令EAX指向正确的注册码地址。
