首先MainActivity中的native函数ccccccc首先调用了ddddd()函数
ddddd()函数首先使用j_dlopen_compat函数,接着就是hook了libc中的execve函数,
registerInlineHook参数为1、原始函数地址,2、hook的新函数地址,3、原始函数的二级指针。
当Android7.0或以上时候进入j_fake_dlsym() fake_dlopen(),这也是为什么我使用基于安卓8.0的FART的原因。
整个函数ddddd()函数最终目的是hook execve使得dex2oat失败,从而使得加载的插件类dex不会被优化,变为oat文件之后我们动态修改的dex中的smali指令流就无效,所有hook execve禁用dex2oat是关键步骤。
进入下一个逻辑eeeee(),
eeeeee()函数跟ddddd()函数类似,在/proc/self/maps中找到libart.so的内存进而hook art::ClassLinker::LoadMethod函数(上面一大串字符是其导出函数) ,registerInlineHook参数为1、原始函数地址,2、hook的新函数地址,3、原始函数的二级指针。
在Hook了LoadMethod之后,在加载插件类中的testcontent方法时候做了手脚。
下面图片可以看到 ART的LoadMethod的函数的参数,其中dst参数是类方法的指针,通过其就能拿到类函数的CodeItem的Offset。
但在本案例,在myloadmethod中,使用了a2也就是dex_file参数
通过dex_file 把zipCode的字符串索引改变为0x01e1即 md5("kanxue")的字符串索引,所愿也就造成了dex运行逻辑的修改