frida脚本分享 | dump dex过Android一代壳

admin 2024年10月12日10:32:32评论15 views字数 4290阅读14分18秒阅读模式

虽然一代壳也可以用fart虚拟机打开,但个人觉得因为这个特地去拿脱壳机有些麻烦,于是就在网上找了frida的脚本,只需要一道命令轻轻松松拿到dex文件

昨天分享了一个frida unpack的,在文章最后我说了,在Android13上尝试,失败了。

今天我重新在网上找了一个新的frida脚本,经过本人测试,该脚本可以在Android13上面使用。

项目地址:https://github.com/lasting-yang/frida_dump

frida命令 frida -U -f xxx.xxx.xxx -l dump_dex.js

随后,frida会在/data/data/packagename/files/dump_dex_packagename 下面生成dex文件

直接adb pull可能会提示没有权限,可以通过cp或mv指定将dex文件移动到 /sdcard/Download目录下

这样就可以用gda或jadx直接打开了。

function get_self_process_name() {    var openPtr = Module.getExportByName('libc.so', 'open');    var open = new NativeFunction(openPtr, 'int', ['pointer', 'int']);    var readPtr = Module.getExportByName("libc.so", "read");    var read = new NativeFunction(readPtr, "int", ["int", "pointer", "int"]);    var closePtr = Module.getExportByName('libc.so', 'close');    var close = new NativeFunction(closePtr, 'int', ['int']);    var path = Memory.allocUtf8String("/proc/self/cmdline");    var fd = open(path, 0);    if (fd != -1) {        var buffer = Memory.alloc(0x1000);        var result = read(fd, buffer, 0x1000);        close(fd);        result = ptr(buffer).readCString();        return result;    }    return "-1";}function mkdir(path) {    var mkdirPtr = Module.getExportByName('libc.so', 'mkdir');    var mkdir = new NativeFunction(mkdirPtr, 'int', ['pointer', 'int']);    var opendirPtr = Module.getExportByName('libc.so', 'opendir');    var opendir = new NativeFunction(opendirPtr, 'pointer', ['pointer']);    var closedirPtr = Module.getExportByName('libc.so', 'closedir');    var closedir = new NativeFunction(closedirPtr, 'int', ['pointer']);    var cPath = Memory.allocUtf8String(path);    var dir = opendir(cPath);    if (dir != 0) {        closedir(dir);        return 0;    }    mkdir(cPath, 755);    chmod(path);}function chmod(path) {    var chmodPtr = Module.getExportByName('libc.so', 'chmod');    var chmod = new NativeFunction(chmodPtr, 'int', ['pointer', 'int']);    var cPath = Memory.allocUtf8String(path);    chmod(cPath, 755);}function dump_dex() {    var libart = Process.findModuleByName("libart.so");    var addr_DefineClass = null;    var symbols = libart.enumerateSymbols();    for (var index = 0; index < symbols.length; index++) {        var symbol = symbols[index];        var symbol_name = symbol.name;        //这个DefineClass的函数签名是Android9的        //_ZN3art11ClassLinker11DefineClassEPNS_6ThreadEPKcmNS_6HandleINS_6mirror11ClassLoaderEEERKNS_7DexFileERKNS9_8ClassDefE        if (symbol_name.indexOf("ClassLinker") >= 0 &&            symbol_name.indexOf("DefineClass") >= 0 &&            symbol_name.indexOf("Thread") >= 0 &&            symbol_name.indexOf("DexFile") >= 0) {            console.log(symbol_name, symbol.address);            addr_DefineClass = symbol.address;        }    }    var dex_maps = {};    var dex_count = 1;    console.log("[DefineClass:]", addr_DefineClass);    if (addr_DefineClass) {        Interceptor.attach(addr_DefineClass, {            onEnter: function(args) {                var dex_file = args[5];                //ptr(dex_file).add(Process.pointerSize) is "const uint8_t* const begin_;"                //ptr(dex_file).add(Process.pointerSize + Process.pointerSize) is "const size_t size_;"                var base = ptr(dex_file).add(Process.pointerSize).readPointer();                var size = ptr(dex_file).add(Process.pointerSize + Process.pointerSize).readUInt();                if (dex_maps[base] == undefined) {                    dex_maps[base] = size;                    var magic = ptr(base).readCString();                    if (magic.indexOf("dex") == 0) {                        var process_name = get_self_process_name();                        if (process_name != "-1") {                            var dex_dir_path = "/data/data/" + process_name + "/files/dump_dex_" + process_name;                            mkdir(dex_dir_path);                            var dex_path = dex_dir_path + "/class" + (dex_count == 1 ? "" : dex_count) + ".dex";                            console.log("[find dex]:", dex_path);                            var fd = new File(dex_path, "wb");                            if (fd && fd != null) {                                dex_count++;                                var dex_buffer = ptr(base).readByteArray(size);                                fd.write(dex_buffer);                                fd.flush();                                fd.close();                                console.log("[dump dex]:", dex_path);                            }                        }                    }                }            },            onLeave: function(retval) {}        });    }}var is_hook_libart = false;function hook_dlopen() {    Interceptor.attach(Module.findExportByName(null, "dlopen"), {        onEnter: function(args) {            var pathptr = args[0];            if (pathptr !== undefined && pathptr != null) {                var path = ptr(pathptr).readCString();                //console.log("dlopen:", path);                if (path.indexOf("libart.so") >= 0) {                    this.can_hook_libart = true;                    console.log("[dlopen:]", path);                }            }        },        onLeave: function(retval) {            if (this.can_hook_libart && !is_hook_libart) {                dump_dex();                is_hook_libart = true;            }        }    })    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();                //console.log("android_dlopen_ext:", path);                if (path.indexOf("libart.so") >= 0) {                    this.can_hook_libart = true;                    console.log("[android_dlopen_ext:]", path);                }            }        },        onLeave: function(retval) {            if (this.can_hook_libart && !is_hook_libart) {                dump_dex();                is_hook_libart = true;            }        }    });}setImmediate(dump_dex);

原文始发于微信公众号(进击的HACK):frida脚本分享 | dump dex过Android一代壳

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月12日10:32:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   frida脚本分享 | dump dex过Android一代壳http://cn-sec.com/archives/3257630.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息