1. 加壳
apk的加壳:在程序外面再包裹一层代码,保护里面的代码不被非法修改或者反编译。
被保护的程序用加密算法加密,解密逻辑写在作为壳的APK中,实际执行的是被保护的程序。
大多是通过DexClassLoader或者隐藏的函数openDexFile将源dex(即被保护的app)加载进来,然后动态替换Application来启动源程序。跟Windows上传统的PE文件加壳有一定区别。
要破解传统的壳,需要跟踪控制流找到OEP,然后把源程序从内存中dump下来,重建输入表,最困难的就是要跟着外壳的控制流走,安全工程师为了加大破解难度,使用了很多技术来让破解者走得更艰难。安全工程师与破解者对抗的关键点就在寻找OEP的困难性上。
在Android平台上,正因为新兴的dex加壳技术不成熟,导致有些另类的脱壳方法可以绕过分析算法,直接将源程序dump下来。举个例子,安卓在4.0版本以后提供openDexFile这个函数来从内存中加载dex,所需要提供的参数是源dex在内存中的地址,所以只要对这个函数下断,然后从寄存器里找到内存地址,就能将解密后的源dex从内存中dump下来,直接对其反编译就能获得源代码了。更进一步,关于openDexFile这个函数,其实它与libdvm.so这个库有密不可分的关系,这个库里提供大量操作dex文件的函数,如果对这个库里的相关函数下断,然后从内存中暴力dump一大块内存区域,经常能直接将内存中的源dex给抓下来。
http://taoyuanxiaoqi.com/2015/01/12/apkshell1/
2.加密APK
APK实际是zip格式的压缩包,在压缩时将是否加密的位置为1。而android的包安装服务(PackageManagerService)在进行apk安装时并不关心这个加密位(暂时我们就这么叫它吧)可以进行正常的安装并且也不会影响apk的运行。但android 4.2.x版本及以后系统会拒绝这种加密apk的安装。
3.运行时修改字节码
http://my.oschina.net/u/2323218/blog/396203
dalvik虚拟机运行dex文件执行的字节码就存在method_ids区域里面,需要找到在优化后的odex文件中dex的偏移,以及感兴趣的字节码,来进行替换。
由于是在运行时修改的dalvik指令,这是进程的内存映射为只读的,所以需要调用mprotect函数将只读改为读写才能进行指令的修改。
问题:如果采用了禁止写指令区域(防止ROP或栈溢出攻击的措施)的保护措施,还可以成功吗?