首页 > 数据库技术 > 详细

adbi学习:java hook实现机制

时间:2015-12-05 17:40:24      阅读:662      评论:0      收藏:0      [点我收藏+]

  adbi的java hook实现代码ddi不在之前下载的文件中,下载地址:https://github.com/crmulliner/ddi,具体的编译看readme里面很详细的介绍了。注意ddi代码不能单独使用要跟之前的adbi相结合,因为adbi提供了注入so。本文不对代码进行详细的剖析(你可以看参考资料的文章),分析下2个问题:java如何hook;如何执行自己的java代码

  java hook:

  其实在ddi的java hook和xposed的hook原理(不清楚的看我之前xposed的分析)是相同的,都是改变被hook函数的accessflag;将原本的java函数变成native函数,从而去执行自己定义的native函数;它实现的代码在dalvik_hook.c的dalvik_hook函数中。但不同于xposed是,它没有直接修改Mehtod结构的insns和nativeFunc而是调用了dvmUseJNIBridge函数来修改insns和nativeFunc。但在我看这个函数时发现其跟android源码中的dvmRegisterJNIMethod很相似:

static bool dvmRegisterJNIMethod(ClassObject* clazz, const char* methodName,
    const char* signature, void* fnPtr)
{
  // 解释下参数:
  // clazz:类名"shy/luo/jni/ClassWithJni";
  // methodName:需要注册的jni方法名 nanosleep;
  // signature:方法的签名 实质是方法的参数和返回值,区别不同参数的函数
  // fnPtr: jni方法函数地址 即shy_luo_jni_ClassWithJni_nanosleep函数;dalvik执行的就是这个函数,很重要哎
    Method* method;
    ......
    method = dvmFindDirectMethodByDescriptor(clazz, methodName, signature);
    ......
    dvmUseJNIBridge(method, fnPtr);
    ......
}

 

 

   dvmRegisterJNIMethod(关于此函数的解析,看dalvik浅析二:jni、so)函数中用dvmFindDirectMethodByDescriptor找到函数在dalvik中的Method结构,然后再dvmUseJNIBridge为Method注册native函数(在正常情况下,该Method的accessflag就是native所以无需修改)。下面来看ddi中的dalvik_hook函数实现

void* dalvik_hook(struct dexstuff_t *dex, struct dalvik_hook_t *h)
{    //dalvik_hook_t结构体中已包含函数所属的class、name、signature
    ......
    h->method = dex->dvmFindVirtualMethodHierByDescriptor_fnPtr(target_cls, h->method_name, h->method_sig);
    if (h->method == 0) {
        h->method = dex->dvmFindDirectMethodByDescriptor_fnPtr(target_cls, h->method_name, h->method_sig);
    }
        ......
        //保留method的属性带以后还原
        h->iss = h->method->insSize;
        h->rss = h->method->registersSize;
        h->oss = h->method->outsSize;
      // 这里要处理
        h->method->insSize = h->n_iss;
        h->method->registersSize = h->n_rss;
        h->method->outsSize = h->n_oss;
        
        h->method->jniArgInfo = 0x80000000; // <--- also important;这里很重要,下面要分析
        ......
        h->access_flags = h->method->a;        //保留原先函数的accessflag
        h->method->a = h->method->a | h->af; // make method native
        ......
        // bind function
        dex->dvmUseJNIBridge_fnPtr(h->method, h->native_func);
        ......
}

 

  显而易见,dalvik_hook按dvmRegisterJNIMethod的逻辑来编写的,所以hook其实是自己为java函数注册了一个jni方法!(熟读源码理解实现机制,你会发现很多框架和工具都是基于源码的)ok,上面的知识点大部分都是熟悉,注意蓝色代码很重要的是函数使用的dalvik寄存器,xpos

 

 

 

 

 

  ok,adbi的分析就到此为止啦。总结下adbi在hijack中利用ptrace在目标进程注入代码,该代码会加载so;而在so里面可以进行so和java hook:

  so hook:找到native函数的指令,利用Inline hook在执行native函数时去执行你自己的函数;

  java hook:改变函数的accessflag去执行自己的native函数

 

参考资料:

  1 Android平台下Dalvik层hook框架ddi的研究 

 

 

dvmUseJNIBridge

adbi学习:java hook实现机制

原文:http://www.cnblogs.com/vendanner/p/5021890.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!