练习笔记之160Crackme-020
本帖最后由 xiaoyu2032 于 2022-6-2 12:26 编辑# 160CM-020
首先,拖入PE看一下。妈呀
妈呀~~居然有壳。对于只用过`UPX Unpacker`一键脱壳的菜鸟选手来说,表示有点方……
## 1. 脱壳
幸好最近逛论坛的时候看到好像有一偏关于脱壳的文章,名字叫“关于压缩壳脱壳步骤详解!看这一篇足够。”(<https://www.52pojie.cn/thread-1641368-1-1.html>),赶紧翻出来看看。想想宝典在手,终于可以手撕压缩壳了,内心忍不住有点小激动ing。
看看方法一:单步跟踪法,关键是我也不知道OEP长啥样啊,跟过去见到了也不认识啊,先pass了。
方法二:ESP定律法,这个看起来好像比较靠谱的样子。按文章描述的方法“pushad开头,F8一次以后,8个寄存器只有ESP是红色时候,就可以使用该定律。右键ESP 选择数据窗口跟随,数据窗口下硬件访问断点,F9运行,此时已经接近OEP。”
操作方法其实已经很简洁明了了,但是对于第一次手撕压缩壳的初哥来说,其实还是会碰到不少问题。先一步一步操作一下试试:
1. OD载入程序后,开头不是`pushad`,也没关系,按一下F8,注意观察OD右上角的寄存器中只有ESP的值是红色,如果还有其他是红色,继续F8。
2. 在ESP地址位置,右键,选中[数据窗口中跟随]。
3. 在数据区选中刚才跳转到的地址,右键选择[断点]→[硬件访问]→。
4. 按一下F9运行程序,直接来到了大跳转处。再按下F8,就到达程序OEP。这里的判断关键是大跳转,要跳的比较远的才算,至于F8以后见到的OEP长啥样,说实话好像啥样的都有。
5. 在OD中选中[插件]→→[脱壳在当前调试进程],进入脱壳界面,可以看到“入口地址修正值”为进入OEP后的地址(注意不要在大跳转的地址位置脱壳),直接点脱壳就完成了Dump。
6. 有些程序脱壳后可能无法正常运行,这就需要进行IAT修复了。打开`Import REConstructor`,在进程列表中选中需要修复程序的原始程序(运行一下脱壳前的程序,不要选OD打开的那个进程),先在OEP位置填入地址,这个地址是相对地址,要用OD中的OEP地址减去偏移地址400000。然后点击“autosearch”按钮,地址正确的话会显示找到了,然后点击“Get Imports”按钮,会在左边的列表中列出已经找到的信息,正常的话应该是全部YES的,如果有不是YES的,还要手动修复(没碰到过,还不会手动修复)。最后点击“Fix Dump”,在弹出的选择框中选中之前脱壳出来的程序,确定就可以了。
PS:OD中设置的硬件断点在Ctrl+F2后不会自动清除,需要在菜单[调试]→[硬件断点],去手动删除已设置的断点。
## 2. 爆破
运行脱壳后的程序,可以发现这个程序是要求输入序列号,然后点击按钮后会算出一个注册码,要求算出的注册码和界面上显示的一致。由于PE分析显示这是一个Delphi程序,因此IDR用上再说。
IDR分析后,我们找到按钮响应事件的地址是44A2E8,在下面可以找到关键跳转地址44A387,将代码nop掉就爆破完成了。
## 3. 算法分析
因为IDR能够识别出delphi库函数,因此我们将IDA生成的伪代码里面的函数都改一下名字,就能得到下面的代码了。
从代码中可以看出关键比较是`StrCmp`函数,V14看不来源,`IntToHex`函数的第二个参数也看不懂,这个需要查一下`IntToHex`函数的参数定义,第二个参数是指定转换后16进制字符串的最小长度。OD中跟踪一下就可以确定第二个参数是6,V14就是`IntToHex`生成的字符串。V7是转64为整型后的低32位,其实和V6是一样,其实整个算法就是输入的数字乘3后转成16进制字符串,然后与界面上显示的字符串比较。因此序列好就是界面显示的16进制数字除3对应的十进制数字。计算器算一下后输入,验证成功。
## 4. 总结
看了脱壳文章里面介绍的方法,尝试了一下,发现只会ESP定律这一招,其他的照葫芦画瓢都画不出来,下一篇打算先琢磨一下手撕压缩壳手法,尽量写一篇菜鸟也能看懂,也能照着完成的经验帖,避免一看就会,一试就废的囧境。 先标记一下,有时间细细研读,对破解感兴趣,无奈时间有限! 来学习啦 谢谢你的坚持学习一下了 谢谢分享! 确实是很容易学习的清晰步骤 学得费劲,谢了 MARK,收藏了,有时间分析分析 很有帮助的哦,我要学习一下 坚持学习一下了
页:
[1]