前言“元旦佳节,难得有闲情逸致。品一杯香茗,看 IDA中的汇编代码。”虽说是迟到的祝福,但这里还是先祝各位朋友元旦快乐,愿大家的技术蒸蒸日上,身体棒,棒,棒!在逆向这条荆棘密布的道路上,难免遇到各种各样的困难,有的甚至是看似不可逾越的鸿沟。但话又说回来,其实逆向这个领域,很多技术是相通的,思维方式更是相通的。 网上的资料并不少,教程和文章都很多,少的就是大家对一些新问题的思考,对一些知识的灵活运用和融会贯通。今天就用这样的方式来脱一下某公司的so壳。论证一下融会贯通在逆向领域甚至说在“这个稀少方向”的重要性。
初探加壳so一般来说,我们从java层入手,在跟踪某一个关键函数或者一个关键变量的时候,会跟到一个native的函数里,这个时候就需要进入深邃的so。或许很多人会害怕so加壳,觉得那么遥不可及。我们来揭开加壳后so的神秘面纱,让大家对so加壳不再畏惧。 打开IDA定位到关键函数后: 如图,指令都被抹掉了,关键的函数完完全全被“清空”。 其他函数也一并被清空: 卸下加壳so的外衣尽管IDA加载的so里面的指令都被清空了,但是有一条不变的宗旨。那就是这些代码在执行之前肯定要解密的,解密的时候那就肯定在内存中,既然在内存中,我们就可以把它拿出来。 在关键函数段首下好断点: IDA附加程序,出现same则点击same对话框。接下来需要让程序断在我们的断点处,代码已经解密出来了: 接下来用Ctrl+S 来定位一下该so在内存中的位置,用以下IDC脚本dump出来即可: [Asm] 纯文本查看 复制代码 auto fp, SoAddress;
fp = fopen("D:\\unpack.so", "wb");
for ( SoAddress=0x51F6546C; SoAddress< 0x51F6B7B8; SoAddress++ )
fputc(Byte(SoAddress), fp); 脱壳前后对比
左边为加壳后的指令,都被抹去 右边为脱壳后的指令,全部恢复 总结希望通过对这篇文章阅读,你已经对so不再恐惧了。有所思考的读者,肯定会发现,这和脱dex很相似,是的,这就是脱dex的方法在脱so壳上的再利用。很多人遇到问题就百度,就google,百度和google没有的话他就不知所措了,或者说是一直在等他人分享的工具,在这样的心理下,形成了不容易使得他自身技术进步的一种思维方式。我还是想说,很多技术其实网上都有资料,稍微变形或者换了一个新东西很多人就懵了(最近还有人问支付宝内购的问题,论坛里有大量的资料了),所以说,对知识学习的融会贯通的程度决定了我们能走多远,另外一方面,我们缺的不是资料,缺的是思考,缺的是一个思维定式里的突破。最后希望大家能把学的知识融会贯通,也再次祝大家2016年有新的收获! (*^__^*) PS:附件附上脱壳前后so。 2016.1.2 By Ericky
|