• 标 题:APISpy32 2.5的注册 (7千字)
  • 作 者:henryw
  • 时 间:2001-4-1 12:15:43
  • 链 接:http://bbs.pediy.com

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;
      }
  }
}