frida_dump地址:https://github.com/lasting-yang/frida_dump
Dex_dump
1、找到hook点
在Dex_dump中使用了,如下libart中的DefineClass
mirror::Class* DefineClass(Thread* self,
const char* descriptor,
size_t hash,
Handle<mirror::ClassLoader> class_loader,
const DexFile& dex_file,
const DexFile::ClassDef& dex_class_def)
REQUIRES_SHARED(Locks::mutator_lock_)
REQUIRES(!Locks::dex_lock_);
可以看到参数中dex_file是我们需要拿到的参数:
DexFile::DexFile(const uint8_t* base,
size_t size,
const uint8_t* data_begin,
size_t data_size,
const std::string& location,
uint32_t location_checksum,
const OatDexFile* oat_dex_file,
std::unique_ptr<DexFileContainer> container,
bool is_compact_dex)
在frida_dump 中 这样写:
var base = ptr(dex_file).add(Process.pointerSize).readPointer();
var size = ptr(dex_file).add(Process.pointerSize + Process.pointerSize).readUInt();
由此可以计算出dex的文件地址和大小,就可以dump下来了。
总结:最重要的一步就是如何确定hook的函数,总的来说,可以通过DexFile出发找到其他的hook点。