• 标 题:getPassword2.3注册码计算分析过程 (3千字)
  • 作 者:Maomao[BCG]
  • 时 间:2001-11-7 1:21:30
  • 链 接:http://bbs.pediy.com

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。哈哈,原来这么简单!