用户定义的注释
地址 反汇编 注释
0040ED50 push ebp 自校验开始
0040EE29 call [<&MSVBVM60.__vbaStrCmp>] 检查文件名是否一致
0040EE4E jmp short 0040EE56 改为jmp
0040F0A4 cmp esi, 0C062 比较文件大小是否一致
0040F0AA jmp short 0040F0B2 改为jmp
0040F140 push ebp 点击确定
0040F3CD call 0040BF10 获取D盘序列号
0040F3D8 mov ecx, [ebp-310] D盘序列号HEX:1811A538入ecx
0040F467 call [<&MSVBVM60.__vbaStrVarVal>] 序列号HEXTODEC(1811A538)=403809592
0040F474 fadd qword ptr [401240] Val1=403809592+51184530(常数)=454994122
0040F484 call [<&MSVBVM60.__vbaFpI4>] DECTOHEX(Val1)=1B1EA8CA入eax
0040F52B call [<&MSVBVM60.#577>] 获取文件修改日期FileDateTime=2006-5-8 9:37:30
0040F591 call 00413BF0 MD5(2006-5-8 9:37:30)=C84E9EBB7567AD2FB05387BFDF25F565
0040F5C0 mov dword ptr [ebp-2C0], 0040BFF0 Str1=0651184530274933032758648253457
0040F5E2 mov dword ptr [ebp-2C0], 0040C034 Str2=crackmelxmadebylangxanginzhejiang
0040F604 mov dword ptr [ebp-2C0], 0040C07C Str3=123456789ABCDEFabcdefghijklmnopq
0040F65E mov edx, [ebp-200] 用户名入edx
0040F66A call [<&MSVBVM60.__vbaStrCmp>] 检测用户名是否为空
0040F6D3 mov dword ptr [ebp-2D0], 0040C0F0 "友情提示"
0040F6F1 mov dword ptr [ebp-2C0], 0040C0DC "请输入用户名!"
0040F797 mov eax, [ebp-200] 信箱入eax
0040F7A3 call [<&MSVBVM60.__vbaStrCmp>] 检查信箱是否为空
0040F80C mov dword ptr [ebp-2D0], 0040C118 "注意"
0040F82A mov dword ptr [ebp-2C0], 0040C100 "邮箱号不能为空!"
0040F8DA mov edx, [ebp-200] 信箱入edx
0040F8EB call [eax+6F8] 检查信箱是否符合规范
0040F977 mov dword ptr [ebp-2C0], 0040C124 请检查EMAIL格式
0040F9ED mov ecx, [ebp-200] 注册码入ecx
0040F9F9 call [<&MSVBVM60.__vbaStrCmp>] 检查注册码是否为空
0040FA63 mov dword ptr [ebp-2C0], 0040C140 "注册码不能为空"
0040FBAB call [<&MSVBVM60.__vbaVarTstEq>] 判断sn.key是否存在
0040FC04 push 0040C180 "未注册"
0040FD01 call [<&MSVBVM60.__vbaVarTstEq>] 判断sn.key是否存在
0040FE54 call edi MID(Val1,4,3)=994
0040FE90 call edi MID(Val1,3,3)=454
0040FEA7 call [<&MSVBVM60.__vbaVarCat>] Val2=MID(Val1,4,3) & MID(Val1,1,3)=994454
0040FEBB push eax Cat结果994454入栈
0040FEBC call [<&MSVBVM60.#581>] 994454取整数赋值得到Val2=994454
0040FECE fadd qword ptr [401238] Val3=Val2+320968016(定值)=321962470=SN.KEY中的值
0040FF42 call [<&MSVBVM60.__vbaVarTstNe>] Val3与sn.key中的值进行比较
0040FFE3 call [<&MSVBVM60.__vbaVarLateMemCallL 读取注册表键值=20060501
0041001F call 00413BF0 MID(MD5(20060501),9,16)=ffe55834a9ce70ab
004100A6 push edx Val4=机器码入栈=638581041
00410118 cmp [ebp-3A0], esi 循环开始,i=1,Length(Val4)
004101BE call edi MID(Val4,i,1)
004101F9 call [<&MSVBVM60.__vbaVarAdd>] MID(Val4,i,1)+1
00410215 call edi MID(Str1,(MID(Val4,i,1)+1),1)
0041031B call edi MID(Val4,i,1)
00410356 call [<&MSVBVM60.__vbaVarAdd>] MID(Val4,i,1)+1
00410372 call edi MID(Str2,(MID(Val4,i,1)+1),1)
00410382 call [<&MSVBVM60.#528>] UpperCase Mid结果
00410417 jmp 00410118 循环结束
00410480 push edx 信箱入栈
00410481 call [<&MSVBVM60.__vbaLenBstr>] 取信箱长度
004104F2 mov eax, [ebp-3AC] 循环开始,j=1,length(mail)
0041059A call edi MID(mail,j,1)
004105B7 mov [ebp-2D0], ax ax=HEX(MID(mail,j,1)
004105E9 call [<&MSVBVM60.__vbaVarAdd>] XOR结果+HEX值,首次Xor结果=0
004105FE call [<&MSVBVM60.__vbaVarXor>] 3 XOR ADD结果入ecx
00410604 mov edx, eax 循环结束后得到最终XOR结果=36C
0041066F jmp 004104F2 循环结束后得到最终XOR结果=36C
004106CC fsub qword ptr [401230] Val5=机器码-123456(定值)=638457585
004106DC call [<&MSVBVM60.__vbaFpI4>] DECTOHEX(Val5)=260E16F1入eax
004106E2 not eax 取反=D9F1E90E
0041072C call [<&MSVBVM60.__vbaStrVarVal>] Val51=(-Val5)-1=-638457586
00410742 fdiv qword ptr [401228] Val52=-638457586/2=-319228793
00410765 call [<&MSVBVM60.__vbaFpI4>] Val52浮点数取整后保存得到ECF8F487入eax
0041076B add eax, 75BCD15 ECF8F487+75BCD15=F454C19C
00410777 call [<&MSVBVM60.__vbaStrI4>] 将F454C19C转换为整数得到Val53=-195772004
004107D2 call 00413BF0 MD5(Val53=-195772004)=12C4F04933B7D99A70BA16FEF57CBA9C
0041082F call edi MID(Val1,4,3)=994
0041086B call edi MID(Val1,1,3)=454
00410882 call [<&MSVBVM60.__vbaVarCat>] Val2=MID(Val1,4,3) & MID(Val1,1,3)=994454
004108CB push eax 994454入栈
004108DE fadd qword ptr [401220] Val6=994454+360741618(定值)=361736072
0041092E call [<&MSVBVM60.__vbaVarAdd>] Val7=((Str1查表结果=413836016)+mail处理结果HEXTODEC(36C)=876)=413836892
00410940 call [<&MSVBVM60.__vbaVarAdd>] Val8=(Val7=413836892)+(Val6=361736072)=775572964
00410947 call [<&MSVBVM60.__vbaI4ErrVar>] DECTOHEX(Val8)=2E3A4DE4入eax
00410972 call [<&MSVBVM60.__vbaVarCat>] STR4=Val8 & MID(Str2,(MID(Val4,i,1)+1),1)=775572964ECXMXRCKR
004109CD call edi MID(MID(MD5(20060501),9,16),9,4)=a9ce
004109DF call [<&MSVBVM60.#617>] Left(Str4,5)=77557
00410A09 call [<&MSVBVM60.#619>] Right(Str4,13)=2964ECXMXRCKR
00410A36 call edi MID(MD5(Val53=-195772004),4,5)=4f049
00410A92 mov edx, eax 以上4个CAT将字符串连接起来,得到真码m1=a9ce77557-2964ECXMXRCKR4f049
00410B4E push edx 假注册码入栈
00410B4F call [<&MSVBVM60.__vbaLenBstr>] 取注册码长度
00410B55 sub eax, 9 长度-9,作为循环记数器
00410BCC cmp [ebp-3B4], esi 循环开始
00410C7E call [<&MSVBVM60.__vbaVarAdd>] j+4,j=1,(length(注册码)-9)
00410C9A call edi MID(注册码,(j+4),1),j=1,(length(注册码)-9)
00410CAA call [<&MSVBVM60.__vbaStrVarVal>] 取MID结果HEX入[eax]
00410CE9 call [<&MSVBVM60.__vbaVarAdd>] HEX+j
00410CFE call [<&MSVBVM60.__vbaVarAdd>] HEX+j+4
00410D2E call [<&MSVBVM60.__vbaVarCat>] 字符串连接
00410DB7 jmp 00410BCC 循环结束,得到m2
00410DE3 call edi MID(MID(MD5(20060501),9,16),9,4)=a9ce
00410E0C call edi MID(MD5(Val53=-195772004),4,5)=4F049
00410E0E mov edi, [<&MSVBVM60.__vbaVarCat>] 字符串连接
00410E30 call edi 字符串连接
00410E32 push eax 最终得到字符串
00410E44 call [<&MSVBVM60.__vbaVarTstEq>] 真假码比较
00410E85 je 00410FA8 爆破点
00410ECC mov eax, [edi] (初始 CPU 选择)
00410EF8 push 0040C1A4 "恭喜你"
00410F15 push 0040C1B4 ","
00410F2F push 0040C1BC "你太厉害了!"
00410FC4 push 0040C1D0 "未注册"
004114E5 call 0040BF10 获取C盘序列号GetVolumeInformationA
004114F0 mov eax, [ebp-AC] C盘序列号=24DDDFDC入eax
0041159D call [<&MSVBVM60.__vbaVarAdd>] HEX(C盘序列号24DDDFDC)+01321955=260FF931
004115A8 call [<&MSVBVM60.__vbaStrVarVal>] HEXTODEC(260FF931)=机器码=638581041
综合:
如果是爆破,是很简单的,直接修改如下地址:
00410DA5 je 00410EC8 爆破点,不跳,跳就OVER.
算法过程研究:
Str1=0651184530274933032758648253457
Str2=crackmelxmadebylangxanginzhejiang
Str3=123456789ABCDEFabcdefghijklmnopq
1.根据D盘序列号1811A538获得一组数字,此处为403809592,D盘序列号:1811A538,HEXTODEC即可;
Val1=403809592+51184530(定值)=454994122
2.取文件修改日期,作MD5运算;日期用FileDateTime获取,格式2006-5-8 9:37:30
MD5(2006-5-8 9:37:30)=C84E9EBB7567AD2FB05387BFDF25F565
3.Val2=MID(Val1,4,3) & MID(Val1,1,3)=994454
4.Val3=Val2+320968016(定值)=321962470,并与sn.key中值进行比较,故创建sn.key,记事本编辑,写入321962470,保存;
5.注册表date值=20060501取MID(MD5(20060501),9,16)=ffe55834a9ce70ab
6.Val4=机器码=638581041,
循环开始,i=1,Length(Val4)
MID(Val4,i,1)
MID(Val4,i,1)+1
MID(Str1,(MID(Val4,i,1)+1),1)
MID(Str2,(MID(Val4,i,1)+1),1)
对应列表:
6 3 8 5 8 1 0 4 1
查Str计数器值等于MID结果+1,对应为:
7 4 9 6 9 2 1 5 2
在Str1中对应:
4 1 3 8 3 6 0 1 6=413836016
在Str2中对应:
E C X M X R C K R=ECXMXRCKR
7.取信箱,这里是abc@123.com,j=1,length(mail),开始循环:
MID(mail,J,1),取HEX值,对应为
a b c @ 1 2 3 . c o m
61 62 63 49 31 32 33 2E 63 6F 6D
ADD XOR结果,首次循环XOR结果为0,即首次循环ADD结果=信箱首字符HEX值
3 xor ADD结果
最终得到36C
8.Val5=机器码-123456(定值)=638457585
DECTOHEX(Val5)=260E16F1
取反DECTOHEX(Val5)=D9F1E90E
Val51=(-Val5)-1=-638457586
Val52=-638457586/2=-319228793
Val52浮点数取整后保存得到ECF8F487入eax
ECF8F487+75BCD15=F454C19C
将F454C19C转换为整数得到Val53=-195772004
MD5(Val53=-195772004)=12C4F04933B7D99A70BA16FEF57CBA9C
9.Val6=(Val2=994454)+360741618(定值)=361736072
Val7=((Str1查表结果=413836016)+mail处理结果HEXTODEC(36C)=876)=413836892
Val8=(Val7=413836892)+(Val6=361736072)=775572964
DECTOHEX(Val8)=2E3A4DE4入eax
10.STR4=Val8 & MID(Str2,(MID(Val4,i,1)+1),1)=775572964ECXMXRCKR
MID(MID(MD5(20060501),9,16),9,4)=a9ce
Left(Str4,5)=77557
Right(Str4,13)=2964ECXMXRCKR
MID(MD5(Val53=-195772004),4,5)=4f049
得到真码=a9ce77557-2964ECXMXRCKR4f049
假定77557-2964ECXMXRCKR
11.MID(注册码,(j+4),1),j=1,(length(注册码)-9)
HEX(MID)+j+4
循环之后得到解密码m2,
要使得00410E44 call [<&MSVBVM60.__vbaVarTstEq>] 真假码比较返回TRUE,
则必须m1=m2,逆推过程如下:
7 7 5 5 7 - 2 9 6 4 E C X M X R C K R
HEX:37 37 35 35 37 2D 32 39 36 34 45 43 58 4D 58 52 43 4B 52
DEC:55 55 53 53 55 45 50 57 54 52 69 67 88 77 88 82 67 75 82 减去
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
= 50 49 46 45 46 35 39 45 41 38 54 51 71 59 69 62 46 53 59
HEX:32 31 2E 2D 2E 23 27 2D 29 26 36 33 47 3B 45 3E 2E 35 3B
即注册码第5-23位为21.-.#'-)&63G;E>.5;
注册码长度28位,-9后=循环计数19
注册码XXXX21.-.#'-)&63G;E>.5;XXXXX
前4位,后5位,随便填,不参与注册码运算.