申请会员ID:xsd220062
1、申请ID:xsd220062
2、个人邮箱:750378980@qq.com
3、一篇原创技术文章:
这篇拙文是我对happytown编写的CrackMe_0008的一些分析,废话不多直接进入正题。
Peid载入后显示的是Nothing found 区段显示的是upx0,upx1,upx2,有可能被加壳了。
Od载入后发现入口点一点不像upx的开头,估计被作者修改了开头。
用peid的深度扫描发现是delphi写的,心里窃喜,请出dede神器。找到btnCheckClick事件,od Ctrl+G来到00455338处,下断。F9运行程序,随意输入帐号,密码也随意。然后就是单步分析。
首先密码有个判断是否是12位
004553D3|.BA 0C000000 mov edx,0xC
004553D8|.8B45 F4 mov eax,
004553DB|.E8 54FBFFFF call CrackMe_.00454F34; 进入,应该是判断密码是否12位
004553E0|.803B 00 cmp byte ptr ds:,0x0
004553E3 0F84 73050000 je CrackMe_.0045595C
这里是真正密码的计算并且与输入的密码判断
004553EC|.50 push eax
004553ED|.B9 06000000 mov ecx,0x6
004553F2|.BA 01000000 mov edx,0x1
004553F7|.8B06 mov eax,dword ptr ds: 读出作者事先定义的const类型字符串的首地址
004553F9|.E8 76EFFAFF call CrackMe_.00404374取出字符串中的第n个,n为需要判断的密码字符第n个
004553FE|.8B45 F8 mov eax, 把字符的首地址给EAX
00455401|.E8 AEF8FFFF call CrackMe_.00454CB4计算字符的ASCII码累加结果放入EAX中,设为key1
00455406|.50 push eax
00455407|.8B45 FC mov eax,
0045540A|.E8 A5F8FFFF call CrackMe_.00454CB4计算帐号字符的ASCII码累加,设为key2
0045540F|.5A pop edx
00455410|.E8 47FAFFFF call CrackMe_.00454E5C之前计算的key1和key2做xor运算,结果为key3
00455415|.BA 0A000000 mov edx,0xA
0045541A|.E8 45FAFFFF call CrackMe_.00454E64key3除以0xA,余数为k
0045541F|.8D55 F0 lea edx,
00455422|.E8 F928FBFF call CrackMe_.00407D20k=k+0x30 ;
00455427|.8D45 EC lea eax,
0045542A|.50 push eax
0045542B|.B9 01000000 mov ecx,0x1
00455430|.BA 01000000 mov edx,0x1
00455435|.8B45 F4 mov eax,
00455438|.E8 37EFFAFF call CrackMe_.00404374取出密码的第n位字符的ascii码值
0045543D|.8B55 F0 mov edx,
00455440|.8B45 EC mov eax,
00455443|.E8 4CFBFFFF call CrackMe_.00454F94判断k与密码第n位字符的ascii码值是否相同,否则悲剧。
00455448|.803B 00 cmp byte ptr ds:,0x0
0045544B 0F84 0B050000 je CrackMe_.0045595C
后面的11次判断与上述类似,只是每次取的字符串都不相同,字符串如下
解释下,字符串就是第一次取ORACLE,第二次取BenQ。
"ORACLE-BenQ-HP-IBM-SIEMENS-CISCO SYSTEMS-intel-Sun-DELL-SYBASE-Maxtor-lenovo"
如果上面分析没看懂,可以看下面我对这个算法的总结(我知道我写得比较乱)
设const为所取字符,num为帐号,consult为结果
计算const的每个字符ascii码累加=x
计算num的每个字符ascii码累加=y
Xor x,y
x=x%0xA
x=x+0x30
x就是密码的第n位的ascii码
当然,判断还未结束
当判断完12位密码后,来到第13个判断
004558C9|.E8 DAF3FFFF call CrackMe_.00454CA8F7进入
004558CE|.3D FE010000 cmp eax,0x1FE
004558D3 0F85 83000000 jnz CrackMe_.0045595C
发现F7进入的函数只是取了一个值(0x1BA),于是在这个地址上下硬件写入断点,Ctrl+F2,F9多次运行,找到
00439BB8|.6A 14 push 14 /Flags= SWP_NOZORDER|SWP_NOACTIVATE
00439BBA|.8B45 08 mov eax, dword ptr |
00439BBD|.50 push eax Height
00439BBE|.8B45 0C mov eax, dword ptr ; |
00439BC1|.50 push eax Width
00439BC2|.57 push edi Y
00439BC3|.56 push esi X = 1A3 (419.)
00439BC4|.6A 00 push 0 InsertAfter = HWND_TOP
00439BC6|.8B83 80010000 mov eax, dword ptr ; |
00439BCC|.50 push eax hWnd
00439BCD|.E8 4ECBFCFF call <jmp.&user32.SetWindowPos> ; \SetWindowPos
Pushedi 也就是窗口的y坐标是0x1BA,所以,以此可以发现窗口坐标是否为0x1FE既是最后一个判断
未达到申请要求,可以关注论坛微信等待开放注册通知。http://bbs.pediy.com/showthread.php?t=184003 是你本人?
页:
[1]