移动安全-Android APP 加固壳原理

一、前言

为了保护应用及代码的安全性,开发者出厂前会针对安卓 APP 进行加固处理,防范潜在风险。一般通过混淆代码、反调试、阻止反编译、保护内存、加密数据和验证签名等手段,其中代码混淆和加固最为常见。

代码混淆

代码混淆(Code Obfuscation):通过对应用程序的代码进行混淆,即重命名类、方法、变量等标识符,并添加无效代码或控制流程的改变,来增加逆向工程的难度。常见的代码混淆工具包括 ProGuard 和 DexGuard。

加壳

加壳:通过在 APK 文件的外层添加一层壳或保护层,来保护应用程序的代码和数据。这层壳可以包含各种安全措施和技术,如加密、反调试、防篡改、运行时解密等。它的作用是增加应用程序的安全性,防止逆向工程和破解行为。即使应用程序被反编译,只能看到外层壳的代码,而无法直接访问内部的关键代码和数据,从而提高了应用程序的安全性。


二、加固壳史

第一代加固壳

DEX加密(落地加载)

DEX 是 Dalvik Executable 的缩写,是 Android 操作系统中的一种可执行文件格式。它包含了应用的字节码指令,用于在 Dalvik 虚拟机中运行应用,Dalvik虚拟机将每个应用程序的字节码(编译后的.dex文件)转换为Dalvik可执行文件(.dex文件)。DEX 文件可以通过反编译工具被转换为 Java 代码,因此加密和保护 DEX 文件可以有效防止应用被反编译。常见加固手段如下:

  • Dex 字符串加密

    采用加密算法对 dex 的字符串进行加密处理,反编译后无法直接查看其代码。例:加密前代码为:String a = “This is a string!”; 加密后代码:String a = StringFog.decrypt(“ABCDEFGHIJKLMN”); 运行时代码::decrypt: “ABCDEFGHIJKLMN” => “This is a string!”。

  • 静态 DEX 文件整体加解密

    dex 文件整体加壳的基本原理是对 classes.dex 这个文件进行整体加密,将加密后得到的文件 存放在 apk 文件的资源文件中,并在App 运行时将加密后的 classes.dex 文件在内存中进行解密,再让 Dalvik 虚拟机动态加载解密后的原始 clases.dex 文件并执行。

  • 资源加密

    对 apk 解压后的资源文件进行加密处理,安卓资源文件一般指 res 和 assets 目录下的文件。例:资源加密后程序在读文件或者解压两个过程进行 hook,并对文件内容进行解密,就能达到资源保护的效果。例:将原资源文件 res/layout/activity_main.xml 命名为res/a/a.xml。

  • 反反编译

    通过添加反调试、反虚拟机等功能来对抗反编译工具。例如:Ptrace 反调试,使用 Ptrace 系统调用来监控调试器的行为,如果检测到调试器存在,则会终止应用的运行、TracePid 值校验反调试,通过校验 TracePid 值来判断是否被调试,如果不匹配则认为被调试。

  • 自定义 DexClassLoader

    使用自定义 DexClassLoader 对加密的 DEX 文件进行加载。这样可以在应用运行时动态加载和解密加密后的 DEX 文件。

  • 落地加载

​ 将应用的代码和资源打包成一个单独的文件,对 apk 解压后,文件夹内可看见相关 dex 文件。

脱壳工具

  • 内存 Dump 法

    1
    由于是dex整体保护,在内存中映射是整体连续的,通过定位起始地址将 app 完整脱下来。对于完整的 dex,采用暴力搜索 dex035 采用工具:FRIDA-DEXdump  项目地址:https://github.com/hluwa/FRIDA-DEXDump

第二代加固壳

dex抽取与加固

第二代加壳技术 对 DEX 文件整体进行了保护 , 将其中的 关键代码抽取到外部 , DEX 加载到内存中后 , 不是完整的 DEX 文件 , 即使将整个 DEX 文件 DUMP 下来之后 , 其中的一些被抽取出来的关键代码无法看到 , 也就是 DEX 文件中的关键类或方法是空的。第一代壳主要针对整个 APK 文件进行加密,第二代壳则对 Dex 文件进行整体加固。第二代壳通过将 Dex 代码加密到 native 层即 so 文件(so 文件是指动态链接库文件,它包含了一些可执行的函数和数据,可以被加载到内存中并被应用调用。so的路径在**/data/data/packagename/lib**, 或者/data/app/packagename/lib 相关目录下。),常见加固手段如下:

  • Dex动态加载

    DEX文件的加密和部分函数逻辑的抽取到SO文件中。加载器在运行时负责解密和加载DEX文件,并使应用程序能够动态执行其中的代码逻辑。

  • So加密

    针对 so 文件进行加密,so 文件通常包含了敏感的本地代码或函数实现,加密后程序将在运行时对 so 进行解密获取解密数据。

  • Dex method代码抽取到外部(通常企业版)

    将敏感的 Dex Method 代码从 DEX 文件中提取出来,并进行加密和混淆。

  • 不落地加载

    apk 目录下不能看到原始 dex,把加密的 dex 文件加载到内存中,然后解密,从始至终不会以文件形式存在。

  • 反调试,防 HOOK

  • 检测调试器、反调试技术、内存完整性检测、代码混淆和加密、防HOOK技术、签名校验。

脱壳工具

1
2
Dexhunter: https://github.com/zyq8709/DexHunter
elf-dump-fix:https://github.com/maiyao1988/elf-dump-fix

第三代加固壳

Dex 动态解密与 so 混淆

第三代壳在第二代壳的基础上继续改进,对抗 dump 内存脱壳。加深对 Dex 的加密。使用DEX动态加解密的应用程序来说,解密的过程是在运行时进行的,这意味着只有在需要执行特定的代码或方法时,相应的DEX部分才会被解密并加载到内存中,所以导致内存是不连续的无法直接 dump 完整的内存。常见加固手段如下:

  • Dex method代码动态解密

    将敏感的 Dex Method 代码在运行时进行解密加载到内存中,若没有执行到的 Method 代码则不进行解密并不释放到内存中去。

  • So 代码膨胀混淆

    通过增加无效的、冗余的代码和数据,使得应用程序的代码量变得庞大和复杂,从而增加了分析者阅读和理解代码的难度。

脱壳工具

1
dex2oat:https://github.com/spriteviki/Dex2oatHunter

第四代加固壳

VMP(虚拟机保护)

虚拟机保护技术。它通过在应用程序中引入自定义的虚拟机,将原始代码转换为虚拟指令,从而隐藏和保护应用程序的逻辑和算法。

脱壳方法

暂未探索到自动化工具进行自动化脱壳。

第五代加固壳

虚拟机源码保护(LLVM)

基于第四代方案的第一种方案(Java/Kotlin → C/C++),采用LLVM编译工具链(同时支持C/C++, Swift, Object-C),通过对IR进行指令转换,生成自定义指令集(IR → VM),APP内部隔离出独立的执行环境,将该核心代码放置在此独立的执行环境中运行

脱壳方法

暂未探索到自动化工具进行自动化脱壳。


三、壳识别

手机应用一键识别

MT管理器:https://mt2.cn/

image-20231207152604122

Windows 客户端

1
2
appmsg4.6.3(左):https://github.com/sulab999/AppMessenger
ApkScan-PKID(右):https://pan.baidu.com/s/1rDfsEvqQwhUmep1UBLUwSQ(注意:该工具为2018年版本)

image-20231207153148309

加固壳特征

厂商 特征 Java代码特征
360加固 assets/.appkey
assets/libjiagu.so
libjiagu_art.so
libjiagu_x86.so
libprotectClass.so
libjgdtc.so
libjgdtc_a64.so
libjgdtc_art.so
libjgdtc_x64.so
libjgdtc_x86.so
libjiagu_a64.so
libjiagu_ls.so
libjiagu_x64.so
libSafeManageService.so
libjiagu_vip_x64.so
libjiagu_vip.so
libX86Bridge.so
com.stub.StubApp
假360加固 com.qihoo.util.stub2678363137
APKProtect libAPKProtect.so
UU安全加固 assets/libuusafe.jar.so
assets/libuusafe.so
lib/armeabi/libuusafeempty.so
apktoolplus加固 assets/jiagu_data.bin
assets/sign.bin
lib/armeabi/libapktoolplus_jiagu.so
com.linchaolong.apktoolplus.jiagu.ProxyApplication
中国移动加固 assets/mogosec_classes
assets/mogosec_data
assets/mogosec_dexinfo
assets/mogosec_march
ibmogosecurity.so
lib/armeabi/libcmvmp.so
lib/armeabi/libmogosec_dex.so
lib/armeabi/libmogosec_sodecrypt.so
lib/armeabi/libmogosecurity.so
com.mogosec.AppMgr
几维安全 assets/dex.dat
lib/armeabi/kdpdata.so
lib/armeabi/libkdp.so
lib/armeabi/libkwscmm.so
libkwscr.so
libkwslinker.so
com.Kiwisec.KiwiSecApplication、com.Kiwisec.ProxyApplication
启明星辰 libvenSec.so
libvenustech.so
网秦加固 libnqshield.so
娜迦加固 libchaosvmp.so
libddog.so
libfdog.so
libhdog.so
娜迦加固(新版2022) assets/maindata/fake_classes.dex
lib/armeabi/libxloader.so
lib/armeabi-v7a/libxloader.so
lib/arm64-v8a/libxloader.so
libxloader.so
娜迦加固(开发者试用版-VMP) libvdog-x86.so
libvdog.so
娜迦加固(企业版) libedog.so
梆梆安全(企业版) libDexHelper-x86.so
libDexHelper.so
libDexHelper-x86_64.so
梆梆安全(定制版) assets/classes.jar
lib/armeabi/DexHelper.so
梆梆安全(免费版) assets/secData0.jar
lib/armeabi/libSecShell-x86.so
lib/armeabi/libSecShell.so
libSecShell_art.so
libSecShel1.so
libsecexe.so
libsecmain.so
libbangcle_crypto_tool.so
libpnc-crypto.so
com.secneo.apkwrapper.ApplicationWrapper、com.SecShell.SecShell.ApplicationWrapper、com.secneo.apkwrapper.AW
假梆梆加固 com.secoen.apkwrapper.ApplicationWrapper
海云安加固 assets/itse
lib/armeabi/libitsec.so
libitsec.so
c.b.c.b
爱加密 assets/af.bin
assets/ijm_lib/X86/libexec.so
assets/ijm_lib/armeabi/libexec.so
assets/signed.bin
ijiami.dat
lib/armeabi/libexecmain.so
libexecmain.so
libexecmain_x86.so
libexecoat.so
libexecoat_x86.so
libijm-emulator.so
s.h.e.l.l.S
爱加密企业版 assets/ijiami.ajm
爱加密3代壳 assets/ijiami3.ajm
libexecv3.so
爱加密5代壳 assets/IJMDal.Data
assets/libijmDataEncryption.so
libijmDataEncryption_arm64.so
libijmDataEncryption_x86.so
libijmDataEncryption_x86_64.so
珊瑚灵御 assets/libreincp.so
assets/libreincp_x86.so
com.coral.util.StubApplication
瑞星加固 librsprotect.so
百度加固 libbaiduprotect.so
assets/baiduprotect.jar
assets/baiduprotect1.jar
lib/armeabi/libbaiduprotect.so
libbaiduprotect_art.so
libbaiduprotect_x86.so
com.baidu.protect.StubApplication
盛大加固 libapssec.so
网易易盾 libnesec.so
腾讯加固 libexec.so
libshell.so
com.tencent.StubShell.TxAppEntry
腾讯乐固(旧版) libtup.so
lib/armeabi/mix.dex
liblegudb.so
libshella
lib/armeabi/mixz.dex
libshel1x
lib/armeabi/libshella-xxxx.so
lib/armeabi/libshellx-xxxx.so
tencent_stub
libshella-2.10.2.3.so
libshell.so
libshella-2.9.0.2
libshella-4.1.0.15.so
libshella-4.1.0.19.so
libshellx.so
com.tencent.StubShell.TxAppEntry
腾讯乐固(VMP) lib/arm64-v8a/libxgVipSecurity.so
lib/armeabi-v7a/libxgVipSecurity.so
libxgVipSecurity.so
腾讯云加固 assets/libshellx-super.2021.so
lib/armeabi/libshell-super.2019.so
lib/armeabi/libshell-super.2020.so
lib/armeabi/libshell-super.2021.so
lib/armeabi/libshell-super.2022.so
lib/armeabi/libshell-super.2023.so
tencent_sub
腾讯云移动应用安全 0000000lllll.dex
00000olllll.dex
000O00ll111l.dex
00O000ll111l.dex
0OO00l111l1l
o0oooOO0ooOo.dat
腾讯云移动应用安全(腾讯御安全) libBugly-yaq.so
libshell-super.2019.so
libshellx-super.2019.so
libzBugly-yaq.so
t86
tosprotection
tosversion
000000011111.dex
000000111111.dex
000001111111
00000o11111.dex
o0ooo000oo0o.dat
腾讯御安全 libtosprotection.armeabi-v7a.so
libtosprotection.armeabi.so
libtosprotection.x86.so
assets/libtosprotection.armeabi-v7a.so
assets/libtosprotection.armeabi.so
assets/libtosprotection.x86.so
assets/tosversion
lib/armeabi/libTmsdk-xxx-mfr.so
lib/armeabi/libtest.so
MyWrapperProxyApplication
腾讯Bugly lib/arm64-v8a/libBugly.so
libBugly.so
蛮犀加固 assets/mxsafe.config
assets/mxsafe.data
assets/mxsafe.jar
assets/mxsafe/arm64-v8a/libdSafeShell.so
assets/mxsafe/x86_64/libdSafeShell.so
libdSafeShell.so
通付盾 libNSaferOnly.so
libegis.so
libgeiri.so
libgeiri-x86.so
阿里加固 assets/armeabi/libzuma.so
aliprotect.dat
assets/armeabi/libfakejni.so
assets/libzuma.so
assets/libzumadata.so
assets/libpreverify1.so
libsgmain.so
libsgsecuritybody.so
libmobisec.so
阿里云加固 libdemolish.so
libdemolishdata.so
阿里聚安全 assets/armeabi/libfakejni.so
assets/libzumadata.so
assets/libpreverify1.so
aliprotect.dat
libdemolish.so
libfakejni.so
libmobisec.so
libsgmain.so
assets/libzuma.so
libzumadata.so
libdemolishdata.so
libpreverify1.so
libsgsecuritybody.so
顶像科技 libx3g.so
libjni.so
lib/armeabi/libx3g.so
cn.securitystack.stee.AppStub
DexProtect加固 assets/classes.dex.dat
dp.arm-v7.so.dat
dp.arm.so.dat
CFCA加固 libsecenh_a64.so
libsecenh_x86.so
my_classes.jar
libsecenh.so
libbasec.so
libbasec_x86.so
OPPO加固-oppo手机加固 OPPOProtect.so
OPPOProtect2019.so
OPPOProtect2020.so
OPPOProtect2021.so
OPPOProtect2022.so
OPPOProtect2023.so
OPPO加固-安全检测SDK libomesStdSco.so
jni/arm64-v8a/libomesStdSco.so
jni/armeabi-v7a/libomesStdSco.so
jni/x86/libomesStdSco.so
jni/x86_64/libomesStdSco.so
深盾安全加固(Virbox Protector) ibvirbox32.so
libvirbox64.so

特征找寻案例

APP 爱加密5代壳,将 .apk 修改为 .zip 然后进行解压,解压后 assets 发现爱加密5代壳特征,IJMDal.Data

image-20231207155612690

image-20231208100319417

通过查壳工具,亦能查询

![image-20231207153148309](E:\Security file\learning notes\images\image-20231207153148309-17080968561231.png)


四、脱壳方法及工具汇总

内存dump

1
FRIDA-DEXdump:https://github.com/hluwa/FRIDA-DEXDump

文件监视

1
inotifywait-for-Android :https://github.com/dstmath/inotifywait-for-Android

动态调试

1
IDA 资源地址:https://www.52pojie.cn/thread-1861590-1-1.html

内存重组

1
2
3
ZjDroid :https://github.com/halfkiss/ZjDroiddumpDex
dumpDex :https://github.com/WrBug/dumpDex
elfrebuild :https://github.com/ylcangel/ElfRebuild

dex2oat

1
Dex2oatHunter :https://github.com/spriteviki/Dex2oatHunte

定制系统

1
2
FART :https://github.com/hanbinglengyue/FART
BlackDex :https://github.com/CodingGay/BlackDex

攻击者可以通过自定义Android虚拟机,在解释器的代码上做记录一个函数的内容(CodeItem)。接下来遍历触发所有函数,从而获取到全部的函数内容。最终重新组装成一个完整的DEX文件

Hook

1
2
Xposed:https://github.com/ElderDrivers/EdXposed(非原 Xposed,原Xposed已停止更新)
FRIDA:https://github.com/frida/frida

六、参考

1
2
3
4
5
6
7
8
9
10
https://www.isisy.com/1420.html
https://zhuanlan.zhihu.com/p/550084508
https://github.com/moyuwa/ApkCheckPack/tree/main
https://blog.csdn.net/g5703129/article/details/85054405
http://www.wiki.yelbee.top/2020/04/30/%E5%8D%93%E6%8A%A4%E5%B9%B3%E5%8F%B0%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3/%E5%BA%94%E7%94%A8%E5%8A%A0%E5%9B%BA/4.1%E5%BA%94%E7%94%A8%E5%8A%A0%E5%9B%BA%E6%A6%82%E8%BF%B0/
https://bbs.kanxue.com/thread-274793.htm
https://cloud.tencent.com/developer/article/2284277
https://onejane.github.io/2021/02/21/%E5%8A%A0%E5%A3%B3%E4%B8%8E%E8%84%B1%E5%A3%B3%E4%B9%8B%E5%88%86%E7%B1%BB%E6%8A%80%E6%9C%AF/#%E7%AC%AC%E4%BA%8C%E4%BB%A3%E5%A3%B3-dex%E6%8A%BD%E5%8F%96%E4%B8%8E%E5%8A%A0%E5%9B%BA
https://dun.163.com/news/p/760c8c1ad4ee4349951646d85814264d
https://www.dingxiang-inc.com/blog/post/2