{"schemaVersion":"1.0","type":"Article","types":["Article"],"slug":"changing-java-class-names-at-runtime-with-javassist-6pfy0","url":"https://zyvop.com/changing-java-class-names-at-runtime-with-javassist-6pfy0","title":"Changing Java Class Names at Runtime with Javassist","subtitle":null,"tldr":"Jhook: package com.binklac.jhook; import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; import java.lang.reflect....","keywords":[],"entities":["I0veD","cyber security researcher","ZyVOP"],"keyTakeaways":["Jhook: package com.binklac.jhook; import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; import java.lang.reflect.Field; import java.util.HashMap; public class JHook { private static JHook SelfInstance = null; private static Class&lt;?&gt; GlobalInstance = null; private static Class&lt;?&gt; GlobalAgent = null; private static final JHookTransformer HookTransformer = new JHookTransformer(); private static final HashMap&lt;String, byte[]&gt; ModifyMap = new HashMap&lt;&gt;(); private JHook() { } public synchronized static JHook Instance() { if(SelfInstance == null){ try { SelfInstance = new JHook(); if (SelfInstance.getClass().getClassLoader().equals(ClassLoader.getSystemClassLoader())) { Boolean LoadSystemLibraryResult = JHookDynamicallyLoader.TryLoadSystemLibrary(); Boolean InitializeJHookEnvironmentResult = JHookAgentLoader.InitializeJHookEnvironment(); if (!(LoadSystemLibraryResult &amp;amp;&amp;amp; InitializeJHookEnvironmentResult)) { SelfInstance = null; } GlobalInstance = SelfInstance.getClass(); } else { GlobalInstance = Class.forName(JHook.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } } catch(ClassNotFoundException e) { try { Boolean LoadSystemLibraryResult = JHookDynamicallyLoader.TryLoadSystemLibrary(); Boolean InitializeJHookEnvironmentResult = JHookAgentLoader.InitializeJHookEnvironment(); if (!(LoadSystemLibraryResult &amp;amp;&amp;amp; InitializeJHookEnvironmentResult)) { SelfInstance = null; } GlobalInstance = Class.forName(JHook.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } catch (ClassNotFoundException ex) { SelfInstance = null; } } } return SelfInstance; } protected byte[] GetModifyClass(String Name) { try { Field GlobalModifyMap = GlobalInstance.getDeclaredField(&amp;quot;ModifyMap&amp;quot;); GlobalModifyMap.setAccessible(true); HashMap&amp;lt;String, byte[]&amp;gt; GModifyMap = (HashMap&amp;lt;String, byte[]&amp;gt;) GlobalModifyMap.get(null); return GModifyMap.remove(Name); } catch (Exception e) { return null; } } public Boolean ModifyClass(String className, byte[] newClassBytes) { try { Class&amp;lt;?&amp;gt; clazz = Class.forName(className); if(GlobalAgent == null) { GlobalAgent = Class.forName(JHookAgent.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } Field instrumentationField = GlobalAgent.getDeclaredField(&amp;quot;instrumentation&amp;quot;); instrumentationField.setAccessible(true); Instrumentation instrumentation = (Instrumentation) instrumentationField.get(null); Field globalModifyMapField = GlobalInstance.getDeclaredField(&amp;quot;ModifyMap&amp;quot;); globalModifyMapField.setAccessible(true); HashMap&amp;lt;String, byte[]&amp;gt; modifyMap = (HashMap&amp;lt;String, byte[]&amp;gt;) globalModifyMapField.get(null); if (instrumentation != null &amp;amp;&amp;amp; instrumentation.isModifiableClass(clazz)) { modifyMap.put(clazz.getCanonicalName(), newClassBytes); instrumentation.addTransformer(HookTransformer, true); instrumentation.retransformClasses(clazz); while (modifyMap.get(clazz.getCanonicalName()) != null) { Thread.sleep(1); } instrumentation.removeTransformer(HookTransformer); return true; } return false; } catch (UnmodifiableClassException | InterruptedException | ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return false; } } public Instrumentation getInstrumentation() { try { if (GlobalAgent == null) { GlobalAgent = Class.forName(JHookAgent.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } Field instrumentationField = GlobalAgent.getDeclaredField(&amp;quot;instrumentation&amp;quot;); instrumentationField.setAccessible(true); return (Instrumentation) instrumentationField.get(null); } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return null; } } } jhookclassname_change package com.binklac.jhook.test; import com.binklac.jhook.JHook; import com.binklac.jhook.Utils; import javassist.*; import java.io.IOException; import java.lang.instrument.Instrumentation; public class JHookClassNameChanger { public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException { if (args.length != 2) { System.out.println(\"Usage: java com.binklac.jhook.test.JHookClassNameChanger &lt;oldClassName&gt; &lt;newClassName&gt;\"); return; } String oldClassName = args[0]; String newClassName = args[1]; System.out.println(&amp;quot;[#] JHook operating environment check.&amp;quot;); ClassPool defaultClassPool = ClassPool.getDefault(); defaultClassPool.appendClassPath(Utils.GetJHookJarPath()); try { Instrumentation instrumentation = JHook.Instance().getInstrumentation(); if (instrumentation == null) { System.out.println(&amp;quot;[X] Instrumentation is null.","Ensure JHook is properly initialized.&amp;quot;); return; } Class&amp;lt;?&amp;gt;[] allLoadedClasses = instrumentation.getAllLoadedClasses(); for (Class&amp;lt;?&amp;gt; clazz : allLoadedClasses) { if (clazz.getName().equals(oldClassName)) { CtClass ctClass = defaultClassPool.get(oldClassName); ctClass.setName(newClassName); byte[] modifiedClassBytes = ctClass.toBytecode(); if (!JHook.Instance().ModifyClass(oldClassName, modifiedClassBytes)) { System.out.println(&amp;quot;[X] Failed to modify class: &amp;quot; + oldClassName); } else { System.out.println(&amp;quot;[#] Successfully modified class: &amp;quot; + oldClassName + &amp;quot; to &amp;quot; + newClassName); } } } } catch (Exception e) { e.printStackTrace(); System.out.println(&amp;quot;[X] An error occurred during class modification.&amp;quot;); } } }."],"headings":[],"outboundLinks":[],"contentText":"Jhook: package com.binklac.jhook; import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; import java.lang.reflect.Field; import java.util.HashMap; public class JHook { private static JHook SelfInstance = null; private static Class&lt;?&gt; GlobalInstance = null; private static Class&lt;?&gt; GlobalAgent = null; private static final JHookTransformer HookTransformer = new JHookTransformer(); private static final HashMap&lt;String, byte[]&gt; ModifyMap = new HashMap&lt;&gt;(); private JHook() { } public synchronized static JHook Instance() { if(SelfInstance == null){ try { SelfInstance = new JHook(); if (SelfInstance.getClass().getClassLoader().equals(ClassLoader.getSystemClassLoader())) { Boolean LoadSystemLibraryResult = JHookDynamicallyLoader.TryLoadSystemLibrary(); Boolean InitializeJHookEnvironmentResult = JHookAgentLoader.InitializeJHookEnvironment(); if (!(LoadSystemLibraryResult &amp;amp;&amp;amp; InitializeJHookEnvironmentResult)) { SelfInstance = null; } GlobalInstance = SelfInstance.getClass(); } else { GlobalInstance = Class.forName(JHook.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } } catch(ClassNotFoundException e) { try { Boolean LoadSystemLibraryResult = JHookDynamicallyLoader.TryLoadSystemLibrary(); Boolean InitializeJHookEnvironmentResult = JHookAgentLoader.InitializeJHookEnvironment(); if (!(LoadSystemLibraryResult &amp;amp;&amp;amp; InitializeJHookEnvironmentResult)) { SelfInstance = null; } GlobalInstance = Class.forName(JHook.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } catch (ClassNotFoundException ex) { SelfInstance = null; } } } return SelfInstance; } protected byte[] GetModifyClass(String Name) { try { Field GlobalModifyMap = GlobalInstance.getDeclaredField(&amp;quot;ModifyMap&amp;quot;); GlobalModifyMap.setAccessible(true); HashMap&amp;lt;String, byte[]&amp;gt; GModifyMap = (HashMap&amp;lt;String, byte[]&amp;gt;) GlobalModifyMap.get(null); return GModifyMap.remove(Name); } catch (Exception e) { return null; } } public Boolean ModifyClass(String className, byte[] newClassBytes) { try { Class&amp;lt;?&amp;gt; clazz = Class.forName(className); if(GlobalAgent == null) { GlobalAgent = Class.forName(JHookAgent.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } Field instrumentationField = GlobalAgent.getDeclaredField(&amp;quot;instrumentation&amp;quot;); instrumentationField.setAccessible(true); Instrumentation instrumentation = (Instrumentation) instrumentationField.get(null); Field globalModifyMapField = GlobalInstance.getDeclaredField(&amp;quot;ModifyMap&amp;quot;); globalModifyMapField.setAccessible(true); HashMap&amp;lt;String, byte[]&amp;gt; modifyMap = (HashMap&amp;lt;String, byte[]&amp;gt;) globalModifyMapField.get(null); if (instrumentation != null &amp;amp;&amp;amp; instrumentation.isModifiableClass(clazz)) { modifyMap.put(clazz.getCanonicalName(), newClassBytes); instrumentation.addTransformer(HookTransformer, true); instrumentation.retransformClasses(clazz); while (modifyMap.get(clazz.getCanonicalName()) != null) { Thread.sleep(1); } instrumentation.removeTransformer(HookTransformer); return true; } return false; } catch (UnmodifiableClassException | InterruptedException | ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return false; } } public Instrumentation getInstrumentation() { try { if (GlobalAgent == null) { GlobalAgent = Class.forName(JHookAgent.class.getCanonicalName(), false, ClassLoader.getSystemClassLoader()); } Field instrumentationField = GlobalAgent.getDeclaredField(&amp;quot;instrumentation&amp;quot;); instrumentationField.setAccessible(true); return (Instrumentation) instrumentationField.get(null); } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return null; } } } jhookclassname_change package com.binklac.jhook.test; import com.binklac.jhook.JHook; import com.binklac.jhook.Utils; import javassist.*; import java.io.IOException; import java.lang.instrument.Instrumentation; public class JHookClassNameChanger { public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException { if (args.length != 2) { System.out.println(\"Usage: java com.binklac.jhook.test.JHookClassNameChanger &lt;oldClassName&gt; &lt;newClassName&gt;\"); return; } String oldClassName = args[0]; String newClassName = args[1]; System.out.println(&amp;quot;[#] JHook operating environment check.&amp;quot;); ClassPool defaultClassPool = ClassPool.getDefault(); defaultClassPool.appendClassPath(Utils.GetJHookJarPath()); try { Instrumentation instrumentation = JHook.Instance().getInstrumentation(); if (instrumentation == null) { System.out.println(&amp;quot;[X] Instrumentation is null. Ensure JHook is properly initialized.&amp;quot;); return; } Class&amp;lt;?&amp;gt;[] allLoadedClasses = instrumentation.getAllLoadedClasses(); for (Class&amp;lt;?&amp;gt; clazz : allLoadedClasses) { if (clazz.getName().equals(oldClassName)) { CtClass ctClass = defaultClassPool.get(oldClassName); ctClass.setName(newClassName); byte[] modifiedClassBytes = ctClass.toBytecode(); if (!JHook.Instance().ModifyClass(oldClassName, modifiedClassBytes)) { System.out.println(&amp;quot;[X] Failed to modify class: &amp;quot; + oldClassName); } else { System.out.println(&amp;quot;[#] Successfully modified class: &amp;quot; + oldClassName + &amp;quot; to &amp;quot; + newClassName); } } } } catch (Exception e) { e.printStackTrace(); System.out.println(&amp;quot;[X] An error occurred during class modification.&amp;quot;); } } }","contentHash":"sha256:a06ccd3d1672cd7acfa8a08177fd9b9e765bb2314eafb6c15bb3bb620c22ed5d","authorName":"I0veD","authorUrl":"https://zyvop.com/author/i0ved","authorSameAs":["https://www.cdxiaodong.life/","https://github.com/cdxiaodong","https://www.linkedin.com/in/%E6%A0%8B-%E7%A8%8B-167b89391/"],"category":null,"tags":[],"audience":"Developers, software engineers, and students learning software development","tone":"Professional, cyber security researcher perspective","readingTimeMinutes":3,"wordCount":569,"faqs":null,"primaryTopic":null,"publishedAt":"2026-08-12T05:23:58.909Z","updatedAt":"2026-08-27T10:00:00.229Z","canonicalUrl":"https://www.cdxiaodong.life/article/java_modify_class_name"}