用bpx MessageBoxA设断点,输入注册码并按“确定”之后会中断,
按几下F12并向上看,看见如下的判断:
0167:00488A42 MOV ECX,[EBP-08]
0167:00488A45 MOV EDX,[EBP-04]
0167:00488A48 MOV EAX,[EBX+0000034C]
0167:00488A4E CALL 00483730
//检查注册码
0167:00488A53 TEST AL,AL
0167:00488A55 JZ 00488AB6
0167:00488A57 PUSH 00
0167:00488A59 CALL USER32!MessageBeep
0167:00488A5E MOV EDX,00488B00
0167:00488A63 MOV EAX,EBX
0167:00488A65 CALL 0042CD98
0167:00488A6A XOR EDX,EDX
0167:00488A6C MOV EAX,[EBX+00000310]
0167:00488A72 MOV ECX,[EAX]
0167:00488A74 CALL [ECX+5C]
0167:00488A77 MOV EAX,[EBX+0000034C]
0167:00488A7D CALL 0048339C
0167:00488A82 MOV DL,01
0167:00488A84 MOV EAX,[EBX+000002FC]
0167:00488A8A MOV ECX,[EAX]
0167:00488A8C CALL [ECX+5C]
0167:00488A8F MOV DL,01
0167:00488A91 MOV EAX,[EBX+00000300]
0167:00488A97 MOV ECX,[EAX]
0167:00488A99 CALL [ECX+5C]
0167:00488A9C PUSH 40
0167:00488A9E MOV ECX,00488B14
0167:00488AA3 MOV EDX,00488B20
0167:00488AA8 MOV EAX,[0048C088]
0167:00488AAD MOV EAX,[EAX]
0167:00488AAF CALL 0044AC98
//注册码正确
0167:00488AB4 JMP 00488ACE
0167:00488AB6 PUSH 40
0167:00488AB8 MOV ECX,00488B68
0167:00488ABD MOV EDX,00488B70
0167:00488AC2 MOV EAX,[0048C088]
0167:00488AC7 MOV EAX,[EAX]
0167:00488AC9 CALL 0044AC98 //注册码错误
跟进call 00483730,看见:
0167:00483764 LEA ECX,[EBP-0C]
0167:00483767 MOV EDX,[EBP-04]
0167:0048376A MOV EAX,ESI
0167:0048376C CALL 00483820 //计算注册码
0167:00483771 MOV EAX,[EBP-0C] //假注册码
0167:00483774 MOV EDX,[EBP-08] //真注册码
0167:00483777 CALL 00403FD8 //比较注册码
0167:0048377C JNZ 004837D9
由于这个软件的注册码显然是用Win98的ProductID算出来的,故需要写
注册机。跟进call 00483820,把计算注册码的算法搞清楚。很简单,如下:
0167:00483864 MOV EAX,00000001
0167:00483869 MOV EDX,[EBP-08]
0167:0048386C MOV DL,[EAX+EDX-01] //从ProcductID中取一字符
0167:00483870 XOR EBX,EBX
0167:00483872 MOV BL,DL
0167:00483874 CMP EAX,04
0167:00483877 JNZ 00483881
0167:00483879 MOV ESI,EDX
0167:0048387B AND ESI,000000FF
0167:00483881 MOV EDX,EBX
0167:00483883 ADD EDX,EDX
0167:00483885 LEA EDX,[EDX*4+EDX]
0167:00483888 IMUL EDX,EAX
0167:0048388B IMUL EDX,ESI
0167:0048388E ADD [EBP-10],EDX
0167:00483891 INC EAX
0167:00483892 DEC ECX
0167:00483893 JNZ 00483869
//循环
0167:00483895 MOV EAX,[EBP-04]
0167:00483898 MOV ECX,[EAX+40]
0167:0048389B MOV EAX,[ECX+08]
0167:0048389E IMUL EBX
0167:004838A0 MOV EDX,[ECX+0C]
0167:004838A3 IMUL EDX,[EBP-10]
0167:004838A7 ADD EAX,EDX
0167:004838A9 MOV EDX,[ECX+04]
0167:004838AC IMUL EDX,ESI
0167:004838AF ADD EAX,EDX
0167:004838B1 CDQ
0167:004838B2 MOV [EBP-18],EAX
//注册码
0167:004838B5 MOV [EBP-14],EDX
0167:004838B8 PUSH DWORD PTR [EBP-14]
0167:004838BB PUSH DWORD PTR [EBP-18]
0167:004838BE MOV EAX,[EBP-0C]
0167:004838C1 CALL 00409360 //将注册码由数值形式转为字符串