非root环境运行Frida
Android逆向-非root环境运行Frida
原理
frida-gadet.so
注入APP
步骤
首先apktool
拆包:
1 | apktool d myapp.apk -o extractedFolder |
从GitHub下载对应版本的frida-gadget.so
,解压,放到拆包文件夹下的lib
文件夹内(根据架构放在相应文件夹下)。(注意前面要加lib
前缀)
然后需要修改bytecode,注入一个System.loadLibrary("frida-gadget")
类似的指令。(这里不用加lib
前缀)注入的位置最好放在APP初始化的时候,因此需要找到MainActivity。
具体而言,是一下汇编:
1 | const-string v0, "frida-gadget" |
然后需要添加网络权限申请:
1 | <uses-permission android:name="android.permission.INTERNET" /> |
重新打包:
1 | apktool b -o repackaged.apk out_dir/ |
再次签名:
1 | # if you dont have a keystore already, here's how to create one |
使用frida-gadget
APP如果正确执行,应该会打开TCP socket。在logcat看到信息:
1 | Frida: Listening on TCP port 27042 |
运行nestat
确认网络连接:
1 | shell@flo:/ $ netstat -ln |
然后注意进程pid找的应该是一个叫做Gadget
的进程而不是原本APP的包名。
1 | $ frida-ps -U |
然后就OK了
1 | frida -U Gadget |
缺点
- 需要向APK里添加文件
- 需要程序有至少一个native库
- 注入进去的库的加载顺序难以控制
- 因为需要重新打包,因而可能会被检测到
Objection
Objection
将上面的步骤打包成一个指令了,因此可以快速打包。
Patching Android Applications · sensepost/objection Wiki (github.com)
1 | objection patchapk --source app-release.apk |
LIEF
09 - How to use frida on a non-rooted device — LIEF Documentation (lief-project.github.io)
[翻译]在未root的设备上使用frida-外文翻译-看雪-安全社区|安全招聘|kanxue.com
主要原理是通过魔改ELF格式来篡改一个APK中的so库,让它连带加载frida-gadget.so
注入so
主要代码:
1 | import lief |
首先检查APP so库会连带加载的so:
1 | ❯ readelf -d ./libapp_BaiduMapApplib.so | grep NEEDED |
使用上面的脚本添加后:
1 | ❯ readelf -d ./libapp_BaiduMapApplib2.so | grep NEEDED |
可以看到上面第一行添加了新的依赖。
添加配置文件
Listing
:交互和frida-server
一样Script
:使用配置文件中指定的JS脚本进行交互ScriptDirectory
:和Script
一样,但可以指定多个应用和多个脚本
Listing
交互方式需要android.permission.INTERNET
权限。我们可以通过修改manifest
文件添加这个权限。不过,如果我们使用的是Script
这种交互方式就不需要这一权限。
下面尝试用Script
方式,首先创建一个配置文件:
1 | { |
这样的配置文件,会让Frida运行/data/local/tmp/myscript.js
这个脚本。
使用配置配置文件必须遵循两个条件:
- 文件必须和gadget库同名(例如:
libgadget.so
和libgadget.conf
) - 配置文件必须和gadget库位于同一目录中
第二条意味着APP会在/data/app/<pkg_name>/lib
目录里面寻找配置文件,同时因为Android包管理器在安装APP时会将带有.so
后缀的文件复制出来,所以需要在.conf
后面再添加一个.so
后缀。具体而言,规则是:
- 名字具有
lib
前缀 - 名字具有
.so
后缀 - 名字是
gdbserver
Frida 实现这些要求的源码如下。因此我们只需要给libgadget.conf
添加.so
后缀就行了。
1 | #if ANDROID |
最后,lib
文件结构如下:(以Telegram为例)
1 | $ tree lib |
优点
- 不需要root
- 不依赖frida-server
- 可用于绕过anti-frida
- 不需要修改
AndroidManifest.xml
和DEX文件
缺点
- 需要向APK里添加文件
- 需要程序有至少一个native库
- 注入进去的库的加载顺序不能控制
遇到的问题
无法重新打包(资源解析出错)
apktool
解包了之后,没法重新打包。主要是资源解析出错了。
解决方式:在解压的时候不解析资源文件。
1 | java -jar D:\Tools\Apktool2.8.1\apktool.jar -r d .\a.apk |
加入-r
或者-no-res
即可。之后打包就不会有错:
1 | java -jar D:\Tools\Apktool2.8.1\apktool.jar b -o .\b.apk .\a\ |
LSPatch
免Root使用Frida的一种简易方案 - 简书 (jianshu.com)
LSPosed/LSPatch: LSPatch: A non-root Xposed framework extending from LSPosed (github.com)
下载
0.5.1
Release 0.5.1 · LSPosed/LSPatch (github.com)
安装
直接安装manager.apk
即可。
Objection报错
诸多原因,比如aapt
没法确定主类等等。涉及到复杂APP,Objection
的自动化注入还是能力有限。
重打包检查
参考
Using Frida on Android without root · Yiannis Kozyrakis ~ blog
免Root使用Frida的一种简易方案 - 简书 (jianshu.com)
[原创]非root环境下frida持久化的两种方式及脚本-Android安全-看雪-安全社区|安全招聘|kanxue.com
sensepost/objection: 📱 objection - runtime mobile exploration (github.com)
[翻译]在未root的设备上使用frida-外文翻译-看雪-安全社区|安全招聘|kanxue.com
lief-project/tutorials: Materials for LIEF tutorials (github.com)
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/09/18/Android逆向-非root环境运行Frida/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!