在目录目录 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 wsprfA
对于以上指令并不需要过多了解它在干什么只要将其中每个地址改成个变量地址声明然后再原封不动抄到注册机编写器代码窗口中即可这是写好声明:
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表示是十 6进制
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 wsprfA
LEA EAX,a4
; 令EAX指向a4最后显示就是EAX寄存器所指向内存地址数据
输入如:
可以看到这和上面反汇编代码基本相同点击编译就可以很容易得到个注册机了
生成注册机如下图所示(这只是我写外观你也可以自行修改):
需要介绍说明是这只是我写个模板所以我也在中使用了几个变量
请不要再重复声明:hCursorHandle、hInstance、hIcon、hTempEbp、hInput、hMode以免出错
还有就是你定要在指令结束时令EAX指向正确注册码地址
这种算注册码思路方法不是直接从用户所输入序列号来计算注册码所以并不适用于所有情况有时我们可能需要根据用户所填入序列号来计算注册码考虑到这种情况所以我在初使时令EAX指向第个编辑框(也就是输入序列号窗口)收到用户输入数据令EBX指向第 2个编辑框收到用户输入数据令ECX指向第 3个编辑框收到用户输入数据你如果要对用户输入序列号或用户名等信息进行操作那么可以就对EAX、EBX、ECX进行操作
下面代码是本例根据用户所填入序列号来计算注册码思路方法:
MOV ECX,EAX ; EAX指向用户输入 8位序列号现在暂将它移动到ECX寄存器
XOR EBX,EBX ; 以下是段典型将内存中ASCII码转换为十 6进制代码
n1:
MOVZX EAX,BYTE PTR [ECX]
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 ; 最后十 6进制结果都保存在寄存器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 wsprfA
LEA EAX,a4
; 令EAX指向a4最后显示就是EAX寄存器所指向内存地址数据
分别是采用方案 2和方案 3编译后窗口界面:
如果你不采用这种思路方法编写那么也可以使用中另个功能“另类注册机”它和CrackCode2000样也是通过拦截指令并显示出注册码 我的所以再写个是以前CrackCode2000提供拦截选项非常有限而且也不对宽串(般出现在VB中用00将ASCII码分隔开)提供支持还有个毛病是在有些中会出现莫名非法操作或无法获得注册码情况(就好比这个例子) 另外它界面也太简陋了只是个消息框所以我用汇编写了这个另类注册机非常小巧它最多可以设置99个断点(其实可以更多但好象没这个必要)以及在每个断点处中断多少次如下图所示:
对于以上界面介绍说明:
⑴、名称和中断地址设置这个我想用不着多说会调试人都懂中断次数即指在该位置连续中断多少次第字节就是将当前设置中断位置处反汇编后第个字节(可通过在调试窗口中输入code on看到)指令长度就是当前中断位置反汇编后长度
⑵、获取注册码方式上需要介绍说明下我是这样考虑:寄存器方式-注册码可能是会放在寄存器中比较并且可能经过十进制或十 6进制转换所以就提供了个寄存器方式及十进制或十 6进制选项
⑶、内存方式-是指:如设置为EDX即指注册码保存在EDX所指向内存地址中(而不是寄存器里)
⑷、偏移地址-这就是说:比如注册码是在eax+64位置那么现在就可以在偏移地址处填入64(如果是eax-64就填入-64)
⑸、地址指针-但是如果eax+64处值是123456而123456里值又是654321654321所指向地址才是注册码所在呢有位网友向我提出了这个问题所以加入了个“地址指针”(不知这种情况该如何形容只好用这个词了)现在你就可以根据自己需要进行设置了比如说如果你要从654321里取注册码就不要选择地址指针;如果你要从123456里取注册码就选择地址指针并将其值设置为1;如果你要从eax+64里取注册码就选择地址指针并将其值设置为2有了这个功能以后就可以尽量避免使用直接内存地址Win2000/XP对内存分配和Win98区别直接指定内存地址很容易出错
⑹、经过加壳-现在许多都用aspack、upx等工具进行了压缩这个功能就是针对这类
⑺、修改内存主要是对于些需要经过修改内存中数据后才会出现注册窗口或才能正常注册
⑻、如果生成注册机出现你可以在制作前点击全部重置将所有数据置零
⑼、配置方案是让你可以对每次设置进行保存免得日后不记得了又得到处找资料
⑽、在左边窗口处也设置保存注册码信息是可能对注册码分次进行比较
可以自定义在弹出对话框中将显示主页、邮件、窗口标题和启动提示还可以自定义图标如下图所示:
生成注册机有 3个可选界面
需要介绍说明点是这个对话框只在拦截成功时候出现
除此的外还有个制作破解补丁附加工具制作界面如图所示
这是完成界面
最后个功能就是内存补丁用于对某些有自校验功能或经过压缩后很难脱壳
最新评论