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
标 题:可逆,对应的注册码还不止一个!我用CHINA作用户名就得到三四个,如:0Je60Y4b0cQ0Max27
(空)
发信人:china 2000
时 间:2001-4-1 18:04:07
详细信息:
标 题:something (1千字)
发信人:1212
时 间:2001-4-1 20:46:09
详细信息:
something i did long long ago:)
for(i=0x31;i<0x7f;i++)
{
for(j=0x31;j<0x7f;j++)
{
n1=i;
n2=j;
if(n1<=0x39)
n1=(n1+0xd0)&0x00ff;
else n1=(n1+0xc9)&0x00ff;
n1=(n1<<4)&0x00ff;
if (n2<=0x39)
n2=(n2-0x30)&0x00ff;
else n2=(n2-0x37)&0x00ff;
num[i][j]=n1|n2;
switch(n)
{
case 0:
m=num[i][j]^(0x50);
break;
case 1:
m=num[i][j]^(0x51);
break;
case 2:
m=num[i][j]^(0x52);
break;
case 3:
m=num[i][j]^(0x53);
break;
case 4:
m=num[i][j]^(0x54);
break;
case 5:
m=num[i][j]^(0x55);
break;
case 6:
m=num[i][j]^(0x56);
break;
case 7:
m=num[i][j]^(0x57);
break;
default:
;
}
a=b=m;
for (k=0;k<6;k++)
{
a*=b;
if(a>0x8899)
a%=0x8899;
}
c=a%0xbb;
if (c==name[n])
{
ser[2*n]=i,ser[2*n+1]=j;
n++;
if (n>=8)
goto exit;
else goto calc;
}
}
}