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。哈哈,原來這麼簡單!