安卓加固脱壳
AIDL 本质上是一种描述语言,用于定义客户端和服务端之间进行通信的接口。通过 AIDL 定义的接口,一个 Android 应用中的不同进程(例如一个应用中的主进程和后台服务进程)可以相互调用对方提供的方法,就像调用本地方法一样。
侦查壳
MT管理器
在MT管理器中/DATA/apk 找到对应app的apk,点击即可。
加固方案
-
反模拟器
模拟器运行apk,可以用模拟器监控到apk的各种行为,所以在实际的加固apk运行中,一旦发现模拟器在运行该APK,就停止核心代码的运行。 -
虚拟机保护
代码虚拟化在桌面平台应用保护中已经是非常的常见了,主要的思路是自建一个虚拟执行引擎,然后把原生的可执行代码转换成自定义的指令进行虚拟执行。 -
加密
样本的部分可执行代码是以压缩或者加密的形式存在的,比如,被保护过的代码被切割成多个小段,前面的一段代码先把后面的代码片段在内存中解密,然后再去执行解密之后的代码,如此一块块的迭代执行。
加固流程

将源apk拆分,将dex文件进行加密,然后和壳进行合并成新的dex,再与原来的apk合并成新的apk,进行签名。
通过 apkbuilder 工具打包成 Android Package(.apk)文件。

apk->解压缩->加密dex文件->转换为byte数组并加密->写回到源dex文件
arr解压->jar->把jar打包为dex壳文件
混合打包签名。
解密过程

AndroidManifest.xml
所有的加壳在解密时,都会替换掉AndroidManifest.xml中的第一入口,只有替换掉第一入口之后软件才能正常运行加载dex文件。
所以我们的目的就是找到第一入口,通常第一入口可以在加壳的dex文件中找到,我们可以通过MT管理器在常量中寻找,如果找不到需要考虑是否使用了加密,此时我们可以借助算法助手工具,进行hook。
Dex文件构造

struct header_item
{
ubyte[8] magic;
uint checksum;
ubyte[20] siganature;
uint file_size;
uint header_size;
uint endian_tag;
uint link_size;
uint link_off;
uint map_off;
uint string_ids_size;
uint string_ids_off;
uint type_ids_size;
uint type_ids_off;
uint proto_ids_size;
uint proto_ids_off;
uint method_ids_size;
uint method_ids_off;
uint class_defs_size;
uint class_defs_off;
uint data_size;
uint data_off;
};
| address | name | size / byte | value |
|---|---|---|---|
| 0 | Magic[8] | 8 | 0x6465 780a 3033 3500 |
| 8 | checksum | 4 | 0xc136 5e17 |
| C | Signature[20] | 20 | |
| 20 | file_size | 4 | 0x02e4 |
| 24 | header_size | 4 | 0x70 |
| 28 | endan_tag | 4 | 0x12345678 |
| 2C | link_size | 4 | 0x00 |
| 30 | link_off | 4 | 0x00 |
| 34 | map_off | 4 | 0x0244 |
| 38 | string_ids_size | 4 | 0x0e |
| 3C | string_ids_off | 4 | 0x70 |
| 40 | type_ids_size | 4 | 0x07 |
| 44 | type_ids_off | 4 | 0xa8 |
| 48 | proto_ids_size | 4 | 0x03 |
| 4C | proto_ids_off | 4 | 0xc4 |
apk打包流程

aapt(Android Asset Packaging Tool,安卓资源打包工具)
它会进行资源索引生成,扫描并处理应用程序中的所有资源文件,比如布局文件(.xml)、图片、字符串等 ,将这些资源进行编译、压缩等处理,并为每个资源生成唯一的标识符,最终生成 R.java 文件。在代码中可以通过 R 类来引用这些资源,例如 R.drawable.icon 引用图标资源 、R.string.app_name 引用字符串资源等。
资源打包:将处理后的资源文件打包到 APK 文件中合适的位置。
处理 AndroidManifest.xml 文件,这是安卓应用的配置文件,包含了应用的组件信息(如 Activity、Service 等)、权限声明等重要信息。aapt 会验证 AndroidManifest.xml 文件的正确性,并将其编译后打包进 APK 中 。
AIDL(Android Interface Definition Language,安卓接口定义语言)
AIDL 本质上是一种描述语言,用于定义客户端和服务端之间进行通信的接口。通过 AIDL 定义的接口,一个 Android 应用中的不同进程(例如一个应用中的主进程和后台服务进程)可以相互调用对方提供的方法,就像调用本地方法一样。
apkbuilder
通过 apkbuilder 工具打包成 Android Package(.apk)文件。
脱壳工具教程
脱壳工具
首先启动脱壳工具,打开需要脱壳的app
脱壳的文件输出到/storage/emulated/0/_DexOutput
将bin文件重命名为classes.dex文件
沙盒脱壳
导入apk运行后自动脱壳到/storage/emulated/0/cloudInject/dexDump
去卡密系列
基础一
MT去签名

功能->去除签名校验->确定->安装
点击apk->查看->Dex编辑器+±>全选
常量搜索关键字,搜索到关键字后,点击关键字在弹出的窗口点击搜索,然后点击搜索到的结果
进阶一
脱壳工具脱壳
正常流程,无额外收获
注意此工具可能导致游戏无法打开,可以先启动游戏再安装工具打开。
hook入口
打开lsposed->模块->算法助手->启动模块,勾选需要hook的目标程序。
选择AES加密,打开应用,查看日志。
发现有一个像是入口的,但它是application:android.app.Application,是系统入口,显然不是我们想要找的第一入口。如果不在第一入口,只能一定在第二入口。
由于没有第一入口,我们直接找到app的安装包,修改它的AndroidManifest.xml文件,查看里面的dex文件(壳的dex文件),发现类名com.beingyi.encrypt,这就是调用的解密壳。
<application
android:name=“com.beingyi.encrypt” //删除掉这一行,
后续直接把dump下来的已经解密的dex文件,使用mt管理器修复后直接拖入apk替换掉原来壳dex文件即可。
hook检验
算法助手->打开hook监听


复制回调类:使用mt管理器打开dex文件,搜索这个回调类
修改代码后,退出保存,就会自动签名。进行安装就好。
一、签名和签名校验
-
Android目前支持四种签名方案
- v1方案:基于JAR签名
- v2方案:
- v3方案
- v4方案:
-
签名文件
-
签名文件主要在META-INF目录下的三个文件,MANIFEST.MF,ANDROID.SF,ANDROID.RSA,都是v1签名产物。
- MANIFEST.MF:是摘要文件。程序遍历Apk包中所有的文件(entry),对非文件夹非签名的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。

- MANIFEST.MF:是摘要文件。程序遍历Apk包中所有的文件(entry),对非文件夹非签名的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。
-
ABDROID.SF:这是对MANIFEST.MF的签名文件,使用SHA1-RSA,用开发者的私钥签名,在安装时,只有公钥能解密它。揭秘后与未加密的MANIFEST.MF文件进行对比。
-
-
签名校验
- 一般来说,普通签名校验会导致软件闪退等问题。部分可能会执行
rm -rf/ - 三角检测:so检测dex,动态加载的dex(软件运行时解压释放的一段dex,检测玩后就删除)检测so,dex检测动态加载的dex。
- 普通检测:普通签名检测、校验Application、校验PM代理、新的API校验、CRC校验、hash校验、so签名校验
- 当没有通过校验时,可能执行以下函数退出程序
- 一般来说,普通签名校验会导致软件闪退等问题。部分可能会执行
system.exit ---杀死整个进程,清理资源
finish ---仅仅针对Activity,且仅将应用推向后台,不清理资源。
二、过检测
思路
- 方法一:核心破解插件,不签名安装应用
- 方法二:一键签名工具,例如MT,NP,ARMPro,CNFIX,Modex去除签名功能
- 方法三:具体分析签名校验逻辑(手撕签名校验)
- 方法四:io重定向–VA&SVC:ptrace+seccomp
算法助手
- 算法助手拦截exit


- 算法助手读取应用签名监听



IO重定向
-
IO重定向的作用
- 可以让文件只读,不可写
- 禁止访问文件
- 路径替换
-
具体实现
- 过签名检测(让程序读取原apk来过检测)
- 风控对抗(记录App启动的次数,我们可以重定向到别的地方,让它读取我们想让它读取的次数)
- 过Root检测,Xposed检测(让某些文件变得不可读,这样就检测不到)
重定向过检测
get-object p10, Lcom/zj/wuaipojie/util/ContextUtils;->INSTANCE:Lcom/zj/wuaipojie/util/ContextUtils;
invoke-virtual {p10}, Lcom/zj/wuaipojie/util/ContextUtils;->getContext()Landroid/content/Context;
move-result-object p10
invoke-static {p10}, Lcom/zj/wuaipojie/util/SecurityUtil;->hook(Landroid/content/Context;)V
网易易盾是国内领先的数字内容风控服务商,依托网易二十余年的先进技术和一线实践经验沉淀,为客户提供专业可靠的安全服务,涵盖内容安全、业务安全、应用安全、安全专家服务四大领域,全方位保障客户业务合规、稳健和安全运营。
更多推荐


所有评论(0)