APISpy32 2.5的注册
[软件介绍]
此软件可以显示软件启动过程中所有调用的API以及他们的参数,这对于破解
广告条的软件极为有用。如果不注册,只能记录20个Call。
[下载]
krack.126.com
[破解过程]
这个软件的注册比较特殊,是依靠计算注册码来得到注册名字。
似乎很难使用逆向算法来得到自己想要的注册名。
====================================================================
注册过程描述:
1. 将假注册码16位取前8位和后7位组成一个新的注册码RegNew,末尾加字节00H.
2. 每次依次取RegNew的两个字节,第一个字节放入al, 第二个字节放入cl,
如果第一个字节(al)小于等于39H,则将al+D0H, 如果大于39H,则将al+C9,
如果第二个字节(cl)小于等于39H, 则将cl-30H,如果大于39H, 则将cl-37。
然后al左移4位,al or cl生成新的一个字节,依次和50H-57H作xor,得到的8个
新字节替代假code位置的前8位。
3. 取现在假code位置的前8位开始运算。
设EAX=1
取出假code一个字节,乘以eax,如果比8899H大,则Eax放入eax除以8899H的余数。
继续用假code的同一个字节乘以eax,乘以7次后将此时的eax除以BBH,获得余数。
然后取假code第二个字节,设eax=1,作同样运算。
如此生成的8个余数作为新的字节。
4. 此8个新字节应同注册名字的8位相同。注册名字不够8位的,需要从注册名字起始位
置往后取相应的个数添加到末尾去。
====================汇编编码开始========================================
注册第2步
——————
:004050E5 E8E6010000 call
004052D0 <--------- 追入后如下面详细所述
:004050EA 8ACB
mov cl, bl
:004050EC 83C404
add esp, 00000004
:004050EF 80C150
add cl, 50
:004050F2 83C702
add edi, 00000002
:004050F5 32C1
xor al, cl
:004050F7 FEC3
inc bl
:004050F9 8846FF
mov byte ptr [esi-01], al
:004050FC C60600
mov byte ptr [esi], 00
:004050FF 46
inc esi
:00405100 80FB08
cmp bl, 08
:00405103 72DF
jb 004050E4
* Referenced by a CALL at Address:
|:004050E5
|
:004052D0 8B4C2404
mov ecx, dword ptr [esp+04]
:004052D4 8A01
mov al, byte ptr [ecx] <----- 前一个字节
:004052D6 3C39
cmp al, 39
:004052D8 7E04
jle 004052DE
:004052DA 04C9
add al, C9
:004052DC EB02
jmp 004052E0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004052D8(C)
|
:004052DE 04D0
add al, D0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004052DC(U)
|
:004052E0 8A4901
mov cl, byte ptr [ecx+01] <---- 后一个字节
:004052E3 80F939
cmp cl, 39
:004052E6 7E09
jle 004052F1
:004052E8 C0E004
shl al, 04
:004052EB 80E937
sub cl, 37
:004052EE 0AC1
or al, cl
:004052F0 C3
ret
注册第3步
----------
* Referenced by a CALL at Address:
|:0040510F
..............
..............
:0040531F B801000000 mov eax,
00000001
:00405324 C744241407000000 mov [esp+14], 00000007
<---- 小循环计数
:0040532C 8A1437
mov dl, byte ptr [edi+esi] <---- 第二步生成的字节
:0040532F 8BFA
mov edi, edx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405350(C)
|
:00405331 8BD7
mov edx, edi
:00405333 0FAFC2
imul eax, edx <---- eax乘以edx,
:00405336 3D99880000 cmp eax,
00008899 <---- 和8899H比较
:0040533B 7E0A
jle 00405347 <---- 不大就跳
:0040533D 99
cdq
:0040533E BB99880000 mov ebx,
00008899
:00405343 F7FB
idiv ebx <---- eax/ebx余数在edx
:00405345 8BC2
mov eax, edx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040533B(C)
|
:00405347 8B542414
mov edx, dword ptr [esp+14] <---- 小循环次数->edx
:0040534B 4A
dec edx
<---- 减1次
:0040534C 89542414
mov dword ptr [esp+14], edx <---- 放回到esp+14处存起来
:00405350 75DF
jne 00405331
<---- 不够7次继续小循环
:00405352 99
cdq
:00405353 BFBB000000 mov edi,
000000BB
:00405358 F7FF
idiv edi <----
eax/edi,余数在edx
:0040535A 41
inc ecx
:0040535B 83F908
cmp ecx, 00000008 <----------大循环计数
:0040535E 8816
mov byte ptr [esi], dl <---- 余数的dl
:00405360 C6042900
mov byte ptr [ecx+ebp], 00
:00405364 7CB0
jl 00405316 <----
够8次吗?
:00405366 5F
pop edi
:00405367 5E
pop esi
:00405368 5D
pop ebp
:00405369 5B
pop ebx
:0040536A C3
ret
注册第4步
----------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004051B9(C)
|
:00405195 8A01
mov al, byte ptr [ecx] <----- 第三步生成的字节,ecx内已经是注册码了。
:00405197 3C20
cmp al, 20
:00405199 730E
jnb 004051A9
:0040519B 33D2
xor edx, edx
:0040519D 25FF000000 and eax,
000000FF
:004051A2 8A510A
mov dl, byte ptr [ecx+0A]
:004051A5 0BD0
or edx, eax <------- al比20H小,则or, 只有
0 or 0似乎才能使得最后的ebp为0
:004051A7 EB0C
jmp 004051B5
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405199(C)
|
:004051A9 33D2
xor edx, edx
:004051AB 25FF000000 and eax,
000000FF
:004051B0 8A510A
mov dl, byte ptr [ecx+0A]
:004051B3 33D0
xor edx, eax <------- al比20h大,则xor,只要edx=eax即可。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004051A7(U)
|
:004051B5 03EA
add ebp, edx <------- 所得结果都加到ebp中去。
:004051B7 41
inc ecx
:004051B8 4E
dec esi
:004051B9 75DA
jne 00405195
:004051BB 33C0
xor eax, eax
:004051BD 5F
pop edi
:004051BE 85ED
test ebp, ebp
:004051C0 5E
pop esi
:004051C1 5D
pop ebp
:004051C2 0F94C0
sete al <------- 如果ebp为零则Flag Z=1, al=1,注册成功。
:004051C5 5B
pop ebx
:004051C6 59
pop ecx
:004051C7 C3
ret
==============================汇编编码完====================================
不知道能否写出逆算法,似乎不能吧。于是只好写了个小程序,生成一个表,列出在特定位置上什么样的一个
byte可以对应算出一个可见AscII字符。注册码的第9位可以任意字符。最后一位注册码算出的可见ascii字符似乎
只能为'(',不知道有没有弄错?
这是其中的一个注册码:
RegName: TTTTTTT(
RegCode: 35343736g313033A
- 标 题:APISpy32 2.5的注册 (7千字)
- 作 者:henryw
- 时 间:2001-4-1 12:15:43
- 链 接:http://bbs.pediy.com