一、流程分析
先运行TRW2000 1.23注册版,再运行媒体2000,随便乱输注册码,确定,跳出窗口提示注册码错,按ctrl-N,下pmodule命令,返回出错窗口,点确定,立刻被拦,按2次F10来到40f41d处,往上看:
0167:0040F0D1 LEA ECX,[ESP+48]
0167:0040F0D5 MOV BYTE [ESP+052C],0A
0167:0040F0DD CALL 004593E8 显示输入框
0167:0040F0E2 CMP EAX,BYTE +01 按确定?
0167:0040F0E5 JNZ NEAR 0040F40E 否
0167:0040F0EB LEA EAX,[ESP+A4]
0167:0040F0F2 LEA ECX,[ESP+14]
0167:0040F0F6 PUSH EAX
0167:0040F0F7 CALL 0045DD86
0167:0040F0FC MOV ECX,[ESP+14]
0167:0040F100 PUSH DWORD 004A7B48
0167:0040F105 PUSH ECX
0167:0040F106 CALL 0043319B
0167:0040F10B ADD ESP,BYTE +08
0167:0040F10E TEST EAX,EAX 注册码为空?
0167:0040F110 JZ 0040F15C 是
0167:0040F112 MOV EDX,[ESP+14]
0167:0040F116 MOV EAX,[EDX-08] 取注册码长度
0167:0040F119 CMP EAX,BYTE +0C
0167:0040F11C JL 0040F15C 小于12则错
0167:0040F11E PUSH BYTE +04
0167:0040F120 LEA EAX,[ESP+14]
0167:0040F124 PUSH BYTE +08
0167:0040F126 PUSH EAX
0167:0040F127 LEA ECX,[ESP+20]
0167:0040F12B CALL 0044F1DB 取注册码的第8-12位
0167:0040F130 MOV EAX,[EAX]
0167:0040F132 PUSH EAX
0167:0040F133 CALL 0043362C 变成数值
0167:0040F138 ADD ESP,BYTE +04
0167:0040F13B LEA ECX,[ESP+10]
0167:0040F13F MOV ESI,EAX 存入ESI
0167:0040F141 CALL 0045DC4D
0167:0040F146 CMP ESI,BYTE +64
0167:0040F149 JNL 0040F158 小于64则错
0167:0040F14B PUSH BYTE +00
0167:0040F14D PUSH EBP
0167:0040F14E PUSH DWORD 004A1C9C
0167:0040F153 JMP 0040F416
0167:0040F158 CMP ESI,EDI 等于识别码后4位?
0167:0040F15A JZ 0040F169 等于
0167:0040F15C PUSH BYTE +00
0167:0040F15E PUSH EBP
0167:0040F15F PUSH DWORD 004A1C9C
0167:0040F164 JMP 0040F416 出错
0167:0040F169 LEA ECX,[EDI+EDI*4] 以下校验注册码的真假
0167:0040F16C LEA EDX,[EDI+EDI*8]
0167:0040F16F LEA EAX,[EDI+ECX*8]
0167:0040F172 LEA ESI,[EDI+EDX*2]
0167:0040F175 LEA ECX,[EAX+EAX*2]
.
.
.
0167:0040F300 LEA EAX,[ECX+EAX*4]
0167:0040F303 LEA EAX,[EAX+EAX*4]
0167:0040F306 LEA ECX,[EAX+EAX*4]
0167:0040F309 LEA EAX,[ESI+ECX*4]
0167:0040F30C LEA EAX,[EAX+EAX*4]
0167:0040F30F LEA EAX,[EAX+EAX*4]
0167:0040F312 LEA EDX,[EDX+EAX*4-1C]
0167:0040F316 MOV EAX,[ESP+44]
0167:0040F31A CMP EAX,EDX 注册码为真?
0167:0040F31C JNZ NEAR 0040F3C1 否,出错
弄清以上流程,爆破就容易了。
二、注册码的校验算法
1、将输入的12位注册码分成2部分:前8位设为X,后4位设为Y(均为10进制,以下同);
2、将Y*123的前3位与Y*456的第2、3、4位串起来成为一个6位数,设为Z;
3、计算X-Z,设为M;
4、将M从高位到低位分成4个2位数,设为A、B、C、D;
5、将A、B、C、D重新组合成新的8位数CBDA,计算CBDA-15111028,设为N;
6、比较N与识别码的前8位,相等则输入的注册码为真,否则为假。
三、注册码的生成算法
1、将软件给出的12位识别码分成2部分:前8位设为X,后4位设为Y(均为10进制,以下同);
2、将Y*123的前3位与Y*456的第2、3、4位串起来成为一个6位数,设为Z;
3、计算X+15111028,设为M;
4、将M从高位到低位分成4个2位数,设为A、B、C、D;
5、将A、B、C、D重新组合成新的8位数DBAC,计算DBAC+Z,设为N;
6、将N与识别码的后4位串起来,形成注册码。
四、注册成功标志
注册成功标志放在注册表的HKEY_USERS\.Default\RemoteAccess\Identf\Licn处。