[文件标题]:一个神奇的CrackMe分析 [文章作者]:willJ [作者邮箱]:466684954@qq.com [软件名称]:Game.exe [下载地址]:附件 [运行环境]:Windows xp sp3 [使用工具]:OD,PEID [作者声明]:
只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
[详细过程]:
今天拿到一个CrackMe,觉得会很简单,就去玩玩咯,没有想到这么有趣,这里和52pojie的各位分享下吧。
老样子,先查壳。
是一个UPX的壳,这种壳还是很简单的,一个ESP应该可以脱的,不过很神奇的事情是我明明一个ESP到达了OEP,也脱下来了,就是跑不起来,修复也不行,但是我知道了是VC++写的。
算了,我们就带壳调吧,先用ESP到达OEP。我们先运行下看看是什么样的吧。
随便输入了一个key去试试手气,发现是这样的,于是我就想着下一个bp MessageBoxA。 继续跑起来,断在下面:
我们使用ALT+F9回到程序领空,在最上面下一个断点,继续输入123456789测试。
我们发现了那个弹出错误的对话框:
于是我尝试去绕过去。 我们让它不跳,否则就直接弹错误对话框了。
这里还有一个弹错误对话框的,我一样得跳过去呀。
要不我们直接nop了这个,跳过去。
于是绕过去了,我觉得可以爆破了,但是出现了下面的状况:什么都没有显示,连个框都没有弹,然后我深入的跟了这里,发现根本就不会出现什么弹正确的对话框的东西,看来世我分析错误了,然后我还是单步跟下看看吧。
发现了一个什么的字符串,上网搜了下Auto1t是一个脚本语言,我们继续跟下去。 走到41da03的时候,发现eax的变化,我在数据窗口跟随了下,这下出现不不可思议的东西了,里面居然是代码,我们将内存数据抓出来: 是不是感觉很乱,但是里面有关键的中文提示,于是我将关键代码整理出来: GUICreate ( " 我们来玩个游戏吧 ", 300, 90 ) $Input = GUICtrlCreateInput ( "在这里输入一个密码,输对了有惊喜喔~" , 25, 20, 250, 20) $Btn = GUICtrlCreateButton ( " 我要试试手气啦 " , 100, 50, 100, 20) $Str1 = "Ks;SMO*^4NowfweWdDfREWFRW" $Str2 = "Kkl#$2LKmKMUdkmdekmfMKMKO" $Str3 = "wwdad,d;,dkKn0wSW55DDds8d" $Str4 = "wer32sdfAuto1tf34#5OMM0ss" $In = GUICtrlRead ($Input) $Key = StringTrimRight(StringTrimLeft($Str1, 9), 13) $Key = $Key & StringMid($Str2, 12, 1) $Key = $Key & StringReplace(StringRight($Str3, 14), 'SW55DDds8d','') $s = StringSplit($Str4, "f") $Key = $Key & $s[2] If $In == $Key Then MsgBox ( 0 , " 你拿到key了喔 "," 厉害啊,这都被你猜中了!" ) EndIf MsgBox ( 0 , " 还差一点点啦 ", " 你没有猜中喔,别灰心,再来一次吧。" ) 我以为是Vb的代码,结果上网看了下vb好像没有这下api,对了,前面不是有一个auto1t么,于是我上网去查了下,果然是一个脚本语言。 下面看看这些函数的意思吧。 StringTrimLeft() 删除字符串中从左开始指定数量的字符。 StringTrimLeft(”字符串”,数量) StringTrimRight() 删除字符串中从右开始指定数量的字符 StringTrimRight(”字符串”,数量) StringMid() 取某个字符串的部分字符。 StringMid ( "字符串", 起始位置 [, 数量] ) StringRight() 返回字符串中从右开始指定数量的字符。 StringRight ( "字符串", 数量 ) StringReplace() 替换字符串中的指定子串。 StringReplace ( "字符串", "搜索串" 或 起始位置, "替换串" [, 数量 [, 区分大小写]] ) StringSplit() 以指定分隔符把字符串拆分成若干子串。 StringSplit ( "字符串", "分隔符" [, 标志 ] ) &符合是连接符号,不是相与,函数都解释了,那我们就可以把该输入的东西倒推出来了吧。 $Str1 = "Ks;SMO*^4NowfweWdDfREWFRW" $Str2 = "Kkl#$2LKmKMUdkmdekmfMKMKO" $Str3 = "wwdad,d;,dkKn0wSW55DDds8d" $Str4 = "wer32sdfAuto1tf34#5OMM0ss" $In = GUICtrlRead ($Input) $Key = StringTrimRight(StringTrimLeft($Str1, 9), 13) 这里Key为Now $Key = $Key & StringMid($Str2, 12, 1) 这里Key为NowU $Key = $Key & StringReplace(StringRight($Str3, 14), 'SW55DDds8d','') 这里Key为NowUKn0w $s = StringSplit($Str4, "f") 按f划分字符串 wer32sd Auto1t 34#5OMM0ss $Key = $Key & $s[2] 最后得到Key为NowUKn0wAuto1t 到这里这个CrackMe 分析结束了,总结下,现在我觉得这个exe 就是一个Auto1t 的解释器吧,这样它才能让释放在内存中的语句显示出来,这里也证明了为什么那里显示的全部都是错误的MessageBox,正确的弹框是在那个脚本语言中 ,还有个问题也可以明白了,为什么脱壳了就是跑不起来,多半由于脱壳后这个解释器就无法准确定位那些语句的原因吧。 或许这些可以用在病毒上面吧,Auto1t脚本确实比较强大呀,希望有了这次分析,在以后分析病毒上面有所帮助。 显示一张成功的图片吧,嘻嘻 附件: |