`
xkorey
  • 浏览: 153505 次
  • 性别: 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函数监听实现(三)拦截注入函数的参数值 (函数执行前)

    本篇文章将深入探讨如何使用ASM库来实现函数监听,特别是如何在函数执行前拦截并改变其参数值。 首先,我们需要理解ASM库的基本用法。ASM提供了一套API,可以直接生成或修改字节码。在Java中,每个类都是以字节码...

    键盘钩子(Win32 ASM实现)

    **键盘钩子(Win32 ASM实现)** 在Windows操作系统中,键盘钩子是一种系统级技术,允许应用程序监听和处理其他应用程序的键盘输入事件。这种技术通常由汇编语言(Assembly)或C/C++等高级语言实现。在这个场景中,...

    Window_Control,win32asm版本的,基于Static,Edit,ListBox,ComBox,Button

    Edit控件的文本可以通过SetWindowText函数进行修改,而用户输入的文本变化则可以通过EN_CHANGE消息进行监听。 3. ListBox控件:ListBox控件展示一系列可选择的项,用户可以选择一个或多个项。使用CreateWindowEx...

    汇编语言写的计算器(含源码)

    程序员通过助记符来编写代码,如MOV(移动)、ADD(加法)、SUB(减法)等,这些指令在经过汇编器转换后生成二进制机器码,可供计算机执行。 在这个“汇编计算器”项目中,你将看到如何用汇编语言实现基本的算术...

    Asm.rar_Keypad_汇编语言

    《Asm.rar_Keypad_汇编语言》是关于汇编语言编程的一个资源包,主要涉及了几个关键领域的应用:按键处理、掉电保存、液晶显示以及串口通信。这些内容构成了嵌入式系统开发的基础模块,对于理解底层硬件控制和优化...

    Win32汇编写的端口映射器

    在汇编代码中,这些API调用需要通过`Call`指令完成,并且需要正确设置参数,包括地址和参数值。 以压缩包中的`map.asm`文件为例,我们可以看到源代码中可能包含以下关键部分: 1. **初始化**:设置堆栈和数据段,...

    基于汇编语言的七段电子表显示.pdf

    实现这一功能需要监听键盘输入,当"S"键被按下时,程序进入时间设定模式。用户可能需要通过键盘输入新的小时、分钟和秒,然后更新并重新显示时间。这部分涉及到键盘扫描码的解析以及时间值的更新逻辑。 在设计程序...

    IDQ漏洞溢出源代码

    - `ConnectStruct *pConnectStruct`:指向连接结构体的指针,包含连接方式(监听端口或连接主机)等信息。 - `LPCTSTR lpszBindCmd`:绑定的命令字符串指针。 #### `ShowHelp` - **作用**:显示帮助信息,包括...

    TCii.zip_网络编程_Asm_

    5. **系统调用**:理解如何在Asm中调用操作系统提供的函数,如创建socket、bind、listen、accept、send、recv等。 6. **网络编程实践**:通过编写简单的客户端和服务器程序,加深对网络编程的理解。 7. **错误处理...

    cglibfull包

    CGLib是基于ASM库实现的,能够对运行时的类进行字节码操作,从而实现对类的扩展和增强。 CGLib的核心概念是Enhancer,它允许开发者创建一个子类,而无需显式地定义子类。Enhancer提供了许多配置选项,如设置拦截器...

    通用源代码编辑器JAVA大作业报告.doc

    而提高要求则包括了对多种编程语言(如Java, C, C++, ASM等)的关键词语法高亮,剪贴板操作,搜索和替换功能,以及二进制文件的16进制编辑。 【概要设计】阶段,开发者计划使用JAVA的图形用户界面(GUI)编程技术来...

    一个按键驱动

    按键驱动程序是操作系统与硬件交互的重要组成部分之一,主要用于捕捉和处理用户通过物理按钮产生的输入事件。对于嵌入式系统来说,按键驱动尤其重要,因为它们通常用于执行关键的操作,比如电源管理或者菜单导航等。...

    为正在运行的程序定义系统热键

    我们需要在程序的消息处理函数中监听这个消息,比如`WM_HOTKEY`,然后根据接收到的消息执行相应的操作。 3. **资源管理**:在标签中提到的“资源”,在Windows编程中指的是应用程序使用的各种非代码资源,如图标、...

    防止鼠标回滚

    在IT领域,编程时常会遇到各种需求,其中之一就是如何控制鼠标的行为。本篇文章将深入探讨“防止鼠标回滚”这一主题,特别是在Delphi环境下如何实现这一功能。首先,我们要理解什么是鼠标回滚以及为什么要防止它。 ...

    winsock api

    - `Subclass.asm` 和 `Subclass.cls` 可能是实现子类化技术的源代码,用于扩展或修改Winsock控件的行为。 - `modExceptionHandler.bas` 可能包含了异常处理代码,确保在出现错误时程序能够正常运行。 - `modWinsock....

    oracle 10g

    如聚合函数(SUM, AVG, COUNT, MAX, MIN)用于对一组值进行统计,字符串函数(SUBSTR, CONCAT, INSTR)用于处理字符数据,日期函数(SYSDATE, ADD_MONTHS, TO_CHAR)帮助处理时间数据。通过文档,你可以了解到这些...

    51模拟ps2键盘的程序

    `Delay.asm`文件很可能是用于控制单片机发送数据间隔的延时函数,因为按照PS/2协议,数据的发送需要有一定的时序。延时函数对于精确控制通信时序至关重要,确保数据正确地被接收。 至于`AT键盘接口资料.pdf`,这...

    单片机向主机发送字符串.rar

    源代码文件展示了具体的实现细节,包括UART初始化和字符串发送的函数;电路图文件描绘了硬件连接,帮助理解如何将单片机与主机相连;而仿真配置文件则用于指导在仿真环境中运行和测试程序。 通过学习这个教程,...

    oracle DBA两日速成手册1

    - 创建数据库:学习使用Database Configuration Assistant (DBCA)创建新数据库,包括设置数据库参数、选择存储类型(如ASM)、确定字符集和确定数据库实例的大小。 - 初始化参数文件:理解初始化参数的作用,如何...

Global site tag (gtag.js) - Google Analytics