【文章标题】: 爱琴海的Crackeme算法分析
【文章作者】: benbentaiyang(xiaozi)
【作者邮箱】: **@**.com
【作者主页】: 无
【作者QQ号】: 40597503
【软件名称】: 新手来破解我
【软件大小】: 自己看了
【下载地址】: http://bbs.pediy.com/showthread.php?t=41811
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: vb
【使用工具】: OD,计算器
【操作平台】: WinXP
【软件介绍】: 没什么特别的,全屏,提示,吓唬人
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
最近脱壳郁闷,就来CrackeMe区逛逛,看到“新手来破解我”,甚喜,终于有地方发泄了。
下载,输入姓名注册码,好可怕的提示,不允许破解,一下子全屏了,我输入用户名benbentaiyang,注册码:787878,提示关机,晕,我还没有开OD就要关我的机啊。
废话少说了,开工。
打开OD,载入,下断点bpx __VbaStrCmp,运行,来到输入界面,输入上面的用户名,点注册,程序被拦下,查看寄存器:
EAX 0015240C UNICODE "6.97927603067956E+46maple-scg"
ECX 01030684
EDX 001524BC UNICODE "787878"
EBX 0014AA7C
ESP 0012F438
EBP 0012F508
ESI 0014AA40
EDI 733B44F6 MSVBVM60.__vbaStrCopy
EIP 00632F57 3.00632F57
明显地明码比较,将6.97927603067956E+46maple-scg拷贝到注册码输入窗口,成功!
太菜鸟来说也太简单了,不过瘾,既然简单,那就分析一下算法吧!hoho,一说算法就头疼,没关系,这个很简单的,very easy!
找算法当然得往比较的代码上面找,找到这个子函数的开头:
00632CD0 55 push ebp
00632CD1 8BEC mov ebp,esp
00632CD3 83EC 0C sub esp,0C
00632CD6 68 16114000 push <jmp.&MSVBVM60.__vbaExceptHa>
00632CDB 64:A1 00000000 mov eax,dword ptr fs:[0]
00632CE1 50 push eax
00632CE2 64:8925 0000000>mov dword ptr fs:[0],esp
00632CE9 81EC A8000000 sub esp,0A8
00632CEF 53 push ebx
00632CF0 56 push esi
这里是开头了,往下看:
00632D90 FF15 28104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaHresultCheckObj
00632D96 8B55 E8 mov edx,dword ptr ss:[ebp-18] ; 为用户名
00632D99 8B3D 84104000 mov edi,dword ptr ds:[<&MSVBVM60.>; MSVBVM60.__vbaStrCopy
00632D9F 8D4E 38 lea ecx,dword ptr ds:[esi+38]
00632DA2 FFD7 call edi
00632DA4 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
00632DA7 FF15 B4104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaFreeStr
00632DAD 8D45 DC lea eax,dword ptr ss:[ebp-24]
00632DB0 8D4D E0 lea ecx,dword ptr ss:[ebp-20]
00632DB3 50 push eax
00632DB4 51 push ecx
00632DB5 6A 02 push 2
00632DB7 FF15 1C104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaFreeObjList
00632DBD 8B56 38 mov edx,dword ptr ds:[esi+38]
00632DC0 83C4 0C add esp,0C
00632DC3 8D5E 50 lea ebx,dword ptr ds:[esi+50]
00632DC6 52 push edx
00632DC7 FF15 0C104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaLenBstr
00632DCD 50 push eax ; 用户名长度
00632DCE FF15 08104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaStrI4
00632DD4 8BD0 mov edx,eax ; 长度变成字符
这里比较可疑,在00632D90地址处按F2,下个断点,跟一下,发现了这地方取用户名,并取了用户名的长度值。继续往下:
00632DF7 8B0B mov ecx,dword ptr ds:[ebx]
00632DF9 83EC 08 sub esp,8
00632DFC DD1C24 fstp qword ptr ss:[esp]
00632DFF 51 push ecx
00632E00 FF15 78104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaR8Str
00632E06 83EC 08 sub esp,8
00632E09 DD1C24 fstp qword ptr ss:[esp]
00632E0C FF15 90104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaPowerR8
00632E12 DCC0 fadd st,st ; N的N次方
00632E14 83EC 08 sub esp,8 ; 结果再相加
00632E17 DFE0 fstsw ax
00632E19 A8 0D test al,0D
00632E1B 0F85 58020000 jnz 3.00633079
00632E21 DD1C24 fstp qword ptr ss:[esp]
00632E24 FF15 54104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaStrR8
00632E2A 8BD0 mov edx,eax ;
00632E2C 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
00632E2F FF15 A4104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaStrMove
00632E35 8BD0 mov edx,eax
00632E37 8D4E 3C lea ecx,dword ptr ds:[esi+3C]
00632E3A FFD7 call edi
00632E3C 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
00632E3F FF15 B4104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaFreeStr
00632E45 8B56 3C mov edx,dword ptr ds:[esi+3C]
00632E48 68 00000840 push 40080000
00632E4D 6A 00 push 0
00632E4F 52 push edx
00632E50 8D5E 44 lea ebx,dword ptr ds:[esi+44]
00632E53 FF15 78104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaR8Str
00632E59 83EC 08 sub esp,8
00632E5C DD1C24 fstp qword ptr ss:[esp]
00632E5F FF15 90104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaPowerR8
00632E65 DC0D C8104000 fmul qword ptr ds:[4010C8] ; 3次方后乘以314
00632E6B 83EC 08 sub esp,8
00632E6E DC25 C0104000 fsub qword ptr ds:[4010C0] ; 减159
00632E74 DFE0 fstsw ax
00632E76 A8 0D test al,0D
00632E78 0F85 FB010000 jnz 3.00633079
00632E7E DD1C24 fstp qword ptr ss:[esp]
00632E81 FF15 54104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaStrR8
00632E87 8BD0 mov edx,eax
00632E89 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
00632E8C FF15 A4104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaStrMove
00632E92 50 push eax
00632E93 68 80216300 push 3.00632180 ; UNICODE "maple-scg"
00632E98 FF15 24104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaStrCat
00632E9E 8BD0 mov edx,eax
00632EA0 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]
00632EA3 FF15 A4104000 call dword ptr ds:[<&MSVBVM60.__v>; MSVBVM60.__vbaStrMove
00632EA9 8BD0 mov edx,eax
00632EAB 8BCB mov ecx,ebx
上面这段就是算法部分了,经过跟踪分析,程序先取得用户名长度,变成浮点型,进行浮点运算。先:求用户名长度的长度次方(如果是3位,就是3的3次方),然后求得的结果再与结果相加求和,求得的和再进行3次方运算,结果再与314相乘,乘完后的积再减159,得到结果,转换成字符串,然后这个字符串后面加上“maple-scg”这个字符串当后缀,就是正确的注册码。
上面的一句话说的太长,举个例子来说,比如你输入的用户名长度为2为,先2的2次幂=4,接着4与4相加的=8,然后8的3次幂=512,512再乘以314=160768,160768再减159=160609,转换成字符串,然后加上“maple-scg”后缀,就是:160609maple-scg,这个就是注册码了。也就是你的用户名只要是2位的,不论输入什么,都是这个注册码。
注册码=str(((用户名长度^长度)*2)^3*314-159)+str("maple-scg")
算法很简单,注册机就不用了。
最后给个我自己的注册码:benbentaiyang 注册码:6.97927603067956E+46maple-scg
ok,收工。
--------------------------------------------------------------------------------
【经验总结】
用了浮点运算,虽然算法分析出来了,可是VB的浮点运算方式还没搞懂,传递浮点运算参数时好像通过堆栈,如果哪位弟兄
有有关VB浮点运算的详细资料,还望赐教。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年04月05日 12:16:29
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!