安全分析与研究
专注于全球恶意软件的分析与研究
前言
在经过几天的研究和之前脱壳学习的积淀,终于是把ACProtect系列的脱壳方法和IAT修复部分给搞定了,趁着研究有些成果,将整个脱壳和IAT修复过程做个记录,整理整理就有了本文的诞生。
ACProtect是个很老的加密壳了,现在也已经挂掉不再更新了,更多的是做研究脱壳的一个基础,经过深入研究和学习,让我对加壳概念有了更深入的理解,欢迎各位大佬一起讨论脱壳手法。
值得额外提一点的是,ACProtect壳是Delphi编写的,经过测试发现它对Delphi程序的支持是最好的,其他语言编写的程序经过ACProtect加壳后可能导致程序本身异常退出,这可能也是ACProtect没落的原因之一吧。
有些人可能会认为,ACProtect系列的脱壳机也有了,为啥还要研究啊?如果只是过来扯淡的,请绕道,我只是做脱壳研究,并不想扯皮。别人的东西始终是别人的,只有自己的东西才是自己的,好好体会这句话你就知道了。
脱壳技巧
首先来看一下原始delphi程序的oep情况,如下所示:
接下来讲一下两次断点法,也被称为内存断点。其原理是利用内存断点修改对应内存的访问权限,当程序执行的时候,由于内存的访问权限问题而出发异常被调试器捕获进而成功中断在对应的内存区域,这是我自己对内存断点的看法,欢迎大家讨论研究。
现在脱壳开始,第一次内存断点一般选择rsrc或者idata段,可以使用快捷键f2设置内存断点,然后shift F9让程序执行起来,如下所示:
当内存断点出发后,程序停留的位置,如下所示:
紧接着在code段设置第二个内存断点,同样的shift f9执行,如下所示:
接下来就是见证奇迹的时刻了~(bgm响起),对比之前原始的oep发现好像少了一部分,原来是存在stolen code,如下所示:
暂时先不管被偷取的oep,使用importrec先来看看IAT的情况,发现有很多无效,看样子应该是IAT被加密处理了,如下所示:
于是现在就面临着这样两个问题,一个是存在stolen code,另一个是IAT被加密保护了。当然是选择迎男而上了,不对,是迎难而上。
Stolen code
首先来看一看什么是Stolencode,不过之前从没有搞过,怎么入手呢?这个时候前人的研究就显得额外的有意义了。论坛一搜,一大堆关于ACProtect相关的资料,如下所示:
在这些众多的资料,找到了几份关于stolencode的,其中以wynney大佬针对ACProtect1.09版本的精华帖为例子。https://bbs.pediy.com/thread-30330.htm,其中使用了两种技术,一种是利用了CreateToolhelp32SnapshotAPI来进行反调试,另外一种是利用异常来实现。经过测试后,感觉利用异常来更稳定,可以符合ACProtect的多个版本。
首先设置od的异常属性,除了int3以外的,其他全选,如下所示:
首先程序入口点典型的可以esp定律,如下所示:
单步执行之后,这里为了好操作,在下方命令栏输入hr esp,如下所示:
将程序运行起来,会中断在一个int3断点附近,这时注意栈上的数据,这里栈顶是SHE异常处理链的指针,SE句柄,就是异常处理函数,如下所示:
通过SE句柄,定位到内存,设置内存访问断点,如下所示:
同样的使用shift f9,程序停留在这样的一个地方,如下所示:
在当前位置设置f2断点,并shift f9继续执行,中断在这样的地方,如下所示:
继续在当前位置继续设置f2断点,同样shift f9执行,停留在这个位置,如下所示:
最后取消两个f2断点,清除掉内存断点,在retn处f4,如下所示:
此时由于开始头部下了硬件断点,接下来运行后,就会停留在被抽取的代码位置处,如下所示:
这时就可以dump文件了,不过这个时候的oep却不能写这个位置,否则找不到对应的IAT信息,但是如果是通过修补oep数据的方式会导致程序出问题,所以最好是在这里dump文件,然后手动修复IAT即可。
到这里基本上关于ACProtect的stolen code部分就算结束了。
IAT加密处理
相比之前的stolen code,手动处理IAT加密才是真的难搞,其一有现成的importrec的修复插件,但是这插件怎么说呢,老容易卡死,就让我萌生了自己处理IAT的想法,其二是找了很久都没有找到相关IAT加密处理的资料。
通过google,终于还是找到了IAT加密处理的部分,不过这帖子是全英的,我看完之后还是有所感悟,终于还是通过各方面的调试成功破开了ACProtect的IAT加密部分。
修改od的调试选择,全部选择。
同样的还是先使用内存断点法进行rsrc段的解密,同时查看0x401000段,如下所示:
这应该就是IAT存储的位置了,随意选择一个,以0x4050d8为例子,设置内存写入断点,执行起来,如下所示:
这里就是IAT写入的关键点,经过多次调试发现,这部分代码还需要二次解密,如果这里下断点f2断点,之后是无法中断下来的,那么现在怎么办?通过我对acptotect1.09g、ACProtect1.32、ACProtect1.41以及ACProtect2.0四个版本的测试发现了一个通用的定位方法。
找到IAT写入关键点之后,往上找,找到第一次出现retn的地方,如下所示:
通过这个retn之后,单步缓慢执行,等待之后的代码解码。当你看到cmp eax和MessageBoxA做比较的时候,那么恭喜你,你已经找到了IAT加密的部分了,修改掉je跳转为jmp,不过这个地址可能需要做更改,具体该不该,看之后跳转的地址是不是lea eax开始,如果不是则不需要修改je的跳转地址,如果是则需要修改地址为lea eax地址下一条指令的地址,如下所示:
接下来的je就是整个IAT的magic jmp了,处理掉这个je,所有的IAT就不会被加密了,特征就是通过cmp [ebp address],0。不确定的话,可以看下是否是跳转到mov dword ptr ds:[edi],eax。如果是就表示这就是magic jmp跳转,如下所示:
这个时候,就可以放任程序跑起来了,毕竟我只是要一个完整的IAT信息而已,如下所示:
ok,全部有效,修复下文件,完美~。
分析总结
作为曾经对新手极具杀伤力壳,现如今却成为了练手的基本功,脱壳与加壳就如同加密与解密,彼此相辅相成,亦或是盾与矛的关系。从ACProtect中也学到了一些关于脱壳的心得,也是略有所成吧。有缘我们下次还会再见面。
ACProtect各个加壳版本的程序,我已经打包发布在看雪平台上了,大家有兴趣研究的可自行下载,链接https://bbs.pediy.com/thread-261702.htm。
读者感想
看了作者投稿给我的这篇文章,我仿佛又回到了十几年前的那个年代,从作者的文章,也仿佛也看到了曾经的自己,也是这样一步一步走过来的,只是当时没有现在这么丰富的资料可以查,大家为了研究一个东西,分析一个样本,调试一个漏洞,可以分析调试到晚上两三点,有些甚至一调就是一晚上,详细分析每一条指令与代码,其实二进制安全研究的核心就是调试(Debug),无Debug无二进制安全,很多重大的二进制安全漏洞都是通过Debug出来的,之前有人说没有你们这些做安全研究的,就不会有安全问题,然而所有的一切事物都是两面的,有黑即有白,本来大家的初心都只是为了研究安全,出于对未知事物的兴趣,想去弄明白某些事物的本质,或者想去了解一些与别人看到的不一样的东西,这也就是为啥早期的黑客大多数只是为了炫技,发现一些别人没有发现的东西,而且当时也没有太多的利益可图,慢慢地,随着市场的不断扩大,有一些人发现了商机,于是一些人为了利益,忘了初心,发现利用自己手上的一些安全技术可以快速致富,从而就有了第一批黑客团伙,专门从事各种黑产活动,而另外一批人没去做黑产,成了安全研究从业人员,从此安全的黑与白就开始了不断的较量。
安全在国内发展了二三十年,安全对抗的核心一直没有变过,现在安全圈里有一些不好的现象,似乎总是在追求一些新的东西,各种新的概念,新的名词层出不穷,好像不玩点新的东西就没有东西可搞的了,事实上现在安全行业真正有用的还是十年前的基础原理和技术,操作系统发展了几十年,也还是windows/linux/osx为主,大多数漏洞其实都是十年前很常见的一些漏洞,并不是什么新鲜玩意,漏洞的原理还是一样的,同样新的恶意软件使用的很多技术也是十年前的技术,然后一些黑客团队再加一些新的平台出现的新特性而已,研究事物的本质,把更多的时间和精力放在最基础的安全研究上,才是我们现在安全研究从业者真正需要关注的,而不是整天盲目追求一些新的东西,最后发展事实上这些新的东西其实并没多大用处,安全问题反而越来越多,真正需要关注的安全却没人关注了。
笔者曾写过一篇文章,详细介绍过,可以去参考一下
浅谈二进制漏洞研究与病毒研究
安全从业者与其天天在一些毫无意义的微信群里聊天,然后再盲目的追求各种炫技,毫无目的地去学习各种不同的新技术,不如踏踏实实去花时间研究一个最新的安全漏洞或一个最新的恶意样本,做好自己该做的事,深入去研究安全的某个领域,持续不断地一直深耕下去,可能你会发展的更好,一个人的时间和精力是有限的,努力把自己最善长的事做到极致,把眼前的事做好,人一辈子能把一个领域做到极限,你就已经很成功了。
俗话说活到老,学到老,但千万不要盲目地去学习,漫无目标的去学习只会浪费自己的时间,也不要今天搞搞这个,明天搞搞那个,今天觉得这个有意思,搞一下,明天又觉得那个挺有意思,搞一下,今天觉得这个钱途,明天觉得那个有钱途,什么都会,其实就是什么都不会,安全研究需要踏踏实实,一步一个脚印,不要想着去天天学习新花样,掌握了最核心的东西,未来不管你做什么,从事安全的哪个方向,都会事半功倍。
有人调侃,安全圈很善长造词,每年都会出现各种不同的新名词,各种不同的新概念,涌现各种不同的新技术,其实不管这些东西以什么形式出现,安全的核心,一直没变,现在不会变,以后也不会变,不管平台怎么发展,永远只是表现形式不同而已,本质核心永远是人与人的对抗,只要你弄明白黑客以什么方式来赚钱的,弄明白黑客的目的是什么,你就会了解安全最需要什么,客户遇到的最多的安全问题是什么,最需要什么,安全的价值在哪里。
现在不管是从国家层面,还是从企业层面,都越来越重视安全问题,这也是安全从业者的机会,加油吧,越努力,越幸运。
更多精彩的内容,可以去看笔者曾写过的这篇文章