转 Android平台上的脱壳技术

http://bbs.pediy.com/showthread.php?t=198778

我的博客:http://blog.csdn.net/eewolf

对于目前Android平台上的脱壳技术,方法有很多,但对于一名coder而言,如何实现那些“奇技淫巧”,对我而言更加有趣些。
对于梆梆,之前有文章讨论可以attach到其binder线程上,通过gcore、dd来dump内存中的dex。(当然,脱壳方法有很多,不一定非要用这种方法。)
但对于其最新版本,当使用gdb attach到主进程的任一线程上时,要么permission denied,要么会退出,本文章会对其实现机理进行一下分析。
eewolf原创,转载请注明。
1.      主进程fork子进程c1,c1 fork子进程c2;
2.      c1会ptrace attach到主进程的主线程与GC线程(其也会操作memory,所以需要用ptrace方法保护),这样当试图ptrace attach时,会有permission denied;
3.      主进程为了能让c1这个子进程跟踪,需要调用prctl,option为SET_DUMPABLE。但这个API比较危险,其效果与AndroidManifest文件中debuggable选项设为true等价。如果不调用这个api,子进程是不能trace父进程的;
4.      c1也会ptrace到c2进程,来对其进行保护;
5.      这个三个进程间彼此用pipe进行通信;
6.      c1会向主进程内存空间注入大约52字节的数据,应为密钥;
7.      之后c1进入pipe读阻塞sleep;
8.      c2使用inotify监控主进程的每个clone process的mem与pagemap,于是当gdb、dd试图dump内存时,mem的access事件被触发,三个进程集体退出,导致内存dump不完整;这边漏了一个,同时c2会不断打开主进程的各个status文件,看其tracerpid是否为0,非0则被attach,退出;
9.      c2并monitor主进程的task目录,来判断是否有新的clone process或现有的已消亡,来更新monitor的select loop的fd集合。

爱加密也是使用类似方法来实现其功能。
另外,梆梆还hook了write方法,来阻止在进程内部将header为dex的magic code的内容写入磁盘。

关于xmsg

技术面前人人平等.同时技术也不分高低贵贱.正所谓学无大小,达者为尊.
此条目发表在Android分类目录,贴了, 标签。将固定链接加入收藏夹。