Android逆向与安全——360 dex加固与脱壳

前言现在市面上对App的安全合规管控越来越严格了 , 也就要求了APP在上架之前一定要做合规检测和加固处理 。对APP就是加固的好处 , 可以提高APP的安全性 , 提高APP被逆向分析破解的门槛 , 同时通过加固保护可以提高过安全合规的检测 。
由于APP加固技术不断被攻破情况 , 因此加固技术也是不断在快速迭代的过程 。现在市面上的加固产品的还是比较多的 , 并且各个加固技术产品都有其各自优缺点 , 但是加固产品的所采用技术去有很多共性的地方 。下面就对加固和脱壳对抗方案做些梳理总结 。
Android 反编译的威胁

  • 逆向分析: 漏洞挖掘、协议分析
  • 二次打包: 盗版、破解、广告
保护方案
  • 代码混淆:JAVA代码、CC++带马甲、JShtml代码
  • 应用加固:DEX文件、SO文件、资源文件
APP构建过程中用到的工具
Android逆向与安全——360 dex加固与脱壳

文章插图
 
编译流程
  • java源码编译:通过javac将源码编译为.class文件
  • 多dex分包:脚本将类根据一定规则划分到主dex和从dex中 , 生成配置文件
  • proguard优化/混淆:对.class文件进行压缩、优化、混淆处理
  • 转化为dex文件:dxd8将.class文件转换为dex文件
DEX加固方案的演进
Android逆向与安全——360 dex加固与脱壳

文章插图
 
  • 动态加载:从服务器动态加载业务的DEX
  • DEX内存加载:模拟App启动的时候 , 将我们的壳、将业务DEX文件加载到内存中 , 然后通过一些处理方式 , 让DEX文件把Application启动起来 , 让应用认为和普通的启动方式是一样的 (缺点:DEX会暴露在内存中)
  • DEX指令抽取:把DEX文件中的一些方法的指令抽取出来 , 然后在内存中开辟一段区域 , 然后将我们内存加载的DEX解析到相应的方法指令偏移的地方 , 方法指令的偏移指向我们开辟的一段内存里面 。(缺点:不彻底)
  • 虚拟机加固:我们通过自己实现一套虚拟机 , 将DEX方法的指令抽取出来 , 在运行的时候 , 我们的虚拟机里面就运行被抽取的一段指令 。这样攻击者想要破解 , 首先必须要找到我们虚拟机的入口 , 将虚拟机整个逻辑还原出来 , 这样攻击成本相对比较高 (缺点:本身Android应用就运行在虚拟机里面 , 不论是Dalvik还是ART , 增加个虚拟机 , 就会增加一层对应用运行时代码的解释执行操作 , 那么解释执行的效率会大大下降)
  • JAVA2C:提升应用运行时的效率 , 我们的方法会转换为一层在Native(JNI)上实现的逻辑 , 最终通过JNI编译成so , 这样的话在本地执行 , 而不是在虚拟机执行 , 执行效率会大大提升 。
360加固与脱壳流程360整体加固classes.dex后的apk程序的特点 , 以超信1.1.4版本为例 。360加固以后 , 会在apk的assets文件的路径下增加两个文件libjiagu.so和libjiagu_x86.so以及修改原apk的AndroidManifest.xml文件的application标签增加两个元素 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
 360加固脱壳需要完成两个任务 , 一个任务是过掉360加固的反调试 , 另外一个是获取原apk的classes.dex文件 。下面写一下具体的脱壳步骤 , 完成这两个任务 。为了脱壳成功 , 在动态调试加固apk程序前 , 需要将android_server调试程序的名字修改一下 , 因为360加固会通过查询/proc/pid/cmdline文件获取程序的名称来对android_server、gdb、ltrace、strace调试器进行反调试 。
在动态调试加固apk程序的时候 , 需要在几个关键点函数 open、strtol、mmap、memcmp处下断点 , 后面具体的分析 。由于android系统是由linux系统修改而来 , 因此Android系统上很多的属性和Linux系统下的属性 。Linux下进程和线程的信息是保存在文件中的 , 因此要查询进程或者线程的信息必须通过open或者fopen等方式操作文件来完成 。
Android的so调试的步骤略过 , 已经在上面提到的4个函数处下断点 , 注意下断点的技巧 , 下断点的时候 , 要在一个函数的第1条指令和最后一条指令的地方下断点 。


推荐阅读