新手论坛中的的一个CrackMe_0008的分析
2014-01-24 10:55
369 查看
这篇拙文是我对happytown编写的CrackMe_0008的一些分析,废话不多直接进入正题。
Peid载入后显示的是Nothingfound区段显示的是upx0,upx1,upx2,有可能被加壳了。
Od载入后发现入口点一点不像upx的开头,估计被作者修改了开头。
用peid的深度扫描发现是delphi写的,心里窃喜,请出dede神器。找到btnCheckClick事件,odCtrl+G来到00455338处,下断。F9运行程序,随意输入帐号,密码也随意。然后就是单步分析。
首先密码有个判断是否是12位
004553D3|.BA0C000000movedx,0xC
004553D8|.8B45F4moveax,[local.3]
004553DB|.E854FBFFFFcallCrackMe_.00454F34;进入,应该是判断密码是否12位
004553E0|.803B00cmpbyteptrds:[ebx],0x0
004553E30F8473050000jeCrackMe_.0045595C
这里是真正密码的计算并且与输入的密码判断
004553EC|.50pusheax
004553ED|.B906000000movecx,0x6
004553F2|.BA01000000movedx,0x1
004553F7|.8B06moveax,dwordptrds:[esi]读出作者事先定义的const类型字符串的首地址
004553F9|.E876EFFAFFcallCrackMe_.00404374取出字符串中的第n个,n为需要判断的密码字符第n个
004553FE|.8B45F8moveax,[local.2]把字符的首地址给EAX
00455401|.E8AEF8FFFFcallCrackMe_.00454CB4计算字符的ASCII码累加结果放入EAX中,设为key1
00455406|.50pusheax
00455407|.8B45FCmoveax,[local.1]
0045540A|.E8A5F8FFFFcallCrackMe_.00454CB4计算帐号字符的ASCII码累加,设为key2
0045540F|.5Apopedx
00455410|.E847FAFFFFcallCrackMe_.00454E5C之前计算的key1和key2做xor运算,结果为key3
00455415|.BA0A000000movedx,0xA
0045541A|.E845FAFFFFcallCrackMe_.00454E64key3除以0xA,余数为k
0045541F|.8D55F0leaedx,[local.4]
00455422|.E8F928FBFFcallCrackMe_.00407D20k=k+0x30;
00455427|.8D45ECleaeax,[local.5]
0045542A|.50pusheax
0045542B|.B901000000movecx,0x1
00455430|.BA01000000movedx,0x1
00455435|.8B45F4moveax,[local.3]
00455438|.E837EFFAFFcallCrackMe_.00404374取出密码的第n位字符的ascii码值
0045543D|.8B55F0movedx,[local.4]
00455440|.8B45ECmoveax,[local.5]
00455443|.E84CFBFFFFcallCrackMe_.00454F94判断k与密码第n位字符的ascii码值是否相同,否则悲剧。
00455448|.803B00cmpbyteptrds:[ebx],0x0
0045544B0F840B050000jeCrackMe_.0045595C
后面的11次判断与上述类似,只是每次取的字符串都不相同,字符串如下
解释下,字符串就是第一次取ORACLE,第二次取BenQ。
"ORACLE-BenQ-HP-IBM-SIEMENS-CISCOSYSTEMS-intel-Sun-DELL-SYBASE-Maxtor-lenovo"
如果上面分析没看懂,可以看下面我对这个算法的总结(我知道我写得比较乱)
设const为所取字符,num为帐号,consult为结果
计算const的每个字符ascii码累加=x
计算num的每个字符ascii码累加=y
Xorx,y
x=x%0xA
x=x+0x30
x就是密码的第n位的ascii码
当然,判断还未结束
当判断完12位密码后,来到第13个判断
004558C9|.E8DAF3FFFFcallCrackMe_.00454CA8F7进入
004558CE|.3DFE010000cmpeax,0x1FE
004558D30F8583000000jnzCrackMe_.0045595C
发现F7进入的函数只是取了一个值(0x1BA),于是在这个地址上下硬件写入断点,Ctrl+F2,F9多次运行,找到
00439BB8|.6A14push14/Flags=SWP_NOZORDER|SWP_NOACTIVATE
00439BBA|.8B4508moveax,dwordptr[ebp+8]|
00439BBD|.50pusheaxHeight
00439BBE|.8B450Cmoveax,dwordptr[ebp+C];|
00439BC1|.50pusheaxWidth
00439BC2|.57pushediY
00439BC3|.56pushesiX=1A3(419.)
00439BC4|.6A00push0InsertAfter=HWND_TOP
00439BC6|.8B8380010000moveax,dwordptr[ebx+180];|
00439BCC|.50pusheaxhWnd
00439BCD|.E84ECBFCFFcall<jmp.&user32.SetWindowPos>;\SetWindowPos
Pushedi也就是窗口的y坐标是0x1BA,所以,以此可以发现窗口坐标是否为0x1FE既是最后一个判断
这也就是本人所未能解决的问题,如何才能改变窗口y坐标到0x1FE,手动感觉有点难度虽然能不是不行,我想的是编程实现。我使用的是C语言,但是使用MoveWindow,SetWindowPos貌似都不行,如果有大神解决请一定告诉我,万分感谢。
以上就是小弟的分析,有不对的地方,请指出,谢谢
Peid载入后显示的是Nothingfound区段显示的是upx0,upx1,upx2,有可能被加壳了。
Od载入后发现入口点一点不像upx的开头,估计被作者修改了开头。
用peid的深度扫描发现是delphi写的,心里窃喜,请出dede神器。找到btnCheckClick事件,odCtrl+G来到00455338处,下断。F9运行程序,随意输入帐号,密码也随意。然后就是单步分析。
首先密码有个判断是否是12位
004553D3|.BA0C000000movedx,0xC
004553D8|.8B45F4moveax,[local.3]
004553DB|.E854FBFFFFcallCrackMe_.00454F34;进入,应该是判断密码是否12位
004553E0|.803B00cmpbyteptrds:[ebx],0x0
004553E30F8473050000jeCrackMe_.0045595C
这里是真正密码的计算并且与输入的密码判断
004553EC|.50pusheax
004553ED|.B906000000movecx,0x6
004553F2|.BA01000000movedx,0x1
004553F7|.8B06moveax,dwordptrds:[esi]读出作者事先定义的const类型字符串的首地址
004553F9|.E876EFFAFFcallCrackMe_.00404374取出字符串中的第n个,n为需要判断的密码字符第n个
004553FE|.8B45F8moveax,[local.2]把字符的首地址给EAX
00455401|.E8AEF8FFFFcallCrackMe_.00454CB4计算字符的ASCII码累加结果放入EAX中,设为key1
00455406|.50pusheax
00455407|.8B45FCmoveax,[local.1]
0045540A|.E8A5F8FFFFcallCrackMe_.00454CB4计算帐号字符的ASCII码累加,设为key2
0045540F|.5Apopedx
00455410|.E847FAFFFFcallCrackMe_.00454E5C之前计算的key1和key2做xor运算,结果为key3
00455415|.BA0A000000movedx,0xA
0045541A|.E845FAFFFFcallCrackMe_.00454E64key3除以0xA,余数为k
0045541F|.8D55F0leaedx,[local.4]
00455422|.E8F928FBFFcallCrackMe_.00407D20k=k+0x30;
00455427|.8D45ECleaeax,[local.5]
0045542A|.50pusheax
0045542B|.B901000000movecx,0x1
00455430|.BA01000000movedx,0x1
00455435|.8B45F4moveax,[local.3]
00455438|.E837EFFAFFcallCrackMe_.00404374取出密码的第n位字符的ascii码值
0045543D|.8B55F0movedx,[local.4]
00455440|.8B45ECmoveax,[local.5]
00455443|.E84CFBFFFFcallCrackMe_.00454F94判断k与密码第n位字符的ascii码值是否相同,否则悲剧。
00455448|.803B00cmpbyteptrds:[ebx],0x0
0045544B0F840B050000jeCrackMe_.0045595C
后面的11次判断与上述类似,只是每次取的字符串都不相同,字符串如下
解释下,字符串就是第一次取ORACLE,第二次取BenQ。
"ORACLE-BenQ-HP-IBM-SIEMENS-CISCOSYSTEMS-intel-Sun-DELL-SYBASE-Maxtor-lenovo"
如果上面分析没看懂,可以看下面我对这个算法的总结(我知道我写得比较乱)
设const为所取字符,num为帐号,consult为结果
计算const的每个字符ascii码累加=x
计算num的每个字符ascii码累加=y
Xorx,y
x=x%0xA
x=x+0x30
x就是密码的第n位的ascii码
当然,判断还未结束
当判断完12位密码后,来到第13个判断
004558C9|.E8DAF3FFFFcallCrackMe_.00454CA8F7进入
004558CE|.3DFE010000cmpeax,0x1FE
004558D30F8583000000jnzCrackMe_.0045595C
发现F7进入的函数只是取了一个值(0x1BA),于是在这个地址上下硬件写入断点,Ctrl+F2,F9多次运行,找到
00439BB8|.6A14push14/Flags=SWP_NOZORDER|SWP_NOACTIVATE
00439BBA|.8B4508moveax,dwordptr[ebp+8]|
00439BBD|.50pusheaxHeight
00439BBE|.8B450Cmoveax,dwordptr[ebp+C];|
00439BC1|.50pusheaxWidth
00439BC2|.57pushediY
00439BC3|.56pushesiX=1A3(419.)
00439BC4|.6A00push0InsertAfter=HWND_TOP
00439BC6|.8B8380010000moveax,dwordptr[ebx+180];|
00439BCC|.50pusheaxhWnd
00439BCD|.E84ECBFCFFcall<jmp.&user32.SetWindowPos>;\SetWindowPos
Pushedi也就是窗口的y坐标是0x1BA,所以,以此可以发现窗口坐标是否为0x1FE既是最后一个判断
这也就是本人所未能解决的问题,如何才能改变窗口y坐标到0x1FE,手动感觉有点难度虽然能不是不行,我想的是编程实现。我使用的是C语言,但是使用MoveWindow,SetWindowPos貌似都不行,如果有大神解决请一定告诉我,万分感谢。
以上就是小弟的分析,有不对的地方,请指出,谢谢
相关文章推荐
- 终于找到一个最适合新手的Crackme(算法分析+注册机)(转载)
- 一个用汇编写的crackme分析,隐藏函数调用方面做的很好,很喜欢这个CM
- 在论坛2位高手mm的基础上谈谈结构化异常处理SEH (理论+CrackMe例子分析)(发表于看雪,这里是做个收藏)
- 一个CrackMe的分析
- 一个含有crc32算法的CrackMe分析
- 一个简单的CrackMe分析
- 一个简单的CrackMe分析
- CrackMe技术等级自测3级一个CrackMe分析
- 分析一下CSDN论坛中一个比较字段值保留最大并删除其它的帖子
- 一个简单CrackMe分析+keyGen编写
- Ericky的一个crackme的分析
- 170608 逆向-CrackMe之018和一个简单的论坛CM
- 一个CrackMe核心代码的不完整分析
- 一个通过异常处理进行验证的crackme分析
- 一个新手如何系统的学习数据分析
- [转载] 分析Linux内核创建一个新进程的过程
- 动手DIY一个underscorejs库及underscorejs源码分析3
- Launcher里点击一个应用图标的内部流程分析
- 使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码
- 一个淘宝客劫持木马的分析