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。哈哈,原来这么简单!
- 标 题:getPassword2.3注册码计算分析过程 (3千字)
- 作 者:Maomao[BCG]
- 时 间:2001-11-7 1:21:30
- 链 接:http://bbs.pediy.com