getPassword2.3註冊碼計算分析過程 (3千字)

看雪資料發表於2001-11-07

GetPassword2.3註冊碼生成分析

下載:
  http://gaoasp.home.sohu.com/

  本程式沒有加殼,暴力破解非常簡單,只要用w32dasm分析一下就可找到。但由於註冊中無明碼比較,本文就它的註冊碼生成的原理分析,推算出註冊碼,根據演算法,可以很快的寫出一個序號產生器。

 用TRW載入它,下bpx getwindowtexta,F5返回,出現註冊視窗,填入大名:MAOMAO,註冊碼7654321,按OK後中斷,下BD *,再下pmodule,來到這裡:
0177:00415FE7  CALL    `USER32!GetMessageA`
0177:00415FED  TEST    EAX,EAX     <====游標停在這裡   
0177:00415FEF  JZ      00416017
0177:00415FF1  CMP      DWORD [ESI+34],036A
0177:00415FF8  JZ      00416014
0177:00415FFA  MOV      EAX,[ESI]
0177:00415FFC  PUSH    EDI
按住F10,經過一段讀姓名並變成小寫字母和讀輸入的註冊碼的程式後來到這裡:

0177:0040523B  MOV      EBP,[ESP+24] <=====這裡下D ebp可以看到你的使用者名稱被加上"whm_w",
                                          變成了"maomaowhm_w"(變成小寫)
0177:0040523F  XOR      EDX,EDX
0177:00405241  MOV      DL,[EAX+EBP] <=====取第1個字母
0177:00405244  MOV      EBP,[ESP+18]
0177:00405248  ADD      EBP,EDX      <=====和上一句完成累加
0177:0040524A  INC      EAX        <=====計數器加1
0177:0040524B  CMP      EAX,ECX      <=====ECX為字元總個數
0177:0040524D  MOV      [ESP+18],EBP <=====儲存這一次累加結果
0177:00405251  JC      0040523B    <=====沒結束則取下一字元
  這樣,你的使用者名稱就被小寫後加上字尾"whm_w",並將所有的字母累加。
按F10,程式在這裡取你輸入的註冊碼進行計算:
0177:00407A0B  CMP      DWORD [004254DC],BYTE +01  <=====這裡D EDI可看到被截掉後兩位的
                             註冊碼76543
0177:00407A12  JNG      00407A20
0177:00407A14  PUSH    BYTE +04
0177:00407A16  PUSH    ESI
0177:00407A17  CALL    0040AA9C
0177:00407A1C  POP      ECX
0177:00407A1D  POP      ECX
0177:00407A1E  JMP      SHORT 00407A2B
0177:00407A20  MOV      EAX,[004252D0]
0177:00407A25  MOV      AL,[EAX+ESI*2]
0177:00407A28  AND      EAX,BYTE +04
0177:00407A2B  TEST    EAX,EAX
0177:00407A2D  JZ      00407A3C
0177:00407A2F  LEA      EAX,[EBX+EBX*4]  <=====核心
0177:00407A32  LEA      EBX,[ESI+EAX*2-30] <=====核心 完成向十進位制的轉化
0177:00407A36  MOVZX    ESI,BYTE [EDI]
0177:00407A39  INC      EDI
0177:00407A3A  JMP      SHORT 00407A0B
0177:00407A3C  CMP      EBP,BYTE +2D
0177:00407A3F  MOV      EAX,EBX            <=====轉化後的結果放入EAX
0177:00407A41  JNZ      00407A45
0177:00407A43  NEG      EAX
0177:00407A45  POP      EDI
0177:00407A46  POP      ESI
0177:00407A47  POP      EBP
0177:00407A48  POP      EBX
0177:00407A49  RET   
  接著,程式又取剩下的2位註冊碼,再進入上面這段程式,轉化成十進位制。然後就來到這裡進行比較:
0177:004052AC  MOV      ECX,[ESP+28]    <=====後兩位註冊碼的十進位制值
0177:004052B0  MOV      EAX,[ESP+18]    <=====前幾位註冊碼的十進位制值
0177:004052B4  XOR      EBP,ECX     <=====異或運算,結果放入EBP
0177:004052B6  CMP      EAX,EBP     <=====再與姓名累加的值(EAX)進行比較
0177:004052B8  JNZ      NEAR 004053D1  <=====不相等就跳走,OVER
0177:004052BE  CMP      EDI,BYTE +01
0177:004052C1  JC      NEAR 004053D1
0177:004052C7  CMP      EBX,BYTE +01
0177:004052CA  JC      NEAR 004053D1
  整理一下注冊碼計算過程:
 1、將姓名小寫並加上字尾"whm_w",計算各字母的累加值;
 2、將輸入的註冊碼去後兩位後轉化成十進位制;
 3、將輸入的註冊碼的後兩位轉化成十進位制;
 4、將第2步與第3步的結果異或;
 5、用1的結果與4的結果進行比較,相等則註冊有效。
 由於計算中沒有明碼,所以無法直接找到註冊碼。但第4步異或操作可以看出,只要後兩位的註冊碼為00,那麼第4步的結果一定是第2步的結果!也就是說,你的註冊碼就可以這樣生成:用你的姓名(小寫)+"whm_w"並計算各字母的累加值,並在這個值的後面加上兩個0,就可以得到你的註冊碼了!如輸入姓名"maomao","maomaowhm_w"的計算結果為1180,則註冊碼為118000。哈哈,原來這麼簡單!

相關文章