Frida进行Android中So文件的dump

发布于:2024-12-18 ⋅ 阅读:(93) ⋅ 点赞:(0)

安卓逆向中,有的so文件加壳了,需要so文件加载到内存中之后进行dump,之后才能正常看到so文件中的代码,而android_dlopen_ext则是动态加载so文件的,那么我们可以等so文件加载到内存中之后,获取内存中so文件的加载基址,大小,之后进行dump,代码如下:

其中soName是我们要进行dump的so文件名称

file_path是文件路径,其中com***是应用包名

文件执行的命令为:frida -U -f com.*** -l android_dlopen_ext.js

com.***则是要注入的包名

function my_hook_dlopen(soName) {
    Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"),
        {
            onEnter: function (args) {
                var pathptr = args[0];
                if (pathptr !== undefined && pathptr != null) {
                    var path = ptr(pathptr).readCString();
                    if (path.indexOf(soName) >= 0) {
                        this.is_can_hook = true;
                    }
                }
            },
            onLeave: function (retval) {
                if (this.is_can_hook) {
                    dump_so(soName);
                }
            }
        }
    );
}
 
function dump_so(so_name) {
    var libso = Process.getModuleByName(so_name);
    console.log("[name]:", libso.name);
    console.log("[base]:", libso.base);
    console.log("[size]:", ptr(libso.size));
    console.log("[path]:", libso.path);
    var file_path = "/data/data/com.****/" + libso.name + "_" + libso.base + "_" + ptr(libso.size) + "android_dlopen_ext.so";
    //其中,com.***为包名
    var file_handle = new File(file_path, "wb");
    if (file_handle && file_handle != null) {
        Memory.protect(ptr(libso.base), libso.size, 'rwx');
        var libso_buffer = ptr(libso.base).readByteArray(libso.size);
        file_handle.write(libso_buffer);
        file_handle.flush();
        file_handle.close();
        console.log("[dump]:", file_path);
    }
}
 
setImmediate(my_hook_dlopen("libcovault-appsec.so"));//libcovault-appsec.so为要进行内存dump的so文件名称