好友
阅读权限25
听众
最后登录1970-1-1
|
cndml
发表于 2019-10-1 15:58
本帖最后由 cndml 于 2019-10-1 16:03 编辑
闲来没事脱了几个64位的tmd壳,破解道路相当曲折,在此分享一下脱壳经验。
1、先说一下64位程序。对64位程序刚开始研究,了解的比较少,只说一下与脱壳有关的。相比32位程序,64位程序代码段不需要重定位,地址操作全部是相对引用。
2、tmd壳在64位程序上,不知道是破解版的原因,还是别的,加密强度相比32位有所降低,api虚拟不再像32程序散落在内存中,而是集中在壳段内,这给修复api带来不少麻烦。
3、具体程序就不发了,说一下自己脱壳修复的过程。调试器使用x64dbg,iat修复使用scaylla。
4、第一步寻找oep,我采用的是esp定位,由于tmd壳在调到oep的时候,会执行一个ret指令,而oep地址就保存在esp里,通过在esp-8下断点,然后判断当前指令的第一个字节是否是C2就可以判断是否到了oep,采用这个办法主要是X64DBG的脚本不是很强大,加之对指令了解不多。
5、第二步,修复加密的api,跟32位程序一样,64位程序三个系统dll会有部分api被vm加密,ff25 ff15被修改为e8XXXX90的形式,这个通过在api的地址下访问断点,可以跟踪到加密前的api函数,写个简单脚本记录一下api函数就可以了,到达oep后,把加密api函数地址恢复了就可以了。
6、修复e8 call,这个是任务比较艰巨的,由于64位程序vm后的api地址调用保存在壳段,这给恢复iat带来相当大的工作量。
7、首先模仿LCT-AT的方法,用脚本申请内存,自建一段程序遍历代码段,把所有e8 call保存下来,然后,一段一段的执行vm后的api,在ret返回的时候,判断是否是合法的系统api地址,是则保存,这里有个问题,需要根据返回地址在esp里的位置,判断是ff15 还是ff25,同时由于x64dbg的问题,脚本运行时间稍长就会导致调试器崩溃,只能恢复几十个api后,用hex把内存保存出来,免得前功尽弃,这个过程是相当熬人。
8、全部api恢复后,用x64dbg自带的dump插件或者用scaylla把程序dump出来,用scaylla恢复iat表,脱壳就基本成功了。
9、如果是dll程序,还需要重定位表,64位程序没有好的重定位工具,对tmd壳来说,不需要,跟踪壳解码过程可以找到完整的重定位表,直接dump出来就可以了,然后直接附在程序尾部即可。
10、这样脱壳的程序,运行没有问题,但是重新加壳会有问题,因为iat写在最后一个区段,重新用winlicense加壳的时候会提示文件头与winlciense不匹配,加壳后的程序不能正常运行。没有找到现成的工具,只好手动把iat表复制到IDAta段的尾部原来的iat位置,这个很好找,找个类似程序比较一下,发现一段有规律的乱码就是被改写后的iat位置,把iat表的地址手工改为新地址就可以了。
至此,一个tmd可就完美脱掉了。 |
免费评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 学习及教程|主题: 1131, 订阅: 1124
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|