Skip to content
forked from fettdrac/ArtHook

一个art hook框架,可以作为学习art hook资料使用

License

Notifications You must be signed in to change notification settings

xuanqq123/ArtHook

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 

Repository files navigation

ArtHook

an android art hook framework ArtHook

ArtHook是什么?(What hell is the ArtHook)

双关名字,art虚拟机的hook,也是art风格的hook(膨胀了,美术不及格的开始谈论艺术了)

一个算是整合项目的东西,自己原创的原理部分其实不多,只是稍微理解了几个hook框架,做个综合而已

ArtHook is a kind of combined thing with little my own work.

It is based on my shallow understanding of some hook frameworks and tourials and make their benefits toghther.

算是“重复”造轮子吧。离不开dalao们的实现思路(尤其是 whale 那套把所有跳转都桥接到jni_entrypoint的操作可是真的秀)

(Especially,Whale's fancy operation of getting all entrypoint jump into jni_entrypoint really shocks me.)

ArtHook可以拿来做什么(What can be done by using ArtHook)?

  • Android ART Hook

    • JNI-style Hook,支持调用原方法,实现思路参照的是whale的(不如说直接就是去掉BuildJNICloseure的重复轮子)
    • 如果dalao愿意加个libffi或者DexMaker做AOP的话就更好了
    • 全局注入(配合 静态注入 技术,实现是PLT hook JNI_CreateJavaVM,这个时机够早了)
  • Native PLT Hook

    • 直接采用了iqiyi开源的xHook
    • 后续考虑增加inline hook(学考后再说吧,ARM指令一看就不是边复习语数就可以学的)

    其实这里有一个思路,>=7.0用jit_compiler手动编译目标ArtMethod,这样入口就确定了 直接inline hook这个quick_code入口就可以实现稳定hook,到了8.0以上入口替换就稳多了

  • JNI Dex Load

    • 这个目前还没有完全实现,memory_dex会段错误,学考完填坑),有文件加载dex的轮子之前我造过loadpayloaddex.cpp

ArtHook的优势在哪(What are the benefit of ArtHook)

  • 和java层交互少,侵入性小 (Decrease the interaction with java world,which ensures less risks than load another dex).
  • 采用art自有结构java/lang/Object内部方法确定偏移 (Use java/lang/Object's internalClone and clone to get the offsets of ArtMethod)

怎么用(How to use ArtHook)

其实写法有点类似于AndHook,在项目的art/hook_module文件夹下添加如下类似代码, 即可实现简单的art hook操作

#include "app_on_create.h"
#include "../ArtMethod.h"
#include "../../base/log.h"
#include "../../base/jni_helper.h"

static ArtMethod method= nullptr;
void my_CallApplicationOnCreate(JNIEnv *env,jobject thiz,jobject thisApp){
    LOGI("invoke hooked callApplicationOnCreate\n");
    jclass app_class=env->GetObjectClass(thisApp);
    jobjectArray params=env->NewObjectArray(1,app_class,thisApp);
    method.InvokeOriginal(env,thiz, params);
}

void hook_app_on_create() {//在合适的时候(比如hooked JNI_CreateJavaVM回调中调用这个方法)
    JNIEnv *env=GetJniEnv();
    jclass in_class=env->FindClass("android/app/Instrumentation");
    jmethodID jni_method=env->GetMethodID(in_class,"callApplicationOnCreate","(Landroid/app/Application;)V");
    method= ArtMethod(jni_method);
    method.Hook(reinterpret_cast<ptr_t>(my_CallApplicationOnCreate));
    LOGI("hook callApplicationOnCreate finished\n");
}

问题反馈

这套框架目前在Android 6.0 AOSP下工作良好。

It can work well as least now on Android 6.0(M_10) AOSP,but I cannot test it on more advanced editon. So,if you get any problems, please tell me by issue.Thank you!!!

有些借鉴asLody大佬和杂七杂八看教程来适配更高的版本(7,8,9),条件有限,没能测试。

致谢和声明

  • 1、看雪上SandHook作者的那篇文章,分析的很透彻,坑点细节也比较多。

  • 2、借鉴了asLody大佬的whale框架的实现,这个项目更好点说是它的“优化”而不是一个独立的项目 (不会pull request,kali下开ssh进来就是root风险有点大, 代码也写得不是很优雅,注释只有中文,实在不好意思pull request)。 如果dalao认为这套获取偏移的方法比手动注册两个reversed stub更好的话,欢迎merge或者直接用

  • 3、一个画风清奇的致谢,这篇MarkDown版本的README是MaHua编辑器写的, 在线的MarkDown,难得

  • 4、声明:这个项目的代码可以随便拿去用,但要注明一下出处。(应该没人会用吧 (You can copy any code from the project but please write where it comes from in description. Thank you!!!)

关于作者

  var ihubo = {
    nickName  : "fettdrac",
    self_introduction: "一枚准高三学生,平时不务正业写写C#、Java、JNI环境的cpp",
    site : "莫得网站,github挺好"
  }

About

一个art hook框架,可以作为学习art hook资料使用

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 71.9%
  • C++ 26.7%
  • CMake 1.1%
  • Makefile 0.3%