Java jvm启动过程 及 如何hook java代码

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
create_vm函数启动虚拟机
add函数,将线程加入到线程队列
create函数,创建虚拟机线程“VMTHread”
vm_init——globals函数,初始化全局数据结构
init_globals函数,初始化全局模块
LoadClass函数,加载应用程序主类
jni_CallStaticVoidMethod函数,实现对Java应用程序的主方法的调用
jni_DetachCurrentThread函数
jni_DestroyJavaVM函数,销毁JVM.

其中jni_CallStaticVoidMethod执行了静态方法,最后执行到了

static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS)
methodHandle method(THREAD, Method::resolve_jmethod_id(method_id));
void JavaCalls::call_helper(JavaValue* result, methodHandle* m, JavaCallArguments* args, TRAPS) 

但其实非静态也调用了JavaCalls::call_helper函数。
如果hook掉的化,我们就能获取java进程执行的调用序列。
method对象有个name_and_sig_as_C_string,可以获取调用序列的名称。这里进行组合,其实效果和栈序列差不多,也可做很多的事情。

dalvik虚拟hook

这里让我想到了xposed的逻辑,https://blog.csdn.net/bme314/article/details/104892514

dvmCallMethodV

dvmIsNativeMethod(method)判断是本地方法还是java方法,java方法用dvmInterpret(self, method, pResult);执行。
本地方法用(method->nativeFunc)((u4)self->interpSave.curFrame, pResult, method, self);

hook框架修改了dvmCallMethodV,把java方法全部修改到SET_METHOD_FLAG(method, ACC_NATIVE),增加了一段中间代码,根据java method的函数签名,会先加载自定义的module,判断其中是否添加了hook模块,如果有就执行,没有就简单的恢复原来的java代码。

其实这里似乎也可以做这样的东西。

可以在void JavaCalls::call_helper里面做,加载自定义的模块并执行,然后再恢复原来的执行逻辑,效果是一样的。不过并没有找到本地方法和java方法直接判断的代码,因为到了call_helper里面,直接会执行StubRoutines::call_stub(), 这就是解释器了好像,但是并不影响代码劫持。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值