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

网站api怎么做的酒店无线网络设计方案

网站api怎么做的,酒店无线网络设计方案,wordpress生成xml,wordpress插件flash在当今数字化时代,Java 作为一种广泛应用的编程语言,其安全性和性能监控至关重要。今天,我们就来深入了解一下 Java 安全领域的一把利器 ——JVMTI(Java Virtual Machine Tool Interface)。 JVMTI 究竟是什么&#xf…

在当今数字化时代,Java 作为一种广泛应用的编程语言,其安全性和性能监控至关重要。今天,我们就来深入了解一下 Java 安全领域的一把利器 ——JVMTI(Java Virtual Machine Tool Interface)。

JVMTI 究竟是什么?

JVMTI 是 JVM 提供的一个强大编程接口,专为开发和监控工具量身打造。简单来说,它就像是一个神奇的 “魔法钥匙”,开发者可以通过它在不修改应用程序代码的情况下,对运行在 JVM 上的程序进行监控、调试和分析。这个接口的功能十分强大,涵盖了类、线程、堆内存、监视器、栈帧等多个方面的查询和操作。

JVMTI 能做什么?

丰富的事件通知

JVM 提供了一组事件,这些事件就像是一个个 “小信使”,能够通知本机动态库文件当前 JVM 处于什么状态。开发者可以通过 JVMTI 提供的 SetEventCallbacks 函数设置对应事件的回调函数,再使用 SetEventNotificationMode 函数启动或禁用某个事件的通知。下面是一些常见的事件及其触发时机:

多样的应用场景

  • 调试工具:设置断点、单步执行代码,就像一位精准的 “代码侦探”,帮助开发者快速定位问题。
  • 性能监控工具:查看内存使用、CPU 消耗,找出程序慢的原因,为程序的性能优化提供有力支持。
  • 线程分析工具:检查线程状态,发现死锁等问题,保障程序的稳定运行。
  • 代码覆盖工具:在测试时查看哪些代码行被执行了,让测试更加全面和准确。
  • 字节码增强工具:运行时修改 class 文件中 JVM 字节码指令,实现代码的动态增强。

JVMTI 的加载方式

启动加载

在 Java 进程启动的时候,我们可以通过 -agentpath:<pathname>=<options> 的方式启动。这里的 pathname 是对应的 JVMTI 接口实现的本机动态库文件(.dll/.so)的绝对路径,后面还可以追加 JVMTI 程序需要的参数。这种方式就像是在程序启动时就给它配备了一个 “小助手”。

附加加载

使用代码将 JVMTI 实现的本机动态库文件(.dll/.so)附加到 JVM 进程中。这就好比在程序运行过程中,随时可以为它添加一个 “临时帮手”。

JVMTI 初体验:遍历已加载的类签名

我们可以通过附加 JVM 的方式,遍历当前 JVM 已加载的类签名。下面是具体的代码实现:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)project(jvmtidemo)
set(PRODUCT_NAME ${PROJECT_NAME})
set(CMAKE_CXX_STANDARD 17)
set(JAVA_HOME $ENV{JAVA_HOME})include_directories(${JAVA_HOME}/include)
include_directories(${JAVA_HOME}/include/win32)
link_directories(${JAVA_HOME}/lib)message(STATUS JAVA_HOME:${JAVA_HOME})
aux_source_directory(src SRC_LIST)
add_library(${PRODUCT_NAME} SHARED ${SRC_LIST})

jvmtidemo.cpp

#include <jvmti.h>
#include <iostream>
#include <filesystem>namespace fs = std::filesystem;JNIEXPORT jint printLoadedClasses(JavaVM* vm)
{jvmtiEnv* jvmti;jint result = vm->GetEnv((void**)&jvmti, JVMTI_VERSION_1_2);if (result != JNI_OK){std::cout << "Unable to access jvm env" << std::endl;return result;}jclass* classes;jint count;result = jvmti->GetLoadedClasses(&count, &classes);if (result != JNI_OK){std::cout << "JVMTI GetLoadedClasses failed" << std::endl;return result;}for (int i = 0; i < count; i++){char* sig;char* genericSig;jvmti->GetClassSignature(classes[i], &sig, &genericSig);std::cout << "class signature = " << sig << std::endl;}return 0;
}JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM* vm, char* options, void* reserved)
{std::cout << "Agent Onload" << std::endl;return JNI_OK;
}JNIEXPORT jint JNICALL
Agent_OnAttach(JavaVM* vm, char* options, void* reserved)
{std::cout << "Agent OnAttach" << std::endl;printLoadedClasses(vm);return JNI_OK;
}JNIEXPORT void JNICALL
Agent_OnUnload(JavaVM* vm)
{std::cout << "Agent OnUnload" << std::endl;
}

AgentAttacher.java

import com.sun.tools.attach.VirtualMachine;public class AgentAttacher {public static void main(String[] args) {if(args.length != 2) {System.out.println("Invalid Argument");return;}String pid = args[0];String agentPath = args[1];attach(pid, agentPath, "");}public static void attach(String pid, String agentPath, String agentArgs) {try {VirtualMachine virtualMachine = VirtualMachine.attach(pid);virtualMachine.loadAgentPath(agentPath, agentArgs);} catch (Exception e) {e.printStackTrace();}}
}

实验步骤

  1. 通过 CMakeLists.txt 和 jvmtidemo.cpp 编译出 jvmtidemo.dll 代理库。
  2. 使用 javac 编译 AgentAttacher.java。
  3. 通过 java AgentAttacher <pid> jvmtidemo.dll 命令附加加载代理库到指定 JVM 进程中,即可打印出已加载的类签名。

基于字节码增强的 Class 文件保护方案

核心思路

我们可以将 Class 文件中方法的字节码进行加密,实现对 Class 文件的保护。然后通过编译 JVMTI Agent 动态库,注册 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK 事件回调。在 ClassFileLoadHook 函数中对已加密的方法的字节进行解密,实现运行时内存解密。

安全风险与注意事项

需要注意的是,Agent 解密动态库注册的 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK 的事件回调必须要是最后一个调用,否则后面的事件回调传递的参数就是解密后的 class 文件,会造成安全隐患。JVM 规范并没有明确指定多个代理之间的调用顺序,这通常取决于 JVM 实现和代理加载的顺序,不过一般都是按注册顺序来调用的。这里比较推荐 Virbox Protector,它对于该方案的细节处理得比较好,具体可以参考深盾科技官网:Java BCE方式保护最佳实践 | Virbox Protector。

实验代码

#include <jvmti.h>
#include <iostream>
#include <filesystem>namespace fs = std::filesystem;void save_class_file(const char* class_name, const jbyte* data, jint length)
{char file_name[256];snprintf(file_name, sizeof(file_name), "%s.class", class_name);std::string filename = file_name;std::replace(filename.begin(), filename.end(), '/', '_');std::string path = fs::path("./dump").append(filename).string();FILE* fp = fopen(path.c_str(), "wb");if (fp) {fwrite(data, 1, length, fp);fclose(fp);}else{std::printf("failed to save class: %s\n", class_name);}
}void JNICALL ClassFileLoadHook(jvmtiEnv* jvmti,JNIEnv* jni,jclass class_being_redefined,jobject loader,const char* name,jobject protection_domain,jint class_data_len,const unsigned char* class_data,jint* new_class_data_len,unsigned char** new_class_data
) {if (name && strstr(name, "Main")){save_class_file(name, (jbyte*)class_data, class_data_len);}
}JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM* vm, char* options, void* reserved)
{std::cout << "Agent Onload" << std::endl;jvmtiEnv* jvmti;jvmtiCapabilities capabilities;jvmtiEventCallbacks callbacks;// 获取 JVMTI 环境if (vm->GetEnv((void**)&jvmti, JVMTI_VERSION) != JNI_OK) {return JNI_ERR;}// 启用类加载事件memset(&capabilities, 0, sizeof(capabilities));capabilities.can_generate_all_class_hook_events = 1;capabilities.can_retransform_any_class = 1;capabilities.can_retransform_classes = 1;jvmti->AddCapabilities(&capabilities);// 设置回调函数memset(&callbacks, 0, sizeof(callbacks));callbacks.ClassFileLoadHook = &ClassFileLoadHook;jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks));// 启用事件通知jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL);return JNI_OK;
}JNIEXPORT jint JNICALL
Agent_OnAttach(JavaVM* vm, char* options, void* reserved)
{std::cout << "Agent OnAttach" << std::endl;return JNI_OK;
}JNIEXPORT void JNICALL
Agent_OnUnload(JavaVM* vm)
{std::cout << "Agent OnUnload" << std::endl;
}

通过以上的介绍和实验,我们可以看到 JVMTI 在 Java 安全和性能监控方面有着巨大的潜力。如果你也对 Java 安全和性能优化感兴趣,不妨动手试试 JVMTI,相信它会给你带来意想不到的收获!

http://www.dtcms.com/a/464230.html

相关文章:

  • 房产cms网站建设网站营销体系的建设及运营情况
  • 找个网站懂的网站天津市政建设集团有限公司网站
  • 网站商城开发公司网页设计说明书1000字
  • 做封面下载网站辽宁建设工程信息网怎么无法登陆了
  • python做网站快吗网易企业邮箱密码格式要求
  • 广州企业网站建设报价哪里有免费的网站推广软件啊
  • 阜宁建设网站的公司互联网保险名词解释
  • 漯河网站建设兼职足球梦网站建设的基本思路
  • 西安门户网站开发南昌网络营销外包公司
  • 企业建站框架网站版心怎么做
  • 科技 网站建设html静态页面的制作
  • 小说网站建设源码移动网站源码
  • 设计数码产品宣传网站上海好的seo公司
  • 哪些网站是做免费推广的广州网络推广公司
  • 怎样向网站上传照片萤栈WordPress
  • php做网站常见实例百度商业平台
  • 海淀商城网站建设哪个公司的手机网络最好
  • 长春如何建立一个平台网站建立平台什么意思
  • 郑州网站推广 汉狮网络太原建站模板系统
  • 国内最大的自建站平台网站怎么建
  • 手表网站错误怎么办做360网站首页软件
  • 自己做的网站怎么接入数据库深圳网站制作哪里济南兴田德润简介
  • 搬瓦工可以长期做网站网站建设推广信息
  • 泰州网站制作专业网页制作与网站开发从入门到精通 下载
  • 网站建设松江公司wordpress multisite
  • 网站开发行业资讯wap网站什么意思
  • 淘客做网站还是做app腾讯云远程安装wordpress
  • 新手建设网站wdcp wordpress伪静态
  • phpcms网站logo阿里域名注册网站
  • 义乌网站搭建网站备案通过之后