By Bob Pan 多线程
梆梆与爱加密都使用了将原有的dex隐藏, 在运行时解压, 而且经过修改app的类加载器的方式实现加固. 参考: AndoridAPK反逆向解决方案:梆梆加固原理探寻 app
然而, 无论如何隐藏dex, 最终在运行时都必须释放到内存, 因此本文的思路是从内存中找到解密后的dex文件, 进而获得加固前的apk. 编辑器
爱加密的app并无作反调试的保护. 打开app以后直接使用gdb链接, 而后用gcore, 产生core dump. 工具
使用ps查看pid 加密
使用gdb链接pid .net
使用gcore产生core dump 线程
将产生的core.1033复制回电脑, 并使用编辑器打开, 经过类名找到dex中string-data段, 而后经过查找’dex.035’能够找到多离string-data最近的个dex头. dex文件头偏移32的整形值就是dex的文件长度. 使用dd命令能够从内存中抠出dex. 调试
经过类名找string-data段 进程
找到最近的dex文件头(0x4f87a08)和dex文件大小0x07c0 内存
使用dd抠出dex
这个文件是个完整的dex文件, 而且能够被dexdump直接打印
梆梆加固的程序作了anti-ptrace, 表现为使用gdb --pid 链接不上对应的进程, 利用kernel-model打印ptrace的记录, 能够看出梆梆
l 使用了3个进程互相ptrace.
l 发送错误指令来检查ptrace是否被劫持(反回值是-3行, 尝试让1568进程继续执行, 可是1568并未被ptrace, 必须出错),
l 利用ptrace修改另外一个进程的数据(action是5的行).
ptrace系统调用的记录, 右边是ptrace的参数
虽然连不上1552, 可是dalvik是一个多线程的程序, 里面包含主进程, gc线程, binder线程等, 虽然咱们用gdb连不上主线程, 可是咱们能够连上其余线程, 这些线程的tid在/proc/[pid]/task/目录下.
Gdb链接任意一个tid
拿到coredump后与爱加密同样作相同的处理, 能够拿到dex.
爱加密和梆梆经过隐藏dex确实可让大部分静态分析工具找不到执行代码, 可是在动态运行的时候无可避免的须要将dex在内存中还原. 虽然梆梆作了反调试, 可是经过其余方式也一样能够获取其内存. 经过本文的方法分析其内存而后恢复dex, 更进一步能够彻底恢复原始apk. 从这个角度说, 爱加密和梆梆的加固形同虚设.