Updated on 2019-05-31

https://source.android.google.cn/devices/tech/dalvik/dex-format

https://source.android.google.cn/devices/tech/dalvik/dalvik-bytecode

frida-trace -U -i *SizeOfClassWithoutEmbeddedTables* com.saicmotor.tocapp
frida -U -f com.saicmotor.tocapp -l 123.js --no-pause --runtime=v8
var module = Module.getExportByName(
  "libart.so",
  "_ZN3art11ClassLinker32SizeOfClassWithoutEmbeddedTablesERKNS_7DexFileERKNS1_8ClassDefE",
);

var dumped_dex = [];

Interceptor.attach(module, {
  onEnter: function (args) {
    var dex_file = args[1].add(0x04).readPointer(); // 由于类中含有虚函数,跳过 vfptr,32 位加 4,64 位加 8
    var dex_file_size = dex_file.add(0x20).readUInt();
    var dex_header_size = dex_file.add(0x24).readUInt();

    for (var i = 0; i < dumped_dex.length; i++) {
      if (dumped_dex[i] == dex_file_size) return;
    }

    // console.log(JSON.stringify(this.context))
    // console.log(hexdump(dex_file, {length: 16}))
    console.log(dex_file.readCString());
    console.log(dex_file_size);
    console.log(dex_header_size);
    console.log("---------");

    var file = new File("/mnt/sdcard/Download/" + dex_file_size + ".dex", "wb");
    file.write(dex_file.readByteArray(dex_file_size));
    file.flush();
    file.close();
    dumped_dex.push(dex_file_size);
  },
  onLeave: function (retval) {},
});
/*
   C: args[0-n] = arguments
 C++: args[0] = this, args[1-n] = arguments
ObjC: args[0] = self, args[1] = selector, args[2-n] = arguments
*/

进制转换
----
busybox printf %x 32 # decimal -> hex
busybox printf %d 0x20 # hex -> decimal

查看符号表
----
nm.exe libart.so

解码 C++ 函数名
----
c++filt.exe _ZN3art11ClassLinker32SizeOfClassWithoutEmbeddedTablesERKNS_7DexFileERKNS1_8ClassDefE
----
art::ClassLinker::SizeOfClassWithoutEmbeddedTables(art::DexFile const&, art::DexFile::ClassDef const&)

下载至电脑
----
adb pull /mnt/sdcard/Download/  D:\Download\DEX

Reference