2013-02-25 3 views
0

ASM ByteCode 라이브러리를 사용하여 HttpUrlConnection IC를 만들 때 요청 헤더 (UUID)를 추가하십시오. 아래 코드는 내 코드입니다. - 출력을 얻는 중 ===> 이것은 Http CONNECT Method!입니다. 그러나 헤더를 추가하는 방법을 모른다.HttpURLConnection을 사용하는 ASM 바이트 코드

package com.eg.agent; 

    import org.objectweb.asm.MethodVisitor; 
    import org.objectweb.asm.Opcodes; 

    public class EgHttpMethodVisitorAdapter extends MethodVisitor { 

     private String methodName; 
     private String className; 
     private String description; 

     public EgHttpMethodVisitorAdapter(MethodVisitor mv , String methodName , String description , String className) { 
      super(Opcodes.ASM4, mv); 
      this.methodName = methodName; 
      this.className = className; 
      this.description = description; 
     } 

     public void visitCode() { 
      super.visitCode(); 
      System.out.println("\t [HTTP URL CONNECTION - Method Name]"+methodName +" Class NAME: "+className + " DESC :"+description); 
      boolean isConnect = false; 
      if(methodName.equals("connect") && description.equals("()V")) 
       isConnect = true; 
      if(isConnect) { 
       mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); 
       mv.visitLdcInsn (" ====> This is Http CONNECT Method!"); 
       mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream","println", "(Ljava/lang/String;)V"); 
      } 
     } 

     public void visitMaxs(int maxStack, int maxLocals) { 
      super.visitMaxs(maxStack + 4, maxLocals); 
     } 
    } 

답변

1

방문 코드를 붙여서 해결했습니다.

public void visitCode() { 
     super.visitCode(); 
     boolean isConnect = false; 
     if(methodName.equals("connect") && description.equals("()V")) 
      isConnect = true; 

     if(isConnect) { 
      // Dynamically add UUID .. 
      mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/util/UUID", "randomUUID", "()Ljava/util/UUID;"); 
      mv.visitVarInsn(Opcodes.ASTORE, 3); 
      mv.visitVarInsn(Opcodes.ALOAD, 0); 
      mv.visitLdcInsn("GUID"); 
      mv.visitVarInsn(Opcodes.ALOAD, 3); 
      mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/UUID", "toString", "()Ljava/lang/String;"); 
      mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/net/HttpURLConnection", "addRequestProperty", "(Ljava/lang/String;Ljava/lang/String;)V"); 
      mv.visitCode(); 
     } 
    } 
0

ASM FAQ Question 11이 도움이 될 수 있습니다.

+0

안녕하세요 유진 Kuleshov는 :) –

+0

가 나 한테 감사하지 마세요 ... 당신의 도움을 주셔서 감사합니다. 그냥 대답을 수락하십시오. –