文章作者:风飘雪
1)PEID检查,MicrosoftVisualBasic5.0/6.0。无壳
2)试运行程序,任意输入注册信息后有错误提示“重新来过吧”
3)OD载入程序,用OD的超级字符串查找功能找不到相应的内容。
只好在命令行下断。bp__vbaVarTstEqbp__vbaStrCmp都不能成功将程序中断。
只有用bp__vbaLenBstr才可以使程序中断。
4)用bp__vbaLenBstr下断后,任意输入注册信息。
程序中断在这里
6A2A49CE>8B442404MOVEAX,DWORDPTRSS:[ESP+4]
6A2A49D285C0TESTEAX,EAX
6A2A49D47405JESHORTMSVBVM60.6A2A49DB
6A2A49D68B40FCMOVEAX,DWORDPTRDS:[EAX-4]
6A2A49D9D1E8SHREAX,1
6A2A49DBC20400RETN4
ALT+F9返回程序领空:
来到这里。。。
00412EC8.FF150C104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaLenBs>;取注册名位数
00412ECE.8BC8MOVECX,EAX
00412ED0.FF1554104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaI2I4>>;
00412ED6.8D4DC8LEAECX,DWORDPTRSS:[EBP-38];EBP-38=注册名
00412ED9.8BD8MOVEBX,EAX
00412EDB.FF15BC104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaFreeS>;
00412EE1.8D4DB8LEAECX,DWORDPTRSS:[EBP-48]
00412EE4.FF15C0104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaFreeO>;
00412EEA.66:83FB06CMPBX,6;注册名不得小于6位,小于则跳向结束
00412EEE.0F8D81000000JGECrackMe0.00412F75
00412EF4.B90A000000MOVECX,0A
00412EF9.B804000280MOVEAX,80020004
00412EFE.898D78FFFFFFMOVDWORDPTRSS:[EBP-88],ECX
00412F04.894D88MOVDWORDPTRSS:[EBP-78],ECX
00412F07.894D98MOVDWORDPTRSS:[EBP-68],ECX
00412F0A.8D9568FFFFFFLEAEDX,DWORDPTRSS:[EBP-98]
00412F10.8D4DA8LEAECX,DWORDPTRSS:[EBP-58]
00412F13.894580MOVDWORDPTRSS:[EBP-80],EAX
00412F16.894590MOVDWORDPTRSS:[EBP-70],EAX
00412F19.8945A0MOVDWORDPTRSS:[EBP-60],EAX
00412F1C.C78570FFFFFF>MOVDWORDPTRSS:[EBP-90],CrackMe0.00411>
00412F26.C78568FFFFFF>MOVDWORDPTRSS:[EBP-98],8
00412F30.FF159C104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaVarDu>;
00412F36.8D8578FFFFFFLEAEAX,DWORDPTRSS:[EBP-88]
00412F3C.8D4D88LEAECX,DWORDPTRSS:[EBP-78]
00412F3F.50PUSHEAX
00412F40.8D5598LEAEDX,DWORDPTRSS:[EBP-68]
00412F43.51PUSHECX
00412F44.52PUSHEDX
00412F45.8D45A8LEAEAX,DWORDPTRSS:[EBP-58]
00412F48.6A00PUSH0
00412F4A.50PUSHEAX
00412F4B.FF1530104000CALLDWORDPTRDS:[<&MSVBVM60.#595>];
00412F51.8D8D78FFFFFFLEAECX,DWORDPTRSS:[EBP-88]
00412F57.8D5588LEAEDX,DWORDPTRSS:[EBP-78]
00412F5A.51PUSHECX
00412F5B.8D4598LEAEAX,DWORDPTRSS:[EBP-68]
00412F5E.52PUSHEDX
00412F5F.8D4DA8LEAECX,DWORDPTRSS:[EBP-58]
00412F62.50PUSHEAX
00412F63.51PUSHECX
00412F64.6A04PUSH4
00412F66.FF1514104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaFreeV>;
00412F6C.83C414ADDESP,14
00412F6F.FF1510104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaEnd>];
00412F75>8B55D4MOVEDX,DWORDPTRSS:[EBP-2C]将小写字母转换相应的大写字母
00412F78.BB02000000MOVEBX,2;
00412F7D.53PUSHEBX
00412F7E.52PUSHEDX
00412F7F.895DB0MOVDWORDPTRSS:[EBP-50],EBX
00412F82.895DA8MOVDWORDPTRSS:[EBP-58],EBX
00412F85.FF15AC104000CALLDWORDPTRDS:[<&MSVBVM60.#618>];取注册名最右边的两位
00412F8B.8BD0MOVEDX,EAX
00412F8D.8D4DC8LEAECX,DWORDPTRSS:[EBP-38]
00412F90.FFD6CALLESI
00412F92.50PUSHEAX
00412F93.8B45D4MOVEAX,DWORDPTRSS:[EBP-2C]
00412F96.53PUSHEBX
00412F97.50PUSHEAX
00412F98>.FF15A0104000CALLDWORDPTRDS:[<&MSVBVM60.#616>];取注册名最左边的两位
00412F9E.8BD0MOVEDX,EAX
00412FA0.8D4DC4LEAECX,DWORDPTRSS:[EBP-3C]
00412FA3.FFD6CALLESI
00412FA5.8B1D20104000MOVEBX,DWORDPTRDS:[<&MSVBVM60.__vbaSt>;
00412FAB.50PUSHEAX
00412FAC.FFD3CALLEBX;最右边两位和最左边两位合并,设为A
00412FAE.8BD0MOVEDX,EAX
00412FB0.8D4DC0LEAECX,DWORDPTRSS:[EBP-40]
00412FB3.FFD6CALLESI
00412FB5.8B55D4MOVEDX,DWORDPTRSS:[EBP-2C]
00412FB8.8D4DA8LEAECX,DWORDPTRSS:[EBP-58]
00412FBB.50PUSHEAX
00412FBC.51PUSHECX
00412FBD.6A02PUSH2
00412FBF.52PUSHEDX
00412FC0.FF1544104000CALLDWORDPTRDS:[<&MSVBVM60.#631>];取注册名的第二和第三位,设为B
00412FC6.8BD0MOVEDX,EAX
00412FC8.8D4DBCLEAECX,DWORDPTRSS:[EBP-44]
00412FCB.FFD6CALLESI
00412FCD.50PUSHEAX
00412FCE.FFD3CALLEBX
00412FD0.8BD0MOVEDX,EAX;A与B合并
00412FD2.8D4DD0LEAECX,DWORDPTRSS:[EBP-30]、
省略一些代码。。。。。。
0041305A.FF1598104000CALLDWORDPTRDS:[<&MSVBVM60.__vbaStrCo>;真假注册码比较
00413060.66:85C0TESTAX,AX
00413063.0F8508010000JNZCrackMe0.00413171不相等就跳向结束
------------------------------------------------------------------------
算法总结:
1)注册名必须大于六位。
2)取注册名的最右边两位(设为甲)。最左边两位(设为乙)。第2和第3位(设为丙)。
3)将甲乙丙合并即为注册码。
例:19860805
取其最右边两位05。最左边两位19。第2和第3位98
所以注册名:19860805
注册码:051998
********************************************注意***********************************************
如果注册名中有小写字母,则程序先将其先转换成相应的大写字母。
例:
注册名aabbccdd对应的注册码是DDAAAb
有错误或疏漏的地方请大家指出