安卓逆向中,有的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文件名称
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |