APISpy32 2.5的註冊 (7千字)

看雪資料發表於2001-04-01

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

相關文章