Keymake使用

上网导航 2023-12-08 64 0条评论
摘要: a1 dd 0; 这是一个双字的内存空间,对应于上面的403058。;(因为40109D处的指令是DWORD 403058,所以用dd,如果是WORD就用dw...

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 CMPBYTE PTR [EAX],22h

; 后面加h表示是十六进制

JNZn1

INCEAX

n1:

MOVCX,WORD PTR [EAX]

MOVWORD PTR a2,CX

MOVWORD PTR a2+2,5Ch

PUSH 0

PUSH 0

PUSH 0

PUSH 0

LEAEAX,a1

; 令EAX指向a1

PUSH EAX

PUSH 0

PUSH 0

LEAEAX,a2

PUSH EAX

; 令EAX指向a2

CALL GetVolumeInformationA

; 当然这几条语句也可以直接写成

invoke GetVolumeInformationA,addr a2,0,0,addr a1,0,0,0,0

的形式

MOVEAX,1

CPUID

MOVECX,a1

XOREDX,EDX

MULECX

ADDEAX,EDX

PUSH EAX

LEAEAX,a3

; 令EAX指向a3,也就是指向字符“%1X”。

PUSH EAX

LEAEAX,a4

PUSH EAX

CALL wsprintfA

LEA EAX,a4

; 令EAX指向a4。因为程序最后显示的就是EAX寄存器所指向的内存地址的数据。

输入如下图所示:

可以看到这与上面的反汇编代码基本相同。点击编译就可以很容易的得到一个注册机了。

生成的注册机如下图所示(这只是我写的外观,你也可以自行修改):

需要说明的是因为这只是我写的一个模板,所以我也在程序中使用了几个变量。

请不要再重复声明: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 [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

; 最后的十六进制结果都保存在寄存器EBX中

; 将EBX入栈,这是为了将EBX寄存器的数据保存起来。因为经过CPUID这个指令后EBX的值将被修改。然后后面就和上面一样照抄程序中的指令。以下计算注册码的方法很简短。但在实际的破解过程中,程序的算法可能会相当复杂。这就需要你通过调试或反汇编将关键的运算指令都找出来,再写进来。

MOVEAX,1

CPUID

POP ECX

; 恢复EBX的值到ECX寄存器

XOREDX,EDX

MULECX

ADDEAX,EDX

PUSH EAX

LEAEAX,a3

; 令EAX指向a3,也就是指向字符“%1X”。

PUSH EAX

LEAEAX,a4

PUSH EAX

CALL wsprintfA

LEA EAX,a4

; 令EAX指向a4。因为程序最后显示的就是EAX寄存器所指向的内存地址的数据。

下图分别是采用方案二和方案三编译后的窗口界面:

如果你不采用这种方法编写那么也可以使用程序中的另一个功能“另类注册机”。它和CrackCode2000一样,也是通过拦截程序指令并显示出注册码。 我之所以再写一个是因为以前的CrackCode2000提供的拦截选项非常有限,而且也不对Wide格式(出现在VB程序中用00将ASCII码分隔开)提供支持,还有一个毛病是在有些程序中会出现莫名的非法操作或无法获得注册码的情况(就好比这个例子程序)。 另外它的界面也太简陋了,只是一个消息框。所以我用汇编写了这个另类注册机非常小巧,它最多可以设置100个断点(其实可以更多,但好象没这个必要),以及在每个断点处中断多少次,如下图所示:

对于以上界面的说明:程序名称和中断地址的设置,这个我想用不着多说,会破解的人都懂。 而获取注册码的方式上需要说明一下,我是这样考虑的:寄存器方式-因为注册码可能是会放在寄存器中比较,并且可能经过十进制或十六进制的转换, 所以就提供了一个寄存器方式及十进制或十六进制的选项。 内存方式-是指:如设置为EDX,即指注册码保存在EDX所指向的内存地址中(而不是寄存器里)这样就为获取注册码提供了更多的选择。

可以自定义在弹出的对话框中将显示的主页、邮件和窗口标题,如下图所示:

生成的注册机有二个可选界面如下图所示:

需要说明的一点是这个对话框只在拦截成功的时候出现。

除此之外还有一个制作破解补丁的附加工具,制作界面如图所示。

这是完成界面。

文章版权及转载声明:

作者:上网导航本文地址:https://www.90xe.com/post/6928.html发布于 2023-12-08
文章转载或复制请以超链接形式并注明出处技术导航

分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏