Hook Java的的一个改进版本

本文介绍了对《注入安卓进程,并Hook java世界的方法》中提到的Java Hook技术的两个改进点:1) 更简便地将Java方法转换为本地方法,无需重新注册;2) 解决回调过程中的线程安全问题,通过`dvmInvokeMethod`调用原始函数。作者分享了实现这些改进的代码,并计划将各种Hook技术集成到GitHub项目中。
摘要由CSDN通过智能技术生成

Hook Java的的一个改进版本

《注入安卓进程,并Hook java世界的方法》这篇好文相信大家都看这,里面所提到的方法估计大家也都试过。不过里面的所用的方法,我发现有两个可以改进的地方。

改进点一:更简单地修改java方法为本地方法

...
    // hook method
    int argsSize = calcMethodArgsSize(method->shorty);
    if (!dvmIsStaticMethod(method))
        argsSize++;


    SET_METHOD_FLAG(method, ACC_NATIVE);
    method->registersSize = method->insSize = argsSize;
    method->outsSize = 0;
    method->jniArgInfo = dvmComputeJniArgInfo(method->shorty);


    // save info to insns
    method->insns = (u2*)info;


    // bind the bridge func,only one line
    method->nativeFunc = method_handler;
    LOGI("[+] %s->%s was hooked\n", classDesc, methodName);
    ...


直接把method->nativeFunc即可,无需重新调用JNIEnv的RegisterNatives方法,其中method_handler可以是下面两种形式之一:

typedef void (*DalvikBridgeFunc)(const u4* args, JValue* pResult, const Method* method, struct Thread* self);
typedef void (*DalvikNativeFunc)(const u4* args, JValue* pResult);

这样有一个好处,就是所有java方法都可以统一指向同一个native func,而不需要像为每一个java method方法指定一个native func。

改进点二:方法回调避免线程安全问题

原来的方法,是这样的

//hook之前先拷贝
  uint mlen = sizeof(Method);
  Method *oldMeth = (Method*)malloc(mlen);
  memcpy(oldMeth,method,mlen);
  info->odlMethod = oldMeth;
  info->curMethod = method;


  //回调后再拷贝回来&
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值