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

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

    博客分类:
  • ASM
阅读更多
上一篇ASM中打印出了被注入函数参数的传入值,http://xkorey.iteye.com/admin/blogs/1667944

现在将要实现对参数传入值的拦截,不符合判断规则的传入值,将会被直接返回。
实现如下效果:
// 打印出参数传入值
start value:error
// 发现值等于 error 时直接返回
error,program will exit.
//属性值并未被更改
default
// 打印出传入值
start value:change
end value:change
// 属性值被更改
change


被拦截的方法是helloWorld中的sayHello
public class helloWorld {
	
	public String va="default";
	
	public void sayHello(String param){
		va=param;
	}
}


测试代码

asmAopGenerator aag = new asmAopGenerator();
		helloWorld hw = (helloWorld) aag.proxy(helloWorld.class, "sayHello", "it's begin", "it's end");
                // 传入值是error时直接返回 va的值没改变
		hw.sayHello("error");
                // 打印出default
		System.out.println(hw.va);
		// va的值被改变
                hw.sayHello("change");
                // 打印出 va的值为 change
		System.out.println(hw.va);


注入到被拦截类的对象:

public class asmAopInvoker {
	
	public static int methodEnd(String evtID){
		System.out.println("end value:"+evtID);
		return 0;
	}
	
	public static int methodStart(String evtID){
		System.out.println("start value:"+evtID);
		if(evtID.equals("error")){
			System.out.println("error,program will exit.");
			return 1;
		}
		return 0;
	}
	
}


方法拦截对象就是上一篇中的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);
                 // 加入if标签
		 Label if_Lable = new Label();
                 // 获得函数 methodStart 的返回值
		 mv.visitVarInsn(ALOAD, 1);
		 // 调用 methodStart函数
                 // (Ljava/lang/String;)I 意为:接受一个类型为string参数
                 // 返回值为int的函数 
                 mv.visitMethodInsn(INVOKESTATIC, "asmAop/asmAopInvoker", 
					"methodStart", "(Ljava/lang/String;)I");
		 // 访问if 标签 
                 // 疑惑 asm4-guide 中说明 IFEQ的意思是:jump if i  == 0。但我在asm 3.3.1中貌似IFEQ是 jump if i==1 
                 mv.visitJumpInsn(IFEQ, if_Lable);
		 // 写入 return
                 mv.visitInsn(RETURN);
		 // 结束if标签
                 mv.visitLabel(if_Lable);
		 
	 } 
	 
	 public void visitInsn(int opcode){
		 if(opcode >= IRETURN && opcode <= RETURN){
			 mv.visitCode();
			 mv.visitVarInsn(ALOAD, 0);
			 mv.visitVarInsn(ALOAD, 1);
			 mv.visitMethodInsn(INVOKESTATIC, "asmAop/asmAopInvoker", 
						"methodEnd", "(Ljava/lang/String;)I");
		 }
		 mv.visitInsn(opcode);
	 }
	 public void visitEnd() {
		 mv.visitLabel(try_catch_end);
		 mv.visitTryCatchBlock(try_catch_start, try_catch_end, try_catch_end, null);
		 mv.visitInsn(Opcodes.ATHROW);
		 mv.visitEnd();
	 }
	 
	 public void visitMaxs(int maxStack,int maxLocals){
		//保证max stack足够大
		 mv.visitMaxs(Math.max(EXCEPTION_STACK,maxStack), maxLocals);
	 }
}




所涉及类以打包。

代码运行环境 asm 3.3.1 jdk 1.6.
分享到:
评论

相关推荐

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

    这篇博客"ASM函数监听实现(二)之打印注入函数的参数值"深入探讨了如何利用ASM库来监控并记录函数调用时的参数值,这对于调试、日志记录以及性能分析等场景非常有用。 首先,我们来看`asmAopClassAdapter.java`。...

    远程线程注入asm代码

    在本例中,我们探讨的是如何使用汇编(ASM)代码进行远程线程注入,实现“Hello World”级别的操作。汇编语言是计算机编程的底层语言,它直接对应于机器指令,提供了对硬件的直接控制。 首先,理解远程线程注入的...

    cos.rar_32 bit cosine_cos_cos asm_cos函数的实现_temperature

    这个"cos.rar_32 bit cosine_cos_cos_asm_cos函数的实现_temperature"主题涉及到的是使用汇编语言实现32位浮点数的余弦函数计算。余弦函数在数学中广泛应用于各种科学和工程计算,如信号处理、物理模拟以及图像处理...

    ASM注入器工具

    ASM注入器工具是一种专门设计用于调试和远程注入CALL指令的实用程序。在IT行业中,ASM(Assembly Language)注入是高级编程技术的一种,它涉及到在运行时修改或插入汇编代码到另一个进程,以改变其行为或功能。这种...

    关于C语言中函数调用和参数传递机制的探讨.txt

    1. **保存当前上下文**:调用函数前,系统会保存当前函数的状态(如寄存器值),以便后续恢复。 2. **传递参数**:将参数传递给被调用的函数。 3. **跳转到被调用函数**:执行`call`指令,跳转到被调用函数的入口...

    Android-Android无痕埋点框架使用ASM插桩实现

    当用户执行特定操作时,如点击按钮或加载页面,ASM会在对应的函数调用前后插入埋点代码,记录用户的行为并上报至服务器。这样,我们无需在每个可能触发行为的地方手动添加埋点代码,极大地提高了开发效率和代码的...

    ASM51无参数化调用C51函数的实现

    "ASM51无参数化调用C51函数的实现" 该文章主要介绍了如何使用汇编模块对C51模块进行无参数化调用,从而避免了传统汇编模块和C51模块之间调用时的繁琐接口编程问题,并验证了该方法的优越性和有效性。 知识点1:MCS...

    六轴传感器ASM330LHH驱动函数

    驱动函数是实现硬件操作的软件接口,对于ASM330LHH来说,驱动函数主要包括初始化、配置传感器参数、读取数据和中断处理等部分。以下是一些关键步骤: 1. **初始化**:设置I²C或SPI接口,配置时钟,使能传感器电源...

    HOOKAPI.rar_API函数_asm hook_hook_hook api

    ASM(汇编语言)HOOK API函数库是一种技术,它允许程序员在程序运行时拦截和修改特定的系统调用或函数行为。Hook技术广泛应用于软件调试、性能监控、病毒检测、游戏修改等领域。在这个名为"HOOKAPI.rar"的压缩包中,...

    ASM实例和监听日志文件和Database日志文件

    通过 grid 用户的 ADRCI 工具,可以实现对 ASM 和 SCAN 监听日志的轻松管理。 ASM 实例日志文件和监听日志文件都属于 ADR(Automatic Diagnostic Repository)的管理范围内。ADR 是 Oracle 数据库管理系统中的一种...

    枚举进程(ASM实现)

    - **保存/恢复寄存器**:在调用函数前,可能需要使用`push`保存某些寄存器,然后在函数返回后用`pop`恢复,以防止被函数改变。 - **处理返回值**:`eax`寄存器通常用来存放函数的返回值,比如`CreateToolhelp32...

    dll函数动态调用工具1.0(Delphi+asm实现)

    DLL函数动态调用工具1.0 使用Delphi + Asm编写,只要知道DLL中函数的名字和参数,就可以对任意Dll的函数进行调用。目前已经可以支持以下类型的参数和返回值:Boolean,Byte,Shortint,Word,Smallint,Longword,Integer,...

    asm算法 opencv实现

    这个库可能包含用于读取图像、处理图像、检测特征点、执行形状建模和迭代优化的函数。通过分析和运行这个示例代码,开发者可以更好地理解和掌握如何在实际项目中运用ASM算法。 在实际应用中,ASM算法的优势在于能够...

    通过函数指针调用C++非静态成员函数

    #### 三、BCB6.0 实现 在Borland C++ Builder 6.0 (BCB6.0) 中,实现方式略有不同: 1. **定义成员函数指针类型**: ```cpp void(X::*pXfoo)(int, int); // 成员函数指针类型 void(*pfoo)(X* THIS, int, int); ...

    几种函数调用方式 asm ,disassemble

    几种函数调用的方式,关于函数调用的一些东西,选自 Hacker Disassembling Uncovered 里的一节 ,精简版..

    C++汇编x64调用asm文件例子

    在x64环境下,汇编语言通常遵循Microsoft的X64调用约定,其中,前四个参数通过RCX、RDX、R8和R9寄存器传递,其余参数则通过堆栈传递,返回值一般存储在RAX寄存器中。 接下来,我们来看一个具体的例子。假设你有一个...

    ASM_人脸识别_Asm_

    它调用其他函数来执行ASM算法的各个步骤。 2. **asm.m**:这个文件可能包含了ASM模型的核心实现,包括模型初始化、形状迭代和匹配优化等过程。 3. **GetProfileStatistics.m**:此函数可能负责计算样本集的统计...

Global site tag (gtag.js) - Google Analytics