MP3 explorer 破解和序號產生器的製作

看雪資料發表於2015-11-15

=========================================================================
工具
=========================================================================
- Soft ice 3.23 (喜新不厭舊!)
- C++編譯器
- 大腦和好聽的音樂 :)

Note: 我希望你知道這些工具怎麼用,否則的話,先儲存這篇文章,找一些基礎的文章看看
我推薦"看雪學苑"中的文章!我主頁上也有連線.

=========================================================================
一,二,三 /開始!
=========================================================================

執行MP3 explorer,到幫助選單,點選關於,你應該看到輸入註冊碼的地方了吧!

輸入名字: ACiD BuRN
假設一個密碼: 12321

記得許多教程中讓你一步步地跟蹤除錯嗎?太累了,很久都不會走上路子,特別是一些新手,
這兒介紹一種新思維:使用BPR技術,可以輕易幫我們解決問題 :)


設定一個GetWindowtextA斷點,回到註冊視窗,點選OK! Soft ice自動跳出來!

Break due to BPX USER32!GETWINDOWTEXTA...

不要按任何鍵!(包括 F11 或 F12) 我們將要看一看堆疊的引數. 為了清楚地介紹,我們將看看
dword (命令 = dd) 那麼,在soft ice中鍵入: dd esp為什麼呢?讓我告訴你吧:

"dd"是指: 顯示 dword 和 "esp" 堆疊指標!

你鍵入"dd esp"之後, 在Soft-ice's中,視窗將發生變化,我們可以看到引數:

xxxx:yyyyyyyy  A    B    C    D  ................
xxxx:yyyyyyyy  E    F    G    H  ................


那些A,B,C,D,E...應該看起來象這樣:  XXXXXXXX (當然XXXXXXXX只是一些數字)

你應該看到一些象這樣的:

xxxx:yyyyyyyy  0044423B  00000464  015DB338  0000000A  ...........

我們將只用這些知識 :)

(你應該注意到,在這兒 A=0044423B , B=00000464, C= 015DB338...)

我們只能看到我們註冊的名字結束的地方 (015DB338).

鍵入 D "名字結束的地址" 這兒是: D 015DB338

現在,你可以按一下F11,你就應該在地址中看到我們輸入的名字(那就是名字結束的地方...)

很好,我們的路子走對了!

我們將使用一個 BPR (break on memory range). 這種斷點的設定應該象這樣:
bpr "開始地址" "結束地址" RW

RW 是指:  讀和寫.就是指將在這段地址進行讀寫的時候停下來.

那麼在Soft-ice中, 鍵入:
bpr 015DB338 015DB338 + (名字的長度 - 1) RW

如 ACiD BuRN (有九個字母 -> 9 - 1 = 8)

我們的目標是 ACiD BuRN,所以我們鍵入 :

bpr 15DB338 015DB338+8 RW

這時候,你設定的getwindowtextA斷點已經沒用了!你只有按F5了,我們將直接在目標處被截下.
但是,在這個軟體中,不太直接,我們落在 dll中,所以不停地按F5直到跳出去.當跳到軟體的程式碼
時, 我們來到了好地方! 就是從那開始的: 看看我 winice.log 中的記錄吧!

----------------------SNiP----- SNiP----- SNiP----------------------------

:bpx getwindowtexta
Break due to BPX USER32!GetWindowTextA  (ET=1.17 seconds)
:dd esp
:d 15f5a18
Break due to G (ET=268.99 microseconds)
:bpr 15f5a18 15f5a18+8 RW
:bd 0
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
:u eip l 50

註釋:這兒是第一個 loop:

025F:0040A173  8B442420            MOV    EAX,[ESP+20]  ; EAX 中是我名字的地址
025F:0040A177  0FBE0C06            MOVSX  ECX,BYTE PTR [EAX+ESI] ; ECX = 第一個字母的hex值
025F:0040A17B  51                  PUSH    ECX
025F:0040A17C  E8E9BB0100          CALL    00425D6A      ; 有趣 !!!!
025F:0040A181  83C404              ADD    ESP,04
025F:0040A184  03E8                ADD    EBP,EAX      ; 把ascii值轉化成hex值送到EBP中
025F:0040A186  46                  INC    ESI          ; 第二個字母!
025F:0040A187  3BF7                CMP    ESI,EDI      ; 都結束了嗎 ?!
025F:0040A189  7CE8                JL      0040A173    ; 如果沒有,跳回吧 !


025F:0040A18B  8B4C240C            MOV    ECX,[ESP+0C]        /
025F:0040A18F  BAC0D40100          MOV    EDX,0001D4C0        /
025F:0040A194  2BD5                SUB    EDX,EBP            /  我們一會再看這兒
025F:0040A196  33C0                XOR    EAX,EAX          /   
025F:0040A198  3BCA                CMP    ECX,EDX          /
025F:0040A19A  8D4C2420            LEA    ECX,[ESP+20]    /
025F:0040A19E  0F94C0              SETZ    AL            /


在這裡, 我們看到了把每個字母的ascii值轉化成hex值送到EBP中.但是,我們看到了那個Call
非常有趣!讓我們進去看看 :

:u eip l 50

025F:00425D6A  53                  PUSH    EBX
025F:00425D6B  33DB                XOR    EBX,EBX        ; 使EBX=0
025F:00425D6D  391D74344800        CMP    [00483474],EBX 
025F:00425D73  7513                JNZ    00425D88
025F:00425D75  8B442408            MOV    EAX,[ESP+08]  ;把ascii值移至EAX
025F:00425D79  83F861              CMP    EAX,61        ;和 61h 比較   
025F:00425D7C  7C59                JL      00425DD7      ;如果小於 61? 跳到 425DD7
025F:00425D7E  83F87A              CMP    EAX,7A        ;和 7A 比較
025F:00425D81  7F54                JG      00425DD7      ;如果大於 7A? 跳到 425DD7
025F:00425D83  83E820              SUB    EAX,20        ;小於 7A 但大於 61 (eax-20) 
025F:00425D86  5B                  POP    EBX
025F:00425D87  C3                  RET                  ;返回!call結束!
025F:00425D88  56                  PUSH    ESI
025F:00425D89  BE88484800          MOV    ESI,00484888
025F:00425D8E  57                  PUSH    EDI
025F:00425D8F  56                  PUSH    ESI



那麼,接著該怎麼辦呢?!它和 61 , 7A 進行比較! 61h = a 並且 7Ah = z 如果它小於7A但是大於61
它將會被減去20.其實這只是把它轉化成大寫字母!那麼ACiD BuRN 的註冊碼將會和 Acid Burn, acid
burn, ACID burn...一樣.那麼主loop會怎麼做呢? 把所有字母轉化成大寫接著把ascii值轉化成hex值
送到EBP中... 所有的字母完成後我們將會在這兒:

025F:0040A18B  8B4C240C            MOV    ECX,[ESP+0C]  ; ECX = 我們輸入的假註冊碼
025F:0040A18F  BAC0D40100          MOV    EDX,0001D4C0  ; EDX = 1D4C0h = 12000 
025F:0040A194  2BD5                SUB    EDX,EBP        ; EDX = EDX - EBP
025F:0040A196  33C0                XOR    EAX,EAX        ; EAX = 0
025F:0040A198  3BCA                CMP    ECX,EDX        ; 比較真假註冊碼
025F:0040A19A  8D4C2420            LEA    ECX,[ESP+20] 
025F:0040A19E  0F94C0              SETZ    AL           

這已經很清楚了!
步驟是這樣的:

- 把所有字母轉化成大寫
- add all ascii values
- Subtract the result of ascii added to 12000

現在,你可以非常容易的為 MP3 Explorer 編寫序號產生器了 !通常, 我會把我自己編寫的原始碼
給你 :)這兒用的是是 C++ 和 inline asm :)


-------------------------原始碼 從這開始!---------------------------------

#include <stdio.h>
#include <string.h>
#include <conio.h>

int main(){
    int i,len;

    unsigned char name[100];

    unsigned long check=128;

    printf("\Mp3 Explorer Keygen By : ACiD BuRN [Immortal descendants] \n ");
    printf("\                                                          ");
    printf("\nEnter name: ");
    gets(name);
    len=strlen(name);

asm
{
      xor ecx, ecx
      xor edi, edi    
      mov edx, [len]

start1:
      movsx eax, [name+ecx]
      cmp eax, 97
      jl temp1
      cmp eax, 122
      jg temp1
      sub eax, 32

temp1:
      add edi, eax
      inc ecx
      cmp ecx, edx
      jne start1

      mov eax, 120000
      sub eax, edi
      mov [check], eax

}
   
    printf("=: %lu" ,check); /* %lu = decimal, check = serial */
    printf("\nEnjoy!");
getch();
return 0;

}

----------------------------結束---------------------------------

=======================================================================
翻譯來自 "夢醒時分" 網站,歡迎訪問獲得更多的資料,爭作中國最好的網站!      }
translate from "time of dream broken" get more information at our web.}
                    We Will Best in China!                          }
======================================================================}
http://todb.yeah.net          http://go.163.com/~yinqun2000/        }
=======================================================================

相關文章