Transcript
Page 1: Mastering java bytecode with ASM - GeeCON 2012

Mastering Java Bytecode with ASMLearn some bytecode to yourself!

Page 2: Mastering java bytecode with ASM - GeeCON 2012

whoami

Anton ArhipovJava Dev / Product LeadZeroTurnaround, JRebelMessing with bytecode since 2010

[email protected] @antonarhipov @javarebel

Page 3: Mastering java bytecode with ASM - GeeCON 2012

whoami

Anton ArhipovJava Dev / Product LeadZeroTurnaround, JRebelMessing with bytecode since 2010

[email protected] @antonarhipov @javarebel

Page 4: Mastering java bytecode with ASM - GeeCON 2012

Why Bytecode?

• Know your platform!• Build your own JVM language?• Programming models (AOP, ORM)• Awesome tools (like JRebel )

... just bored?

Page 5: Mastering java bytecode with ASM - GeeCON 2012

Bytecode 101

javap ObjectWeb ASMInstrumentation API

Page 6: Mastering java bytecode with ASM - GeeCON 2012

Bytecode 101Gentle introduction

Page 7: Mastering java bytecode with ASM - GeeCON 2012

A + B

Adding Two Values

Page 8: Mastering java bytecode with ASM - GeeCON 2012

A + BA B +

Adding Two Values

Page 9: Mastering java bytecode with ASM - GeeCON 2012

A + BA B +

Adding Two Values

Page 10: Mastering java bytecode with ASM - GeeCON 2012

A + BA B +

Adding Two Values

PUSH A A

Page 11: Mastering java bytecode with ASM - GeeCON 2012

A + BA B +

Adding Two Values

BPUSH 1PUSH 2

A

Page 12: Mastering java bytecode with ASM - GeeCON 2012

A + BA B +

Adding Two Values

PUSH 1PUSH 2ADD

15

Page 13: Mastering java bytecode with ASM - GeeCON 2012

A + BA B +

Adding Two Values

15ICONST_1ICONST_2IADD

Page 14: Mastering java bytecode with ASM - GeeCON 2012

• <TYPE> ::= b, s, c, i, l, f, d, a• constant values (ldc, iconst_1)• Local variables and stack interaction (load/store)• Array operations (aload, astore)• Math (add, sub, mul, div)• Boolean/bitwise operations (iand, ixor)• Comparisons & branching (cmpl, ifeq, jsr, tableswitch)• Conversions (l2d, i2l)

OPERATIONTYPE

Page 15: Mastering java bytecode with ASM - GeeCON 2012

Model of Execution

Page 16: Mastering java bytecode with ASM - GeeCON 2012

Enter JVM

JVM process

Page 17: Mastering java bytecode with ASM - GeeCON 2012

Enter Threads

Thread A Thread B Thread C Thread D

Page 18: Mastering java bytecode with ASM - GeeCON 2012

Enter Frames

Page 19: Mastering java bytecode with ASM - GeeCON 2012

The Frame

Operand stack

Local variables

20 1 N…

Constant Pool

#1

Page 20: Mastering java bytecode with ASM - GeeCON 2012

Juggling The Stack

Page 21: Mastering java bytecode with ASM - GeeCON 2012

AB

duppopswapdup_x1dup2_x1

Juggling The Stack

Page 22: Mastering java bytecode with ASM - GeeCON 2012

A

B

duppopswapdup_x1dup2_x1

A

Juggling The Stack

Page 23: Mastering java bytecode with ASM - GeeCON 2012

duppopswapdup_x1dup2_x1

AB

Juggling The Stack

Page 24: Mastering java bytecode with ASM - GeeCON 2012

duppopswapdup_x1dup2_x1

AB

Juggling The Stack

Page 25: Mastering java bytecode with ASM - GeeCON 2012

duppopswapdup_x1dup2_x1

AB

B

Juggling The Stack

Page 26: Mastering java bytecode with ASM - GeeCON 2012

duppopswapdup_x1dup2_x1

AB

BBA

Juggling The Stack

Page 27: Mastering java bytecode with ASM - GeeCON 2012

Local Variables

Page 28: Mastering java bytecode with ASM - GeeCON 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stackvar value

Local Variables

0

1

2

3

4

0

1

2

3

4

Page 29: Mastering java bytecode with ASM - GeeCON 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth valuevar value

"Hello"0

1

2

3

4

0

1

2

3

4

StackLocal Variables

Page 30: Mastering java bytecode with ASM - GeeCON 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth valuevar value

"Hello"0

1

2

3

4

0

1

2

3

4

StackLocal Variables

Page 31: Mastering java bytecode with ASM - GeeCON 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth valuevar value

"Hello"0

1

2

3

4

0

1

2

3

4

1

StackLocal Variables

Page 32: Mastering java bytecode with ASM - GeeCON 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth valuevar value

"Hello"0

1

2

3

4

0

1

2

3

4

1

StackLocal Variables

Page 33: Mastering java bytecode with ASM - GeeCON 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth valuevar value

"Hello"0

1

2

3

4

0

1

2

3

4

1

"Hello"

StackLocal Variables

Page 34: Mastering java bytecode with ASM - GeeCON 2012

StackLocal

Variables Table

store

load

Page 35: Mastering java bytecode with ASM - GeeCON 2012

Method Invoсation

Page 36: Mastering java bytecode with ASM - GeeCON 2012

Method Invocation

obj.method(param1, param2);

Page 37: Mastering java bytecode with ASM - GeeCON 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2invoke method

Page 38: Mastering java bytecode with ASM - GeeCON 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2invoke method

obj

Page 39: Mastering java bytecode with ASM - GeeCON 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2invoke method

obj

param1

Page 40: Mastering java bytecode with ASM - GeeCON 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2invoke method

obj

param1

param2

Page 41: Mastering java bytecode with ASM - GeeCON 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2invoke method

obj?

Page 42: Mastering java bytecode with ASM - GeeCON 2012

Operator Overloading

Page 43: Mastering java bytecode with ASM - GeeCON 2012

Operator Overloading

A + B A.plus(B)[Foo][int]

Page 44: Mastering java bytecode with ASM - GeeCON 2012

Operator Overloading

A + B A.plus(B)

push Apush Biadd

[int] [Foo]

push Apush Binvokevirtual plus

Page 45: Mastering java bytecode with ASM - GeeCON 2012

Operator Overloading

A + B A + B

push Apush Biadd

push Apush Binvokevirtual plus

[int] [Foo]

Page 46: Mastering java bytecode with ASM - GeeCON 2012

Stack

pop push

Page 47: Mastering java bytecode with ASM - GeeCON 2012

Stack

Local Variable

s Table

store

load

pop push

Page 48: Mastering java bytecode with ASM - GeeCON 2012

Stack

Local Variable

s Table

store

load

pop push

Page 49: Mastering java bytecode with ASM - GeeCON 2012

Stack

Local Variable

s Table

store

load

pop push

Stack

Local Variable

s Table

store

load

pop push

invoke

Page 50: Mastering java bytecode with ASM - GeeCON 2012

javapThe disassembler

Page 51: Mastering java bytecode with ASM - GeeCON 2012

javap

• Java class file disassembler• Used with no options shows class structure only– Methods, superclass, interfaces, etc

• -c shows the bytecode• -private shows all methods and members• -s prints internal signatures• -l prints line numbers and local variable tables• -verbose for verbosity

Page 52: Mastering java bytecode with ASM - GeeCON 2012
Page 53: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -c

Page 54: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

the default constructor

Page 55: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

push this to stack

Page 56: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

invoke <init> on this

Page 57: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

super()

Page 58: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

Page 59: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

Page 60: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

get static field

Page 61: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

load string to the stack

Page 62: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

invoke method with parameter

Page 63: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

Page 64: Mastering java bytecode with ASM - GeeCON 2012

C:\work\geecon\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return

public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

What’s #1,#2, etc ?

Page 65: Mastering java bytecode with ASM - GeeCON 2012

SLIDESGOTO: IDESLIDESIDE: JAVAP DEMO

Page 66: Mastering java bytecode with ASM - GeeCON 2012

ASMThe de facto standard for bytecode manipulation

Page 67: Mastering java bytecode with ASM - GeeCON 2012

ASM

• “All purpose bytecode manipulation and analysis framework”• De facto standard bytecode library• http://asm.ow2.org

Page 68: Mastering java bytecode with ASM - GeeCON 2012

Basic Process

• Construct ClassWriter• Stack up the visitors for:• annotations, methods, fields, etc

• Write out bytes

Page 69: Mastering java bytecode with ASM - GeeCON 2012

Hello.java

Page 70: Mastering java bytecode with ASM - GeeCON 2012

ClassWriter

ClassWriter cw = new ClassWriter( ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

Page 71: Mastering java bytecode with ASM - GeeCON 2012

COMPUTE_***

• COMPUTE_MAXS–ASM will calculate max stack/local vars

• COMPUTE_FRAMES–ASM will calculate Java 6 stack map

Page 72: Mastering java bytecode with ASM - GeeCON 2012

Visit Class

cv.visit(V1_6,ACC_PUBLIC,"X",null,"java/lang/Object",null);

Page 73: Mastering java bytecode with ASM - GeeCON 2012

Opcodes

• Interface full of constants –Bytecodes–Visibility modifiers–Java versions –Other stuff

Page 74: Mastering java bytecode with ASM - GeeCON 2012

ACC_***

• Some you know–ACC_PUBLIC, ACC_ABSTRACT, etc

• Some you (probably) don’t–ACC_BRIDGE, ACC_SYNTHETIC

Page 75: Mastering java bytecode with ASM - GeeCON 2012

Class Names

"java/lang/Object"

packageClass.replaceAll('.', '/')

Page 76: Mastering java bytecode with ASM - GeeCON 2012

Type Descriptors

Page 77: Mastering java bytecode with ASM - GeeCON 2012

Type Descriptors

B byteC charS stringI intJ longF floatD doubleZ booleanV void

Page 78: Mastering java bytecode with ASM - GeeCON 2012

Type Descriptors

Lsome/Class;

Page 79: Mastering java bytecode with ASM - GeeCON 2012

Type Descriptors

[Lsome/Class;

Page 80: Mastering java bytecode with ASM - GeeCON 2012

Method Signatures

()V void foo()

(Ljava/lang/Object;)I int foo(Object)

([Ljava/lang/String;)V void main(String[])

Page 81: Mastering java bytecode with ASM - GeeCON 2012

Visit MethodMethodVisitor constructor =

cv.visitMethod(ACC_PUBLIC, "<init>", "()V",null, null);

MethodVisitor mv = cv.visitMethod(ACC_PUBLIC + ACC_STATIC,"main", "([Ljava/lang/String;)V", null, null);

Page 82: Mastering java bytecode with ASM - GeeCON 2012

Visit MethodMethodVisitor constructor =

cv.visitMethod(ACC_PUBLIC, "<init>", "()V",null, null);

MethodVisitor mv = cv.visitMethod(ACC_PUBLIC + ACC_STATIC,"main", "([Ljava/lang/String;)V", null, null);

Wat!? o_O

Page 83: Mastering java bytecode with ASM - GeeCON 2012

Special Methods

• <init>–Constructor

• <clinit>–Static initializer

Page 84: Mastering java bytecode with ASM - GeeCON 2012

MethodVisitor

• Visit annotations• Visit code– Bytecodes, local variables, line numbers, etc

• Visit maxs– Pass bogus values if COMPUTE_MAX

Page 85: Mastering java bytecode with ASM - GeeCON 2012

Constructor

c.visitVarInsn(ALOAD, 0); c.visitMethodInsn(INVOKESPECIAL,

"java/lang/Object", "<init>", "()V"); c.visitInsn(RETURN); c.visitMaxs(0, 0);

Page 86: Mastering java bytecode with ASM - GeeCON 2012

Constructor

c.visitVarInsn(ALOAD, 0); c.visitMethodInsn(INVOKESPECIAL,

"java/lang/Object", "<init>", "()V"); c.visitInsn(RETURN); c.visitMaxs(0, 0);

aload_0invokespecialreturn

Page 87: Mastering java bytecode with ASM - GeeCON 2012

public static void main()

Page 88: Mastering java bytecode with ASM - GeeCON 2012

public static void main()mv.visitFieldInsn(GETSTATIC,

"java/lang/System", "out", "Ljava/io/PrintStream;");

mv.visitLdcInsn("Hello");

mv.visitMethodInsn(INVOKEVIRTUAL,"java/io/PrintStream", "println", "(Ljava/lang/String;)V");

mv.visitInsn(RETURN);

Page 89: Mastering java bytecode with ASM - GeeCON 2012

public static void main()mv.visitFieldInsn(GETSTATIC,

"java/lang/System", "out", "Ljava/io/PrintStream;");

mv.visitLdcInsn("Hello");

mv.visitMethodInsn(INVOKEVIRTUAL,"java/io/PrintStream", "println", "(Ljava/lang/String;)V");

mv.visitInsn(RETURN);

getstaticldc “Hello”invokevirtualreturn

Page 90: Mastering java bytecode with ASM - GeeCON 2012

Enter Loops

Page 91: Mastering java bytecode with ASM - GeeCON 2012

Enter Loops

start: int i = 0loop: print "Hello" i = i + 1 if i < 10 goto loopend: return

Page 92: Mastering java bytecode with ASM - GeeCON 2012

Enter Loops

start: int i = 0loop: print "Hello" i = i + 1 if i < 10 goto loopend: return

GOTO isn’t harmful ;)

Page 93: Mastering java bytecode with ASM - GeeCON 2012

Enter Loops 0: iconst_0 1: istore_1 2: iload_1 3: bipush 10 5: if_icmpge 22

System.out.println(“Hello”)

16: iinc 1, 1 19: goto 2 22: return

Page 94: Mastering java bytecode with ASM - GeeCON 2012

Enter Loopsstart: iconst_0 1: istore_1loop: iload_1 3: bipush 10 5: if_icmpge end

System.out.println(“Hello”)

16: iinc 1, 1 19: goto loop end: return

Page 95: Mastering java bytecode with ASM - GeeCON 2012

Enter Loopsstart: iconst_0 1: istore_1loop: iload_1 3: bipush 10 5: if_icmpge end

System.out.println(“Hello”)

16: iinc 1, 1 19: goto loop end: return

int i = 0

Page 96: Mastering java bytecode with ASM - GeeCON 2012

Enter Loopsstart: iconst_0 1: istore_1loop: iload_1 3: bipush 10 5: if_icmpge end

System.out.println(“Hello”)

16: iinc 1, 1 19: goto loop end: return

i < 10

Page 97: Mastering java bytecode with ASM - GeeCON 2012

Enter Loopsstart: iconst_0 1: istore_1loop: iload_1 3: bipush 10 5: if_icmpge end

System.out.println(“Hello”)

16: iinc 1, 1 19: goto loop end: return

i++

Page 98: Mastering java bytecode with ASM - GeeCON 2012

Enter Loopsstart: iconst_0 1: istore_1loop: iload_1 3: bipush 10 5: if_icmpge end

System.out.println(“Hello”)

16: iinc 1, 1 19: goto loop end: return

Page 99: Mastering java bytecode with ASM - GeeCON 2012

Enter ASM LoopsLabel start = new Label();Label loop = new Label();Label end = new Label();

// i = 0mv.visitLabel(start);mv.visitInsn(ICONST_0);mv.visitVarInsn(ISTORE, 1);

Page 100: Mastering java bytecode with ASM - GeeCON 2012

Enter ASM LoopsLabel start = new Label();Label loop = new Label();Label end = new Label();

// i = 0mv.visitLabel(start);mv.visitInsn(ICONST_0);mv.visitVarInsn(ISTORE, 1);

// i < 10mv.visitLabel(loop);mv.visitVarInsn(ILOAD, 1);mv.visitLdcInsn(10);mv.visitJumpInsn(IF_ICMPGE, end);

Page 101: Mastering java bytecode with ASM - GeeCON 2012

Enter ASM LoopsLabel start = new Label();Label loop = new Label();Label end = new Label();

// i = 0mv.visitLabel(start);mv.visitInsn(ICONST_0);mv.visitVarInsn(ISTORE, 1);

// i < 10mv.visitLabel(loop);mv.visitVarInsn(ILOAD, 1);mv.visitLdcInsn(10);mv.visitJumpInsn(IF_ICMPGE, end);

//increment & continue the loopmv.visitIincInsn(1, 1);mv.visitJumpInsn(GOTO, loop);mv.visitLabel(end);

Page 102: Mastering java bytecode with ASM - GeeCON 2012
Page 103: Mastering java bytecode with ASM - GeeCON 2012

ClassWriter

Page 104: Mastering java bytecode with ASM - GeeCON 2012

geecon$ java HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello

Page 105: Mastering java bytecode with ASM - GeeCON 2012

ASMifiedmv = cw.visitMethod(ACC_PUBLIC, "getId", "(I)I", null, null);mv.visitCode();Label l0 = new Label();mv.visitLabel(l0);mv.visitLineNumber(16, l0);mv.visitVarInsn(ALOAD, 0);mv.visitFieldInsn(GETFIELD, "zt/asm/Items", "ids", "Ljava/util/List;");mv.visitVarInsn(ILOAD, 1);mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;");mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I");mv.visitInsn(IRETURN);Label l1 = new Label();mv.visitLabel(l1);mv.visitLocalVariable("this", "Lzt/asm/Items;", null, l0, l1, 0);mv.visitLocalVariable("i", "I", null, l0, l1, 1);mv.visitMaxs(2, 2);mv.visitEnd();

java -cp asm-all-3.3.1.jar:asm-util-3.3.1.jar \org.objectweb.asm.util.ASMifierClassVisitor \Hello.class

ASMifierClassVisitor

Page 106: Mastering java bytecode with ASM - GeeCON 2012

Bytecode instrumentation

Some magic for your own good

Page 107: Mastering java bytecode with ASM - GeeCON 2012

1010101010111000101010101010100010001000111011011101011

1010101010111100001010101010100010001000111011011101110

Ninja.class Ninja.class’

WAT!?

Page 108: Mastering java bytecode with ASM - GeeCON 2012

Who?

AspectJ Containers (Java EE, Spring)

Play! Framework Terracotta

JRebel FindBugs

Hibernate TapestryByteman

Page 109: Mastering java bytecode with ASM - GeeCON 2012

How?

• Add –javaagent to hook into class loading process

• Implement ClassFileTransformer• Use bytecode manipulation libraries (Javassist,

cglib, asm) to add any custom logic

java.lang.instrument

Page 110: Mastering java bytecode with ASM - GeeCON 2012

How ? (2)

• Use custom ClassLoader–Override ClassLoader#findClass–Use ClassReader(String) to read the class

in and transform it via visitor chain–Call ClassLoader#defineClass explicitly

with the result from the transformation step

Page 111: Mastering java bytecode with ASM - GeeCON 2012

java.lang.instrument

import java.lang.instrument.ClassFileTransformer;import java.lang.instrument.Instrumentation;

public class Agent {public static void premain(String args, Instrumentation inst) { inst.addTransformer(new ClassFileTransformer(), true); }

public static void agentmain(String args, Instrumentation inst) { premain(args,inst); }}

Page 112: Mastering java bytecode with ASM - GeeCON 2012

java.lang.instrument

import java.lang.instrument.ClassFileTransformer;import java.lang.instrument.Instrumentation;

public class Agent {public static void premain(String args, Instrumentation inst) { inst.addTransformer(new ClassFileTransformer(), true); }

public static void agentmain(String args, Instrumentation inst) { premain(args,inst); }}

Page 113: Mastering java bytecode with ASM - GeeCON 2012

java.lang.instrument

import java.lang.instrument.ClassFileTransformer;import java.lang.instrument.Instrumentation;

public class Agent {public static void premain(String args, Instrumentation inst) { inst.addTransformer(new ClassFileTransformer(), true); }

public static void agentmain(String args, Instrumentation inst) { premain(args,inst); }}

META-INF/MANIFEST.MFPremain-Class: AgentAgent-Class: Agent

java –javaagent:agent.jar …

Page 114: Mastering java bytecode with ASM - GeeCON 2012

j.l.instrument.ClassFileTransformernew ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className, Class<?>classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){

ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); MyAdapter ca = new MyAdapter(cw); cr.accept(ca, ClassReader.EXPAND_FRAMES); return cw.toByteArray(); }

Page 115: Mastering java bytecode with ASM - GeeCON 2012

j.l.instrument.ClassFileTransformernew ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className, Class<?>classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){

ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); MyAdapter ca = new MyAdapter(cw); cr.accept(ca, ClassReader.EXPAND_FRAMES); return cw.toByteArray(); }

Page 116: Mastering java bytecode with ASM - GeeCON 2012

new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className, Class<?>classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){

ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

MyAdapter ca = new MyAdapter(cw); cr.accept(ca, ClassReader.EXPAND_FRAMES); return cw.toByteArray(); }

j.l.instrument.ClassFileTransformer

Page 117: Mastering java bytecode with ASM - GeeCON 2012

public class MyClassLoader extends ClassLoader {

protected Class findClass(String name) throws ClassNotFoundException {

ClassReader cr = new ClassReader(name); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

MyClassAdapter ca = new MyClassAdapter(cw);

cr.accept(ca, ClassReader.EXPAND_FRAMES);

byte b[] = cw.toByteArray(); return defineClass(name, b, 0, b.length); }

}

Page 118: Mastering java bytecode with ASM - GeeCON 2012

SLIDESGOTO: IDESLIDESIDE: ASM DEMO


Top Related