梆梆脱壳分析1-所有线程抗gdb技术实现

转:http://blog.csdn.net/eewolf/article/details/44424765

对于目前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不完整;

9.      c2并monitor主进程的task目录,来判断是否有新的clone process或现有的已消亡,来更新monitor的select loop的fd集合。


爱加密也是使用类似方法来实现其功能。

另外,梆梆还hook了write方法,来阻止在进程内部将header为dex的magic code的内容写入磁盘。


eewolf原创,转载请注明。

你可能感兴趣的:(梆梆脱壳分析1-所有线程抗gdb技术实现)