博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java jvm启动过程 及 如何hook java代码
阅读量:2344 次
发布时间:2019-05-10

本文共 1343 字,大约阅读时间需要 4 分钟。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
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(), 这就是解释器了好像,但是并不影响代码劫持。

你可能感兴趣的文章
IDEA eclipse 控制台日志输出到文件
查看>>
1022. Fib数列
查看>>
一些开源项目
查看>>
将博客搬至CSDN
查看>>
MySQL 中事务的实现
查看>>
CheckStyle
查看>>
IDE配置jvm参数
查看>>
内存溢出
查看>>
Spring Cloud 声明式服务调用 Feign
查看>>
JVM实用参数(一)JVM类型以及编译器模式
查看>>
spring cloud config 属性加解密
查看>>
rabbitmq安装
查看>>
RabbitMQ 使用
查看>>
动态代理
查看>>
oracle中merge into用法解析
查看>>
MySQL Explain详解
查看>>
oracle性能监控
查看>>
Spring Boot 整合Servlet
查看>>
Spring Boot 整合Filter
查看>>
nginx 安装
查看>>