爱比较的粉丝
本帖最后由 爱比较的粉丝 于 2023-5-21 11:21 编辑

GtNative动态的字节码修改工具
(这个类使用到了jvmti1.2也就是说这个工具类只支持java1.8的java版本)







一.使用GtNative的注意事项     1.这个工具是通过jvmti实现的字节码修改工具请你不要对java字节码恶意破坏后果自负2.使用这个类的热修改方法来修改的字节码不能改变类原有架构3.禁止使用这个工具类做任何违法国家法律是事,请遵守相关规定如有违规后果自负4.这个类只支持JAVA_1.8和支持JVMTI_1.2的其他JAVA版本二.类内方法接受public void setInjectMixinHook(long pid){
    if (setDll) {
        if (!setHook) {
            InjectMixinHook(pid);
            setHook = true;
        } else {
            LOGGER.info("You've already set setInject");
        }
    } else {
        LOGGER.info("The dynamic-link library (DLL) is not loading");
    }
}复制代码

• 这个方法可以通过注入设置他自己的JVMTI/**
     * If the virtual machine has the MixinHoo capability enabled, bytecode is injected
     * @param jclass Inject target
     * @param ByteClass The bytecode that injects the class number
     */
    public void InjectBytecode(Class jclass, byte[] ByteClass){
        if (setDll) {
            if (setHook) {
                DynamicLoadingClass(jclass, ByteClass);
            } else {
                LOGGER.info("You didn't set up Inject");
            }
        } else {
            LOGGER.info("The dynamic-link library (DLL) is not loading");
        }
    }复制代码• 如果虚拟机启用了JVMTI功能,则会注入字节码如果没有输出“You didn't set up Inject”/**
     * Sets the classloader for the current thread
     * @param loader Sets classloader
     */

    public void setThreadClassLoader(ClassLoader loader){
        if (setDll) {
            if (setHook) {
                setClassLoader(loader);
            } else {
                LOGGER.info("You didn't set up Inject");
            }
        } else {
            LOGGER.info("The dynamic-link library (DLL) is not loading");
        }
    }复制代码• 为当前线程设置类加载器
/**
     * Ability to uninstall
     */
    public void uninstallYourself(){
        if (setDll) {
            if (setHook) {
                unloadJavaAgent();
            } else {
                LOGGER.info("You didn't set up Inject");
            }
        } else {
            LOGGER.info("The dynamic-link library (DLL) is not loading");
        }
    }复制代码• 卸载JVMTI能力public void loadAgent(String agent,boolean javaAgent) throws IOException {
        if (setDll) {
            if (setHook) {
                if (!javaAgent) {
                    loadAgent(agent);
                    return;
                }
                GtVirtualMachine.loadAgentLibrary(agent,null);
            } else {
                LOGGER.info("You didn't set up Inject");
            }
        } else {
            LOGGER.info("The dynamic-link library (DLL) is not loading");
        }
    }复制代码• 如果加载代理程序是java代理程序由GtVirtualMachine(tools.jar)处理如果没有,它将被loadAgent处理/**
     * Get all the classes that the virtual machine has loaded
     * [url=home.php?mod=space&uid=491268]@Return[/url] The virtual machine has loaded the class
     */
    public Class[] getJVMLoadedClass(){
        if (setDll) {
            if (setHook) {
                return getClassesThatJVMLoaded();
            } else {
                LOGGER.info("You didn't set up Inject");
                return null;
            }
        } else {
            LOGGER.info("The dynamic-link library (DLL) is not loading");
            return null;
        }
    }复制代码• 他可以获取当前jvm加载的所有类
[/spoiler]


三.关于热修改报错的解决方法
GtNative报错解决方法1.热修改报错:JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误通常不是由字节码本身的错误引起的。这个错误是由于 JVM 中的类布局与 JVMTI 期望的布局不匹配引起的。这种不匹配通常是由于在热修改期间,类文件被其他工具或操作更改而导致的。
例如,可能会在热修改期间使用不同版本的编译器重新编译类文件,或者手动更改了类的继承层次结构。这些更改可能会导致类布局与JVMTI预期的布局不匹配,从而导致 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误。
因此,要解决此问题,需要使用与 JVMTI 兼容的 Java 编译器重新编译类文件,并在进行热修改之前备份原始的类文件。此外,在热修改期间不应该对类文件进行其他更改,以避免不匹配的情况发生。
2.热修改报错:JVMTI_ERROR_INVALID_CLASS_FORMAT
JVMTI_ERROR_INVALID_CLASS_FORMAT错误通常表示JVMTI在加载或重定义类时遇到了无效的类文件格式。
具体来说,这可能是由以下原因之一引起的:
类文件损坏或不完整,可能是由于编译器错误、磁盘故障或传输错误等原因导致的。类文件版本不受JVM支持,例如使用了过时的Java版本编译的类文件。类文件包含不支持的操作码或未定义的常量池项等问题,这可能是由于编译器错误或类文件篡改等原因引起的。要解决此错误,可以尝试以下几种方法:
检查类文件是否存在损坏或不完整,例如使用可用的校验工具(如javap -v)检查类文件。确保使用与JVM版本兼容的Java编译器编译类文件。尝试使用不同的JVM版本加载类文件。如果尝试重定义类,则可以考虑使用Instrumentation API来代替JVMTI,以确保类文件格式正确。
——————————————————————后面是盘点的GtNative热修改报错的解决方法和报错的错误信息JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCENARIO:表示当前的热修改方案不受JVMTI支持。解决方法是使用JVMTI支持的热修改方案。
JVMTI_ERROR_CLASS_NOT_PREPARED:表示尝试修改尚未准备好的类。解决方法是等待类加载完成后再进行修改。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED:表示在热修改期间添加了新的方法。解决方法是在重定义类之前移除新的方法。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED:表示在热修改期间删除了方法。解决方法是在重定义类之前恢复被删除的方法。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED:表示在热修改期间更改了方法的修饰符。解决方法是在重定义类之前恢复被更改的方法。
JVMTI_ERROR_INVALID_CLASS_FORMAT:表示类文件格式无效。解决方法是修复或重新生成类文件,或者使用与JVMTI兼容的Java编译器重新编译类文件。
JVMTI_ERROR_NATIVE_METHOD:表示尝试修改本地方法。解决方法是避免修改本地方法。
JVMTI_ERROR_OUT_OF_MEMORY:表示内存不足。解决方法是增加JVMTI堆的大小或减少重定义的类的数量。
JVMTI_ERROR_INTERNAL:表示JVMTI内部错误。解决方法是使用最新的JVM或JVMTI版本,并在必要时报告问题。
JVMTI_ERROR_NULL_POINTER:表示发生了空指针异常。解决方法是检查代码中可能引用空指针的地方,并进行修复。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED:表示在热修改期间更改了类的修饰符。解决方法是避免更改类的修饰符,或者在重定义类之前恢复被更改的类的修饰符。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED:表示在热修改期间更改了类的继承关系。解决方法是避免更改类的继承关系,或者在重定义类之前恢复被更改的类的继承关系。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_ARRAY_TYPE_CHANGED:表示在热修改期间更改了数组类型。解决方法是避免更改数组类型,或者在重定义类之前恢复被更改的数组类型。
JVMTI_ERROR_ILLEGAL_ARGUMENT:表示传递给JVMTI的参数无效。解决方法是检查参数的值,并进行修复或更改。
JVMTI_ERROR_UNSUPPORTED_VERSION:表示JVMTI版本不受JVM支持。解决方法是使用与JVM版本兼容的JVMTI版本。
——————————————————————关于困扰大家的JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED报错1.JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED报错一直出现JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误可能会一直出现,因为在 JVM 中进行热修改时,一旦出现不匹配的情况,JVMTI 就会拒绝重定义类,然后返回该错误。如果问题没有得到解决,那么每次尝试进行热修改时都会出现该错误。
常见的出现 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误的情况包括:
在重定义类之前对类文件进行其他修改使用不兼容的编译器重新编译类文件使用不同版本的 JDK 运行 JVM 和 JVMTI在进行热修改之前未备份原始类文件在重定义类之前未替换原始的类文件为了解决此问题,您可以尝试以下步骤:
使用与 JVMTI 兼容的编译器重新编译类文件备份原始类文件,并避免在重定义类期间对类文件进行其他修改确保使用相同版本的 JDK 运行 JVM 和 JVMTI在重定义类之前替换原始类文件确认您正在使用的 JVMTI 函数与您正在重定义的类的版本兼容如果您无法解决该问题,请考虑使用其他工具或方法,例如重新启动 JVM 或使用类加载器机制来加载新版本的类。
2.解决方法要解决 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误,可以尝试以下一些方法:备份原始类文件:在进行热修改之前,备份原始类文件,并确保在热修改期间不对该文件进行任何其他修改。使用与 JVMTI 兼容的编译器重新编译类文件:确保使用与 JVMTI 兼容的编译器重新编译类文件。不同版本的编译器可能会生成不同的类布局,从而导致 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误。使用相同版本的 JDK 运行 JVM 和 JVMTI:确保使用相同版本的 JDK 运行 JVM 和 JVMTI,以确保二者之间的兼容性。在重定义类之前替换原始类文件:在重定义类之前,将原始类文件替换为您要修改的新版本。如果您尝试在 JVM 中重定义的类与类文件不匹配,将会出现 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误。使用相同的 JVMTI 函数版本:确保您正在使用的 JVMTI 函数与您正在重定义的类的版本兼容。不同版本的 JVMTI 函数可能会生成不同的类布局,从而导致 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误。重新启动 JVM:如果您无法解决 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误,可以尝试重新启动 JVM。这将重新加载所有类文件,并重新初始化 JVM 和 JVMTI。总之,要避免 JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 错误,必须确保类文件的版本与 JVMTI 期望的类布局匹配,并避免在进行热修改期间对类文件进行任何其他修改。





GtNative报错解决方法.txt

(7.66 KB, 下载次数: 0)











四.下载安装方法1.下载(链接:https://pan.baidu.com/s/1mfEiTwhJz8yxdH2jV9dKAg?pwd=1145)!!!GtNative Dynamic bytecode modification tool2.0.0!!!.zip2.在build.gradle中的添加 dependencies {复制代码3.重新构建
五.压缩包密码关注:https://space.bilibili.com/1163501280私信他

第一页 上一页 下一页 最后一页