From 4ef714514851669179782c57749261cb6a581459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=98=E4=B8=8D=E5=A6=82=E4=B8=80=E5=8F=AA=E7=8C=AA?= =?UTF-8?q?=E5=A8=81=E6=AD=A6?= Date: Tue, 20 Feb 2024 17:35:32 +0800 Subject: [PATCH] init --- demo/pom.xml | 17 ++++++ demo/src/main/java/com/seele/Main.java | 29 +++++++++ demo/src/main/java/com/seele/Trans.java | 7 +++ simple_agent/pom.xml | 56 ++++++++++++++++++ .../src/main/java/com/seele/AttachMain.java | 16 +++++ .../src/main/java/com/seele/SimpleAgent.java | 28 +++++++++ .../src/main/java/com/seele/Trans.class | Bin 0 -> 336 bytes .../src/main/java/com/seele/Transformer.java | 46 ++++++++++++++ 8 files changed, 199 insertions(+) create mode 100644 demo/pom.xml create mode 100644 demo/src/main/java/com/seele/Main.java create mode 100644 demo/src/main/java/com/seele/Trans.java create mode 100644 simple_agent/pom.xml create mode 100644 simple_agent/src/main/java/com/seele/AttachMain.java create mode 100644 simple_agent/src/main/java/com/seele/SimpleAgent.java create mode 100644 simple_agent/src/main/java/com/seele/Trans.class create mode 100644 simple_agent/src/main/java/com/seele/Transformer.java diff --git a/demo/pom.xml b/demo/pom.xml new file mode 100644 index 0000000..2f5a1f6 --- /dev/null +++ b/demo/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + com.seele + demo + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/demo/src/main/java/com/seele/Main.java b/demo/src/main/java/com/seele/Main.java new file mode 100644 index 0000000..27b8259 --- /dev/null +++ b/demo/src/main/java/com/seele/Main.java @@ -0,0 +1,29 @@ +package com.seele; + +public class Main { + + public int print(int i) { + System.out.println("i: " + i); + try { + Thread.sleep(1000); + }catch (InterruptedException e){ + e.printStackTrace(); + } + return i + 2; + } + public void run(){ + int i = new Trans().getNumber(); + while (i < 1000){ + try{ + i = print(i); + }catch (Exception e){ + e.printStackTrace(); + } + } + } + + public static void main(String[] args) { + Main main = new Main(); + main.run(); + } +} \ No newline at end of file diff --git a/demo/src/main/java/com/seele/Trans.java b/demo/src/main/java/com/seele/Trans.java new file mode 100644 index 0000000..b459331 --- /dev/null +++ b/demo/src/main/java/com/seele/Trans.java @@ -0,0 +1,7 @@ +package com.seele; + +public class Trans { + public int getNumber() { + return 1; + } +} diff --git a/simple_agent/pom.xml b/simple_agent/pom.xml new file mode 100644 index 0000000..c319484 --- /dev/null +++ b/simple_agent/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.seele + simple_agent + 1.0 + + + 21 + 21 + UTF-8 + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + jar-with-dependencies + + + + + + + neo + com.seele.SimpleAgent + com.seele.SimpleAgent + + true + true + + + + + + + make-assembly + package + + single + + + + + + + + + \ No newline at end of file diff --git a/simple_agent/src/main/java/com/seele/AttachMain.java b/simple_agent/src/main/java/com/seele/AttachMain.java new file mode 100644 index 0000000..82fc5ab --- /dev/null +++ b/simple_agent/src/main/java/com/seele/AttachMain.java @@ -0,0 +1,16 @@ +package com.seele; + +import com.sun.tools.attach.AgentInitializationException; +import com.sun.tools.attach.AgentLoadException; +import com.sun.tools.attach.AttachNotSupportedException; +import com.sun.tools.attach.VirtualMachine; + +import java.io.IOException; + +public class AttachMain { + + public static void main(String[] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException { + VirtualMachine vm = VirtualMachine.attach("15168"); + vm.loadAgent("D:\\Code\\learn\\java_agent\\simple_agent\\target\\simple_agent-1.0-jar-with-dependencies.jar"); + } +} diff --git a/simple_agent/src/main/java/com/seele/SimpleAgent.java b/simple_agent/src/main/java/com/seele/SimpleAgent.java new file mode 100644 index 0000000..8ee3b18 --- /dev/null +++ b/simple_agent/src/main/java/com/seele/SimpleAgent.java @@ -0,0 +1,28 @@ +package com.seele; + +import java.lang.instrument.Instrumentation; + +public class SimpleAgent { + + /** + * jvm 参数形式 + * + * @param agentArgs + * @param inst + */ + public static void premain(String agentArgs, Instrumentation inst) { + System.out.println("premain"); + inst.addTransformer(new Transformer()); + } + + /** + * attach 方式形式 + * + * @param agentArgs + * @param inst + */ + public static void agentmain(String agentArgs, Instrumentation inst) { + System.out.println("agentmain"); + } + +} diff --git a/simple_agent/src/main/java/com/seele/Trans.class b/simple_agent/src/main/java/com/seele/Trans.class new file mode 100644 index 0000000000000000000000000000000000000000..ceab02a952dd6a4294df0d49eef9e9508fda4c39 GIT binary patch literal 336 zcmZ8b%}T>y5S-0VV`Kl{z?(|(djLg{f*^$U(9-*txYVzt38bk{<;7FMgAd?CNq19G z=^kd7-JRX}`u_L?@PJVa4}OH8gAgskU~ONm$!)PRvvkc_O=#V@!qxW#|MF@X;f&DF z%8l7F=WG_0Ew+SUQa-Z`5?Anaw@JBL*ff{UC@C|WFKy*i|1^X8#ffQ{oZPu3v{zgo z4>bRt2=Tn!RT)1zJr_6sZZsq=5J`3|52Wb@+oFsx35VBv(0enE1$7MgI2Y_37lgZ_ c2tD)#)jSr~JuiGy#Gf<#=k$J^gJx@Z0E>D!{r~^~ literal 0 HcmV?d00001 diff --git a/simple_agent/src/main/java/com/seele/Transformer.java b/simple_agent/src/main/java/com/seele/Transformer.java new file mode 100644 index 0000000..3bb6202 --- /dev/null +++ b/simple_agent/src/main/java/com/seele/Transformer.java @@ -0,0 +1,46 @@ +package com.seele; + +import java.io.*; +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.IllegalClassFormatException; +import java.security.ProtectionDomain; + +public class Transformer implements ClassFileTransformer { + + private static String classNumberReturn2 = "D:\\Code\\learn\\java_agent\\simple_agent\\src\\main\\java\\com\\seele\\Trans.class"; + + private static byte[] getBytesFromFile(String filename) { + try { + File file = new File(filename); + InputStream is = new FileInputStream(file); + long length = file.length(); + byte[] bytes = new byte[(int) length]; + + int offset = 0; + int numRead = 0; + while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { + offset += numRead; + } + + if (offset < bytes.length) { + throw new IOException("Could not completely read file." + filename); + } + is.close(); + return bytes; + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public byte[] transform(ClassLoader loader, String className, + Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) + throws IllegalClassFormatException { + if (!className.equals("com/seele/Trans")) { + return ClassFileTransformer.super.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer); + } + return getBytesFromFile(classNumberReturn2); + } +}