首页
论坛
课程
招聘
推荐专栏
课程评论
小想法
制作自己的插件so:
https://www.kanxue.com/include  "ida.h"

typedef  _DWORD  (*funGetObsoleteDexCache)(void  *);

//  art::ArtMethod::GetObsoleteDexCache作为a2让frida传入,比自己实现更方便
extern  "C"  int  MyGetDexFile(void  *a1,  void  *a2)  {
        int  result;

        if  ((*((_DWORD  *)  a1  +  1)  &  0x40000)  !=  0)  {
                funGetObsoleteDexCache  fDexCache  =  (funGetObsoleteDexCache)  a2;
                result  =  *(_DWORD  *)  ((_DWORD)  fDexCache(a1)  +  16);
        }  else  {
                result  =  *(_DWORD  *)  (*(_DWORD  *)  (*(_DWORD  *)  a1  +  16)  +  16);
        }
        return  result;
}

frida调用:
function  main()  {
        Java.perform(function  ()  {
                var  module_libext  =  null;
                if  (Process.arch  ===  "arm64")  {
                        module_libext  =  Module.load("/data/local/tmp/libnative-lib64.so");
                }  else  if  (Process.arch  ===  "arm")  {
                        module_libext  =  Module.load("/data/local/tmp/libnative-lib.so");
                }

                //获得GetObsoleteDexCache函数地址
                var  addrGetObsoleteDexCache;
                var  symbols  =  Module.enumerateSymbolsSync("libart.so");
                for  (var  i  =  0;  i  <  symbols.length;  i++)  {
                        var  symbol  =  symbols[i];
                        if  (symbol.name.indexOf("ArtMethod")  >=  0  &&  symbol.name.indexOf("GetObsoleteDexCache")  >=  0)  {
                                addrGetObsoleteDexCache  =  symbol.address;
                                break;
                        }
                }

                var  MyGetDexFile  =  module_libext.getExportByName("MyGetDexFile");
                var  funcMyGetDexFile  =  new  NativeFunction(MyGetDexFile,  "pointer",  ["pointer",  'pointer']);

                var  jnienv  =  Java.vm.getEnv();
                var  myclass  =  Java.use("com.sup.android.base.MainActivity").class;
                var  method  =  myclass.getDeclaredMethods();
                method  =  method[0];  //任意函数art_method都可GetDexFile()
                var  ArtMethodptr  =  jnienv.fromReflectedMethod(ptr(method.$h));
                var  DexFileptr  =  funcMyGetDexFile(ptr(ArtMethodptr),  ptr(addrGetObsoleteDexCache));
                dump(DexFileptr);
        })
}

function  dump(Dexfile)  {
        var  begin  =  ptr(Dexfile).add(Process.pointerSize).readPointer();
        var  size  =  ptr(Dexfile).add(2  *  Process.pointerSize).readU32();

        console.log(hexdump(begin))
        console.log(size);
        var  file  =  new  File("/sdcard/getDexFile.dex",  "w");
        file.write(begin.readByteArray(size));
        file.flush();
        file.close();
}
chocolate_961272
@Roger  哥哥好,求更新进阶教程呀哥哥。
合作伙伴