半亩花草 发表于 2025-4-9 06:08:12

Frida举行Android中So文件的dump

安卓逆向中,有的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;
                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(":", libso.name);
    console.log(":", libso.base);
    console.log(":", ptr(libso.size));
    console.log(":", 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(":", file_path);
    }
}

setImmediate(my_hook_dlopen("libcovault-appsec.so"));//libcovault-appsec.so为要进行内存dump的so文件名称


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Frida举行Android中So文件的dump