面对这些加了“壳”的涉案APP,我们要进行分析,“脱壳”就成了一个绕不开的关键步骤。只有把壳去掉,我们才能看到应用内部的真实逻辑、存储数据等关键电子证据。
本篇文章,我们就来聊聊相关的几个核心问题,并将重点放在实战环节,通过使用Frida工具进行动态脱壳的详细操作演示,帮助大家在遇到类似情况时,能够有效地穿透加固保护层,顺利完成重要的电子数据提取和分析任务。
为何要进行Android应用加固?
Android应用因其平台特性和分发机制,面临着严峻的安全挑战,应用加固是提升应用防护能力的关键手段,主要原因包括:
1.先天易逆向
Android应用(APK)被反编译后,能较完整地还原出Java/Kotlin代码或Smali中间语言,这些代码包含丰富的高层语义信息(类名、方法名、变量名、控制流逻辑等),极大降低了攻击者理解核心业务逻辑和算法的门槛。
相较于传统PC程序,Android应用缺乏天然的二进制代码混淆保护。
2.核心风险与威胁
核心算法/逻辑窃取:攻击者通过逆向分析窃取应用的专有算法、商业策略、安全机制等。
恶意篡改与二次打包:在正版应用中注入恶意代码、广告SDK或后门,重新签名打包成“山寨应用”进行分发,窃取用户数据、盗取账号或进行欺诈。
敏感数据泄露:逆向分析可能暴露硬编码的密钥、API接口、服务器地址、用户隐私处理逻辑等敏感信息。漏洞利用:分析应用漏洞(如逻辑漏洞、输入验证缺陷)并开发利用程序,进行攻击。外挂/作弊程序开发:针对游戏或特定功能应用,分析协议或修改内存逻辑开发作弊工具。
3.加固的核心防护目标
增加逆向分析难度:通过混淆、加密、虚拟化等技术,使反编译后的代码难以阅读和理解(如混淆类/方法/变量名、加密字符串、打乱控制流)。
保护核心代码:防止关键算法、业务逻辑、敏感数据被直接窥探和窃取。
防止篡改与二次打包:通过完整性校验(校验签名、代码段、关键文件)、防重打包机制,确保应用在用户设备上运行的是未经篡改的原始版本。
抵御动态分析:集成反调试(检测调试器附加)、反注入(检测Frida/Xposed等Hook框架)、防内存Dump(破坏内存中DEX结构、运行时自修改)等技术,阻碍攻击者在运行时窃取解密后的代码或敏感数据。
满足合规要求:符合越来越严格的隐私保护法规(如对用户数据安全的要求)和平台安全标准。
为何需要进行脱壳?
尽管加固提供了保护,但在特定合法场景下,“脱壳”(即去除加固保护,还原出原始或可分析的DEX/So代码)成为必要:
1.安全研究与漏洞分析
恶意软件分析:大量恶意软件利用加固技术隐藏其真实意图和行为。安全研究人员必须脱壳才能深入分析恶意代码逻辑、提取攻击指标、制定检测和清除方案。
应用安全审计:白帽黑客或安全团队对自家或第三方应用进行渗透测试或代码审计时,需要穿透加固层,才能有效发现潜在的代码漏洞(如加密实现缺陷、逻辑漏洞、不安全API调用)或配置风险。
2.逆向工程与学习
技术研究:研究人员分析流行应用的架构设计、协议实现、性能优化技巧或特定功能的实现方式(在遵守法律和道德的前提下)。
兼容性调试:当加固应用在某些特定设备或系统版本上出现兼容性问题(如崩溃、闪退)时,开发/维护人员可能需要脱壳进行更底层的调试分析(在拥有合法权限的前提下)。
3.评估加固效果
开发者或安全厂商需要测试自身应用的加固方案是否足够健壮,验证其抵抗主流脱壳技术和逆向分析工具的能力,从而改进加固策略。
主流脱壳技术原理与方法
脱壳的核心思路是在应用运行时,捕获其解密后、加载到内存中的原始代码(DEX/So)。主要方法有:
1.内存Dump
原理:利用加固应用在运行时必然要将原始DEX/So解密并加载到内存中执行的特点。在内存中定位到解密后的完整或关键代码段,将其转储(Dump)到文件中。
工具和方法:
使用Frida工具动态插桩。编写JavaScript脚本,HookAndroid运行时关键函数(如`ClassLoader.loadClass`,`DexFile`相关API)或内存操作函数,在目标类/方法被加载或执行的瞬间,将对应的DEX或内存区域Dump出来。这是目前最流行、灵活度最高的方法。
Xposed模块/反射大师。通过Xposed框架Hook系统底层函数,拦截类加载过程或直接读取内存中的Dex文件结构,实现脱壳。
2.修改虚拟机/解释器插桩
原理:直接修改Android运行时环境(Dalvik/ART虚拟机)的源代码。在解释器执行每一条指令的地方插入监控代码,记录被执行的真实指令流。
方法:定制AOSP源码(Android开源项目是公开发布且可修改的Android源代码),在关键点(如`dalvik/vm/interp/`或ART解释器/JIT编译器相关代码)添加日志或Dump逻辑,刷入设备。
优势:非常底层,能有效对抗基于Hook检测的保护(因为检测代码本身也在被监控范围内),能处理运行时解密的加固。
3.静态分析(针对早期/弱壳)
原理:直接逆向分析加固壳本身,理解其解密算法和加载流程,编写解密脚本还原原始文件。
Firda工具简介
Frida是一款开源的动态插桩工具,可以插入一些代码到原生App的内存空间去动态地监视和修改其行为,支持Windows、Mac、Linux、Android或者iOS,从安卓层面来讲,可以实现`Java`层和`Native`层`Hook`操作。
一、Frida安装
(1)安装python环境。
(2)pip命令安装frida及fridatools。
pipinstallfrida==version
pipinstallfridatools==version
frida和fridatools的对应版本在官网地址https://github.com/frida/frida/releases可以看到。
(3)模拟器中安装fridaserver,fridaserver和frida版本需要对应,一般电脑是x86_64就选下载途中文件,其他内核选择相对应的。
(4)解压下载的压缩文件,将解压后文件使用adb推入模拟器/data/local/tmp文件夹中,赋予文件777权限。
adbpush本地文件地址/data/local/tmp
chmod777fridaserver
(5)运行fridaserver,进入/data/local/tmp中,./fridaserver。
cd/data/local/tmp
./fridaserver
使用“frida-ps-u”命令查看是否运行成功:
二、Frida基础知识
1.基础指令
fridapsU-查看当前手机运行的进程
fridapshelp-查看help指令
2.操作模式
3.注入模式与启动命令
spawn模式启动:
fridaUf进程名lhook.js
attach模式启动:
fridaU进程名lhook.js
4.基础语法
5.Hook框架模板
functionmain(){
Java.perform(function(){
hookTest1();
});
}
6.运行frida脚本
使用js脚本启动:
fridaUfcom.package.namelexploit.js
使用python脚本启动:
importfrida,sys
jscode="""
js脚本代码
"""
defon_message(message,data):
ifmessage['type']=='send':
print("[*]{0}".format(message['payload']))
else:
print(message)
process=frida.get_remote_device().attach('软件包名')
script=process.create_script(jscode)
script.on('message',on_message)
print('[*]HookStartRunning')
script.load()
sys.stdin.read()
Frida工具脱壳实战应用
一、Frida脱壳原理
1.加固后的APP启动时,加固程序解密加密的dex文件,解密后的dex被加载到内存执行,此时内存中的dex即APP源码。Android脱壳,就是要从内存提取这个解密后的dex文件。
2.实现脱壳的关键,是获取dex文件在内存中的起始地址与文件大小。Android系统libart.so库的提供了一个导出的OpenMemory函数用于加载dex文件。通过Hook该函数,可获取dex文件加载到内存时的起始地址,再根据dex文件格式计算得到文件头保存的dex文件的长度fileSize。
二、编写frida脱壳脚本
1.定位Hook函数地址
需提取设备libart.so,通过`nm`命令或IDAPro获取目标函数符号,查看OpenMemory的导出方法名。
2.编写Hook逻辑
Interceptor.attach(Module.findExportByName("libart.so","目标函数符号"),{
onEnter:function(args){
//1.获取DEX起始地址(args[1]对应OpenMemory的首参)
vardexStart=args[1];
//2.计算DEX大小:起始地址+0x20读取4字节整型
varsizeAddr=ptr(dexStart).add(0x20);
vardexSize=Memory.readInt(sizeAddr);
//3.内存转储为文件
vardexData=Memory.readByteArray(dexStart,dexSize);
varfile=newFile("/sdcard/unpack.dex","wb");
file.write(dexData);
file.close();
}
});
上面是一段编写frida脱壳脚本的核心代码示例,基于frida封装的脱壳工具有很多,目前比较流行的有fridadexdump、fridaunpack、Frida_Fart等。
fridadexdump使用
FridaDexDump是一款基于Frida框架开发的内存数据操作工具,主要用于在Android设备内存中提取Dex文件,能够脱去大部分的壳。
三、fridadexdump安装
1.首先,确保你已经安装了Python和frida。在cmd输入“pip3 install frida-dexdump”命令使用python安装。
2.安装完毕后,用“frida-dexdump --version”测试一下是否安装成功。出现下图,说明安装成功。
四、ridadexdump使用方法
1.在手机端,启动fridaserver,并启动需要脱壳的app。
2.在电脑端打开cmd,使用“frida-ps-U-a”命令查看app包名。
3.脱壳命令“frida-dexdump-U-f 包名”进行脱壳操作。
成功后会将脱壳的dex保存到本地,如上图圈出的地址。
我司不仅针对此类安卓APP分析有着丰富的经验,还对其他各类程序源码分析、软件动态分析、网页代码分析也有丰富的经验,欢迎有需求的客户咨询。
原文始发于微信公众号(网络安全与取证研究):安卓APP加固与脱壳-Firda工具脱壳实战
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论