一个神奇的CrackMe分析
[文件标题]:一个神奇的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 & $sIf $In == $Key ThenMsgBox ( 0 , " 你拿到key了喔 "," 厉害啊,这都被你猜中了!" )EndIfMsgBox ( 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划分字符串wer32sdAuto1t34#5OMM0ss$Key = $Key & $s最后得到Key为NowUKn0wAuto1t 到这里这个CrackMe分析结束了,总结下,现在我觉得这个exe就是一个Auto1t的解释器吧,这样它才能让释放在内存中的语句显示出来,这里也证明了为什么那里显示的全部都是错误的MessageBox,正确的弹框是在那个脚本语言中,还有个问题也可以明白了,为什么脱壳了就是跑不起来,多半由于脱壳后这个解释器就无法准确定位那些语句的原因吧。或许这些可以用在病毒上面吧,Auto1t脚本确实比较强大呀,希望有了这次分析,在以后分析病毒上面有所帮助。显示一张成功的图片吧,嘻嘻
附件:
学习了,{:301_992:} 谢谢分享,学习一下 Auto 以前遇到过,不过不喜欢这个 楼主真是太细心了,一般人真不会注意那么多{:1_932:} 谢谢分享 此篇文章 回复 a8987216 的帖子
我也是第一次接触,以后好好玩玩 回复 不苦小和尚 的帖子
运气,运气好看见了:loveliness: willJ 发表于 2011-12-27 21:21 static/image/common/back.gif
回复 不苦小和尚 的帖子
运气,运气好看见了
哈哈。willJ....肿么不早点发,早点发,我就可以早点把逆向300的KEY提交了。我就可以拿2等奖额呢! Kavia 发表于 2011-12-28 10:50 static/image/common/back.gif
哈哈。willJ....肿么不早点发,早点发,我就可以早点把逆向300的KEY提交了。我就可以拿2等奖额呢!
膜拜Kavia大牛
页:
[1]
2