`
xkorey
  • 浏览: 151397 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

ASM函数监听实现(二)之打印注入函数的参数值

    博客分类:
  • ASM
阅读更多
上一篇博客中实现了asm简单的对类中方法添加监听。

http://xkorey.iteye.com/admin/blogs/1551897

监听只是一个简单的切入并未对所切入方法的值做任何处理。

简单的打印出了


it's begin  
helloWorld....  
it's end  


这次也做一点小改动,将改为

start value:hello
end value:hello world


将实现:监听函数的传入值。

首先将测试类 helloWorld 改造为:

public class helloWorld {
	
	public void sayHello(String parm){
		parm+=" world";
	}
}


其次改造 asmAopMethodAdapter 对方法做修改的类,

public class asmAopMethodAdapter extends MethodAdapter implements Opcodes{
	
	private final static int EXCEPTION_STACK = 2 + 1;//max_stack至少需要能够容纳2个常量地址(监控方法使用)和1个exception地址
	
	private Label try_catch_start,try_catch_end;
	
	private String startInfo,endInfo;
	
	 public asmAopMethodAdapter(MethodVisitor mv,String start,String end) { 
		 super(mv); 
		 try_catch_start = new Label();
		 try_catch_end = new Label();
		 startInfo = start;
		 endInfo = end;
	 } 

	 public void visitCode() {
		 mv.visitCode();
		 mv.visitLabel(try_catch_start);
		 
                 mv.visitVarInsn(ALOAD, 0);
		 mv.visitVarInsn(ALOAD, 1);
		 // mv.visitLdcInsn(startInfo);
//asmAopInvoker 这里写类的路径例如:com.asm.asmAopInvoker 应写成 com/asm/asmAopInvoker  
		 mv.visitMethodInsn(INVOKESTATIC, "asmAopInvoker", 
					"methodStart", "(Ljava/lang/String;)V");
	 } 
	 
	 public void visitInsn(int opcode){
		 if(opcode >= IRETURN && opcode <= RETURN){
			 
                        mv.visitVarInsn(ALOAD, 0);
		        mv.visitVarInsn(ALOAD, 1);
//mv.visitLdcInsn(endInfo);
//asmAopInvoker 这里写类的路径例如:com.asm.asmAopInvoker 应写成 com/asm/asmAopInvoker 
			 mv.visitMethodInsn(INVOKESTATIC, "asmAopInvoker", 
						"methodEnd", "(Ljava/lang/String;)V");
		 }
		 mv.visitInsn(opcode);
	 }
	 public void visitEnd() {
		 mv.visitLabel(try_catch_end);
		 mv.visitTryCatchBlock(try_catch_start, try_catch_end, try_catch_end, null);
		 //mv.visitLdcInsn(endInfo);
//asmAopInvoker 这里写类的路径例如:com.asm.asmAopInvoker 应写成 com/asm/asmAopInvoker 
		 //mv.visitMethodInsn(INVOKESTATIC, "asmAopInvoker", 
				 "methodEnd", "(Ljava/lang/String;)V");
		 mv.visitInsn(Opcodes.ATHROW);
		 mv.visitEnd();
	 }
	 
	 public void visitMaxs(int maxStack,int maxLocals){
		//保证max stack足够大
		 mv.visitMaxs(Math.max(EXCEPTION_STACK,maxStack), maxLocals);
	 }
}


其中改变的部分是

// 个人理解:是将一个Object写入到class中
mv.visitLdcInsn(endInfo);

改为
// 个人理解:访问方法内的第一个参数
mv.visitVarInsn(ALOAD, 0);
// 个人理解:获取这个参数的值
mv.visitVarInsn(ALOAD, 1);


这次运行环境依旧是jdk1.6,asm 3.3.1

其中的类已打包。

分享到:
评论

相关推荐

    ASM函数监听实现(三)拦截注入函数的参数值 (函数执行前)

    NULL 博文链接:https://xkorey.iteye.com/blog/1670257

    Oracle Database 11g初学者指南--详细书签版

    4.6 函数:字符串函数、数字函数和聚集函数(不是分组) 91 4.6.1 字符串函数 91 4.6.2 数字函数 92 4.6.3 聚集函数 92 4.7 日期函数(格式化的和按时间排列的) 93 4.7.1 日期函数 93 4.7.2 特殊格式的日期数据...

    oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

    4.6 函数:字符串函数、数字函数和聚集函数(不是分组) 4.6.1 字符串函数 4.6.2 数字函数 4.6.3 聚集函数 4.7 日期函数(格式化的和按时间排列的) 4.7.1 日期函数 4.7.2 特殊格式的日期数据类型 4.7.3 嵌套函数 ...

    ARM_Linux启动分析.pdf

    调用pal_init()初始化PAL代码,调用openboot() 打开引导设备(通过读取Firmware环境),调用load()将核心代码加载到START_ADDR(见 “include/asm-alpha/system.h”),再将Firmware中的核心引导参数加载到ZERO_PAGE...

    Windows环境下32位汇编语言程序设计_随书光盘

    用 DLL 注入的方法实现远程进程 Chapter13\RemoteThread ;不依靠任何外部文件实现远程进程 Chapter14\TopHandler ;使用筛选器处理异常 Chapter14\SEH01 ;最基本结构化异常处理例子 Chapter14\SEH02 ;改进后的结构化...

    oracle10g课堂练习I(2)

    基于值审计 10-18 细粒度审计 10-20 FGA 策略 10-21 审计的 DML 语句:注意事项 10-23 FGA 准则 10-24 DBA 审计 10-25 维护审计线索 10-26 安全更新 10-27 应用安全补丁程序 10-28 小结 10-29 练习概览:...

Global site tag (gtag.js) - Google Analytics