Frida 脚本用于拦截 Android 应用程序中的 dlopen
和 android_dlopen_ext
函数。这两个函数用于动态加载共享库,脚本通过拦截这些函数的调用来记录加载的库的路径。
代码分析
var dlopen = Module.findExportByName(null, "dlopen"); // 6.0
var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext"); // 高版本8.1以上
Interceptor.attach(dlopen, {
onEnter: function (args) {
var path_ptr = args[0];
var path = ptr(path_ptr).readCString();
console.log("[dlopen:]", path);
},
onLeave: function (retval) {
// Thread.sleep(3);
}
});
Interceptor.attach(android_dlopen_ext, {
onEnter: function (args) {
var path_ptr = args[0];
var path = ptr(path_ptr).readCString();
console.log("[dlopen_ext:]", path);
},
onLeave: function (retval) {
// Thread.sleep(3);
}
});
1. 关键功能
1.1 dlopen
和 android_dlopen_ext
dlopen
: 这是一个标准的动态链接库加载函数,通常用于加载共享库。android_dlopen_ext
: 这是 Android 特有的扩展版本,提供了额外的功能,通常在 Android 8.1 及以上版本中使用。
2. 拦截逻辑
2.1 Interceptor.attach
Interceptor.attach
: 该方法用于拦截指定函数的调用。它接受两个参数:要拦截的函数地址和一个包含onEnter
和onLeave
方法的对象。
2.2 onEnter
onEnter
: 当被拦截的函数被调用时执行。这里,args[0]
是传递给dlopen
或android_dlopen_ext
的第一个参数,通常是要加载的库的路径。ptr(path_ptr).readCString()
: 读取指针指向的字符串,获取库的路径,并将其打印到控制台。
2.3 onLeave
onLeave
: 当被拦截的函数返回时执行。这里可以添加额外的逻辑,例如延迟或处理返回值,但当前代码中被注释掉了。
3. 使用方法
要使用这个脚本,需要:
-
安装 Frida: 确保您已经在设备上安装了 Frida Server,并且在您的计算机上安装了 Frida 工具。
-
运行命令: 使用如下命令运行脚本:
frida -U -f <your_app_package_name> -l <path_to_your_script.js> -o <output_log_file>
这里
<your_app_package_name>
是您要监控的应用程序包名,<path_to_your_script.js>
是脚本的路径,<output_log_file>
是输出日志文件的路径。
输出例子:
/data/app/~~KVEKJlJur2r6197VML5LRw==/com.shopee.sg-ZyVbLWincySSEAiqQSuPLQ==/split_config.arm64_v8a.apk!/lib/arm64-v8a/libshpssdk.so