app安卓加壳原理及常用脱壳方法介绍
文章目录
- app安卓加壳原理及常用脱壳方法介绍
-
- 前言
- 1 加壳
- 1.1 什么是加壳
- 1.2 加壳作用 main >> >> >>>>> main >> >> - 标题级别应统一使用标签,其中X为数字,表示标题的级别。 - 列表项之间应使用
- 标签进行包裹,以实现有序或无序列表的效果。
1 加壳
1.1 什么是加壳
加壳是一种在二进制程序中嵌入代码的技术,其目的是在运行时优先获取程序的控制权,并执行一系列额外操作。这种技术被广泛应用于病毒开发中,它通过对原始二进制文件进行加密、隐藏和混淆等手段来实现应用加固。
1.2 加壳作用
加壳程序的存在可以有效地阻止对程序进行反汇编分析,从而实现其隐秘目的。这种技术也经常被用于保护软件版权,以防止软件被破解。
1.3 加壳原理
市面上主要的加壳原理是将原Dex文件进行加密,然后将加密后的Dex文件与壳Dex文件重新打包,生成新的Dex文件。在安卓虚拟机加载时,会从壳Dex文件中的ProxyApplication类开始执行attachBaseContext方法和onCreate方法。而在这两个方法中,壳Dex文件会实现对原Dex文件的还原和加载操作,以确保虚拟机能够成功启动APP。
在这个过程中,涉及到三个角色:
1、加壳程序:将源程序加密为解壳数据,并组装解壳程序和解壳数据。 2、解壳程序:对解壳数据进行解密,并通过DexClassLoader动态加载运行。 3、源程序:包含需要进行加壳处理的被保护代码。
1.4 加壳后的利与弊
优势:
①、加强核心代码算法的保护,增加破解、盗版和二次打包的难度。
2、同时,它还能有效地减轻代码注入、动态调试和内存注入攻击的风险。
不足之处:
①、影响兼容性
②、影响程序运行效率
1.5 如何辨别是否加壳
目前分辨加壳主要有以下两种方法:
一、使用加固检测软件进行检测,例如:ApkScan-PKID。 二、使用代码查看工具查看apk的目录结构,例如:jadx。
使用ApkScan-PKID非常简单,只需将我们的Apk文件拖放到软件界面即可。以安居客-15.5.2为例。
2、对apk进行反编译,以查看其包结构。
在这里,你可以直接将apk文件拖入jadx工具中。通过它,你可以轻松查看包目录结构的简洁性,并且还能找到一些与加载原始Dex相关的方法。
2 脱壳
2.1 脱壳原理
与Java类似,Android的class也是通过Classloader的loadClass方法加载的。不同之处在于,每个class对象都有一个对应的dex对象属性,并与相应的dex文件关联起来。通过使用xposed,我们可以劫持loadClass方法,在loadClass方法调用完成后执行后置方法。这样我们就能获取被加载的class对象,并调用getDex方法来获取对应的dex文件引用。最后,将dex文件序列化为byte数据并写入自定义保存文件中,从而获得脱壳后的dex文件。
2.2 常用脱壳软件
以下是三种常用的脱壳软件:
以下是反射大师的使用方法及其相关环境要求: 1. 反射大师:需要搭建Xposed环境。 2. DumpDex:需要在真机下搭建Xposed环境并运行。 3. FRIDA-DEXDump:需要搭建Frida环境。 接下来将详细介绍反射大师的使用方法。
2.2.1 反射大师
以下是对下面这段话的改写: 介绍 -> 简介 请看下面的简介:
作为一位全能的文案编辑专家,我会对这段话进行改写。改写后的版本如下: 反射大师是一个强大的插件工具,专为在Xposed环境中使用而设计。它能够兼容市面上绝大多数加密壳,提供了出色的脱壳功能。
使用指南
一、手机或模拟器安装xposed环境二、安装反射大师,xposed内部勾选反射大师模块,重启模拟器三、打开反射大师选择目标app四、打开目标app进入到主界面五、选择当前ACTIVITY六、长按写出Dex约两秒后释放,然后点击确定七、dex文件可以直接拉到jadx查看源码
2.3 脱壳后分析
经过上一步的脱壳操作,我们获取到了多个dex文件,接下来这些dex文件我们可以直接一个一个拖入jadx进行分析,在jadx中可以直接看到其内部的java代码。但是这样对于我们而言太麻烦了,像上面安居客的例子,我们获得了 16个dex,假如我们一个一个拖进jadx中分析,将会耗费我们大量的精力,因此我们需要对这些dex文件进行二次加工,加工细分为以下两个方向:
一、使用jadx将多个dex合并为单个sources文件,然后通过IDE软件进行查看(对java层代码进行静态分析)。 二、使用baksmali.jar将多个dex转换为smali代码,并结合apktool获取项目文件。在替换相关的smali文件后,可用于动态调试。
2.3.1 Dex2Java
前期准备
1、jadx文件
jadx文件我们可以通过直接在github项目中下载,如图下载最新版本的jadx-x.x.x.zip,解压后的bin目录中即可看到
2、Dex2Java转换脚本
这个脚本的目的是将多个dex文件合并成一个sources文件。
自编写如下:
Dex2Java.py
import os, sys if __name__ == __main__: if len(sys.argv)
详细应用
1、通过2.2.1章节我们使用反射大师获取了多个dex文件,我们将Dex2Java.py放入这些dex文件的同一个文件夹中
2、该目录下执行Dex2Java.py并传入jadx的绝对路径,我这里为
C:\Users\admin\Desktop\jadx\bin\jadx
Dex2Java.py C:\Users\admin\Desktop\jadx\bin\jadx
3、执行完毕后,相同目录下将会得到一个sources文件夹,该文件夹能直接用IDE工具打开查看其java代码
2.3.2 Dex2Smali
前期准备
1、apktool
您可以使用apktool将apk文件反编译为项目文件。下载地址:https://www.pcsoft.com.cn/soft/57847.html
2、baksmali.jar文件
请下载basksmali.jar文件,该文件可用于将dex文件转换为smali代码。下载地址:https://bitbucket.org/JesusFreke/smali/downloads/
三、Dex2Smali脚本
这个脚本的功能是将dex文件转换为smali代码。
自编写如下:
Dex2Smali.py
```python import os, sys if __name__ == __main__: if len(sys.argv)
详细应用
1、通过2.2.1章节我们使用反射大师获取了多个dex文件,我们将Dex2Smali.py放入这些dex文件的同一个文件夹中
2、该目录下执行Dex2Smali.py并传入baksmali.jar的绝对路径,我这里为
E:\mobileAppCrawler\dump\安居客dump\dump\baksmali.jar
Dex2Smali.py E:\mobileAppCrawler\dump\安居客dump\dump\baksmali.jar
3、执行完毕后得到多个classes文件
第四步,运用apktool对目标apk进行反编译,从而获得与apk同名的项目文件夹。
在cmd中执行以下命令,将apk文件拖放到apktool脚本所在的文件夹中。
apktool -r d anjuke.apk -only-main-classes
5、进入同名项目文件夹中可以看到存在多个classes文件,我们将其删除,然后将执行Dex2Smali.py脚本后得到多个classes文件复制到该文件夹中6、使用
Android Studio
打开该项目文件,可以查看smali以及动态调试最后,如果对于app的动态调试有任何疑问,可以参考这篇文章:https://blog.csdn.net/weixin_43900244/article/details/114007059。阅读本文后,建议从第2.2章节开始深入了解。
3 总结
最后总结一下,目前遇到的加壳技术仍停留在第一代壳阶段(即dex加密)。现如今,一些应用程序已经开始采用二、三代壳来增加代码解密和调试的难度。因此,常见的脱壳手段将逐渐被淘汰。如果遇到问题,建议多去吾爱破解和看雪上的帖子寻找答案~
- 和
还木有评论哦,快来抢沙发吧~