首页
社区
课程
招聘
爱琴海的Crackeme算法分析
发表于: 2007-4-5 12:19 8644

爱琴海的Crackeme算法分析

2007-4-5 12:19
8644
【文章标题】: 爱琴海的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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
2
啊呀,被识破了,呵呵
我刚学VB几次课呢
现在正在准备做个更有意思点的,等你来玩哦
我们课很忙,今天下午总算有空了
不会让你们等太久的

对楼主表示钦佩
2007-4-5 13:07
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
也来学习一下,谢谢两位
2007-4-6 10:37
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
4
不错。动手试试大家
2007-4-6 19:44
0
游客
登录 | 注册 方可回帖
返回
//