Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ARTMethodHook

只是一个 ART Method Hook 的 demo

原理

通过修改 ArtMethod 中 JIT Cache 指针指向的代码入口地址头部插入 trampoline 跳转到我们希望代理的方法的地址即可实现方法的替换

细节

原理听起来简单,但有非常多的细节需要注意:

  • static 方法是 lazy resolve 的,在没有被调用之前,ArtMethod 的入口函数是一个跳板函数,即 art_quick_resolution_trampoline。
    • 所以在 hook 之前需要检查,如果为 art_quick_resolution_trampoline 则需要手动 resolve。
  • 方法可能还没有被 AOT 编译,这时入口函数是解释执行的入口,遇到这种情况需要手动调用 JIT 编译。
  • 代码逻辑一模一样的函数可能会复用同一段代码,这时可能会 hook 到自己不希望 hook 的函数。
  • 所有 JNI 函数共享同一个入口
  • Hook 的过程中最好 stop the world,否则可能会跟 JIT 并发写代码,导致 crash

本项目只是一个 demo,为了简单可能不会注意全部细节。专业的实现可以看看 epicpine

About

通过 ARTMethod + inline hook 实现 android java 层方法接管

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages