当前位置: 首页 > news >正文

urmom damn the jvm

urmom 想要玩一下jvm

federa linux install jvm

sudo dnf install # openjdk 24 , gcc as well

创建method_trace_agent.c, urmom ai do it for me

#include <jni.h>
#include <jvmti.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>static jvmtiEnv *jvmti = NULL;// 处理类签名(Lxxx/xxx; -> xxx/xxx)
static char* process_class_signature(const char *signature) {if (signature == NULL || *signature != 'L') {return strdup(signature ? signature : "");}size_t len = strlen(signature);char *processed = (char*)malloc(len - 1);if (processed) {strncpy(processed, signature + 1, len - 2);processed[len - 2] = '\0';}return processed;
}// 方法进入回调
void JNICALL MethodEntryCallback(jvmtiEnv *jvmti,JNIEnv *env,jthread thread,jmethodID method
) {jclass declaring_class;jvmtiError err = (*jvmti)->GetMethodDeclaringClass(jvmti, method, &declaring_class);if (err != JVMTI_ERROR_NONE) {fprintf(stderr, "GetMethodDeclaringClass failed: %d\n", err);return;}char *class_signature, *class_generic;err = (*jvmti)->GetClassSignature(jvmti, declaring_class, &class_signature, &class_generic);if (err != JVMTI_ERROR_NONE) {fprintf(stderr, "GetClassSignature failed: %d\n", err);return;}char *class_name = process_class_signature(class_signature);char *method_name, *method_signature, *method_generic;err = (*jvmti)->GetMethodName(jvmti, method, &method_name, &method_signature, &method_generic);if (err != JVMTI_ERROR_NONE) {fprintf(stderr, "GetMethodName failed: %d\n", err);free(class_name);(*jvmti)->Deallocate(jvmti, (unsigned char*)class_signature);(*jvmti)->Deallocate(jvmti, (unsigned char*)class_generic);return;}printf("[JVM HACK] 调用方法: %s.%s%s\n", class_name, method_name, method_signature);free(class_name);(*jvmti)->Deallocate(jvmti, (unsigned char*)class_signature);(*jvmti)->Deallocate(jvmti, (unsigned char*)class_generic);(*jvmti)->Deallocate(jvmti, (unsigned char*)method_name);(*jvmti)->Deallocate(jvmti, (unsigned char*)method_signature);(*jvmti)->Deallocate(jvmti, (unsigned char*)method_generic);
}// Agent初始化(适配JDK 24)
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) {// 获取JVM TI环境(使用JDK 24支持的最新版本)jint ret = (*vm)->GetEnv(vm, (void **)&jvmti, JVMTI_VERSION_1_2);if (ret != JNI_OK || jvmti == NULL) {fprintf(stderr, "获取JVM TI环境失败,错误码: %d\n", ret);return ret;}// JDK 24中,方法信息访问能力通过can_access_method_data统一声明jvmtiCapabilities capabilities;memset(&capabilities, 0, sizeof(capabilities));capabilities.can_generate_method_entry_events = 1; // 允许生成方法进入事件#if 0 // not working on jdk24//capabilities.can_access_method_data = 1;           // 允许访问方法数据(替代旧版本的细粒度成员)#endifjvmtiError err = (*jvmti)->AddCapabilities(jvmti, &capabilities);if (err != JVMTI_ERROR_NONE) {fprintf(stderr, "添加JVM TI功能失败,错误码: %d\n", err);return err;}// 注册回调jvmtiEventCallbacks callbacks;memset(&callbacks, 0, sizeof(callbacks));callbacks.MethodEntry = &MethodEntryCallback;err = (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks));if (err != JVMTI_ERROR_NONE) {fprintf(stderr, "设置事件回调失败,错误码: %d\n", err);return err;}// 启用方法进入事件err = (*jvmti)->SetEventNotificationMode(jvmti,JVMTI_ENABLE,JVMTI_EVENT_METHOD_ENTRY,NULL);if (err != JVMTI_ERROR_NONE) {fprintf(stderr, "启用事件通知失败,错误码: %d\n", err);return err;}printf("[JVM HACK] 代理加载成功,开始监控方法调用...\n");return JNI_OK;
}

创建Test.java, jaba jaba boba tea

public class Test {public static void main(String[] args) {System.out.println("开始测试...");foo();bar(123);}public static void foo() {System.out.println("执行foo()");}public static void bar(int x) {System.out.println("执行bar(" + x + ")");}
}

创建build-jvm.sh

set -xeexport JAVA_INCLUDE_DIR=/etc/alternatives/java_sdk_24gcc -fPIC -shared -I${JAVA_INCLUDE_DIR}/include -I${JAVA_INCLUDE_DIR}/include/linux \method_trace_agent.c -o libmethod_trace_agent.sojava -agentpath:./libmethod_trace_agent.so Test

运行build-jvm.sh, 输出

[JVM HACK] 代理加载成功,开始监控方法调用...
[JVM HACK] 调用方法: java/lang/Thread.<init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V
[JVM HACK] 调用方法: java/lang/Thread.checkName(Ljava/lang/String;)Ljava/lang/String;
[JVM HACK] 调用方法: java/lang/Thread.<init>(Ljava/lang/ThreadGroup;Ljava/lang/String;ILjava/lang/Runnable;J)V
[JVM HACK] 调用方法: java/lang/Object.<init>()V
[JVM HACK] 调用方法: java/lang/Object.<init>()V
[JVM HACK] 调用方法: java/lang/Thread.getPriority()I
[JVM HACK] 调用方法: java/lang/Thread.isVirtual()Z
[JVM HACK] 调用方法: java/lang/ThreadGroup.getMaxPriority()I
[JVM HACK] 调用方法: java/lang/Math.min(II)I
...很多输出

ok, shutdown Windows and sleep for a while, next time damn the world

  • urmom for your mom
http://www.lryc.cn/news/615449.html

相关文章:

  • C++2024 年一级
  • 基于 InfluxDB 的服务器性能监控系统实战(一)
  • P1053 [NOIP 2005 提高组] 篝火晚会
  • Linux学习--软件编程(shell命令)
  • 多线程(四) --- 线程安全问题
  • 使用 Ansys Discovery 进行动态设计和分析
  • js零基础入门
  • HashTable, HashMap, ConcurrentHashMap
  • Java 8 特性
  • 力扣(删除有序数组中的重复项I/II)
  • 20250808组题总结
  • 力扣 hot100 Day70
  • 力扣-35.搜索插入位置
  • SwiftUI 登录页面键盘约束冲突与卡顿优化全攻略
  • AI推理的“灵魂五问”:直面2025算力鸿沟与中国的破局之路
  • Java基础语法全面解析:从入门到掌握
  • MySQL 复制表详细说明
  • 三极管在电路中的应用
  • SpringSecurity过滤器链全解析
  • 工具箱许愿墙项目发布
  • Redis 事务机制
  • Mysql笔记-系统变量\用户变量管理
  • 机器学习 K-Means聚类 无监督学习
  • 数据结构初阶(7)树 二叉树
  • BGP笔记
  • 机器学习DBSCAN密度聚类
  • 讯飞晓医-讯飞医疗推出的个人AI健康助手
  • 复杂环境下车牌识别准确率↑29%:陌讯动态特征融合算法实战解析
  • 编译技术的两条演化支线:从前端 UI 框架到底层编译器的智能测试
  • Office安装使用?借助Ohook开源工具?【图文详解】微软Office产品