移动安全-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 | Dexhunter: https://github.com/zyq8709/DexHunter |
第三代加固壳
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/
Windows 客户端
1 | appmsg4.6.3(左):https://github.com/sulab999/AppMessenger |
加固壳特征
厂商 | 特征 | 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-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 | ZjDroid :https://github.com/halfkiss/ZjDroiddumpDex |
dex2oat
1 | Dex2oatHunter :https://github.com/spriteviki/Dex2oatHunte |
定制系统
1 | FART :https://github.com/hanbinglengyue/FART |
攻击者可以通过自定义Android虚拟机,在解释器的代码上做记录一个函数的内容(CodeItem)。接下来遍历触发所有函数,从而获取到全部的函数内容。最终重新组装成一个完整的DEX文件
Hook
1 | Xposed:https://github.com/ElderDrivers/EdXposed(非原 Xposed,原Xposed已停止更新) |
六、参考
1 | https://www.isisy.com/1420.html |