上一篇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库来监控并记录函数调用时的参数值,这对于调试、日志记录以及性能分析等场景非常有用。 首先,我们来看`asmAopClassAdapter.java`。...
在本例中,我们探讨的是如何使用汇编(ASM)代码进行远程线程注入,实现“Hello World”级别的操作。汇编语言是计算机编程的底层语言,它直接对应于机器指令,提供了对硬件的直接控制。 首先,理解远程线程注入的...
这个"cos.rar_32 bit cosine_cos_cos_asm_cos函数的实现_temperature"主题涉及到的是使用汇编语言实现32位浮点数的余弦函数计算。余弦函数在数学中广泛应用于各种科学和工程计算,如信号处理、物理模拟以及图像处理...
ASM注入器工具是一种专门设计用于调试和远程注入CALL指令的实用程序。在IT行业中,ASM(Assembly Language)注入是高级编程技术的一种,它涉及到在运行时修改或插入汇编代码到另一个进程,以改变其行为或功能。这种...
代码注入器别名(ASM汇编CALL测试器)可测试游戏函数CALL,这个工具非常的好用,但是使用的时候请注入汇编书写和堆栈平衡否则游戏会崩溃。还有这个工具必须配合OD调试器使用,因为汇编代码是从OD里面分析出来 ,哈哈。
1. **保存当前上下文**:调用函数前,系统会保存当前函数的状态(如寄存器值),以便后续恢复。 2. **传递参数**:将参数传递给被调用的函数。 3. **跳转到被调用函数**:执行`call`指令,跳转到被调用函数的入口...
"ASM51无参数化调用C51函数的实现" 该文章主要介绍了如何使用汇编模块对C51模块进行无参数化调用,从而避免了传统汇编模块和C51模块之间调用时的繁琐接口编程问题,并验证了该方法的优越性和有效性。 知识点1:MCS...
驱动函数是实现硬件操作的软件接口,对于ASM330LHH来说,驱动函数主要包括初始化、配置传感器参数、读取数据和中断处理等部分。以下是一些关键步骤: 1. **初始化**:设置I²C或SPI接口,配置时钟,使能传感器电源...
ASM(汇编语言)HOOK API函数库是一种技术,它允许程序员在程序运行时拦截和修改特定的系统调用或函数行为。Hook技术广泛应用于软件调试、性能监控、病毒检测、游戏修改等领域。在这个名为"HOOKAPI.rar"的压缩包中,...
通过 grid 用户的 ADRCI 工具,可以实现对 ASM 和 SCAN 监听日志的轻松管理。 ASM 实例日志文件和监听日志文件都属于 ADR(Automatic Diagnostic Repository)的管理范围内。ADR 是 Oracle 数据库管理系统中的一种...
- **保存/恢复寄存器**:在调用函数前,可能需要使用`push`保存某些寄存器,然后在函数返回后用`pop`恢复,以防止被函数改变。 - **处理返回值**:`eax`寄存器通常用来存放函数的返回值,比如`CreateToolhelp32...
DLL函数动态调用工具1.0 使用Delphi + Asm编写,只要知道DLL中函数的名字和参数,就可以对任意Dll的函数进行调用。目前已经可以支持以下类型的参数和返回值:Boolean,Byte,Shortint,Word,Smallint,Longword,Integer,...
这个库可能包含用于读取图像、处理图像、检测特征点、执行形状建模和迭代优化的函数。通过分析和运行这个示例代码,开发者可以更好地理解和掌握如何在实际项目中运用ASM算法。 在实际应用中,ASM算法的优势在于能够...
内联是一种优化技术,它将函数调用替换为函数体,减少了方法调用的开销,提升了执行效率。在R类中,内联常量字段可以减少对象创建,节省内存,同时由于字段直接写入到使用它的代码中,也减少了APK的大小。 Android...
#### 三、BCB6.0 实现 在Borland C++ Builder 6.0 (BCB6.0) 中,实现方式略有不同: 1. **定义成员函数指针类型**: ```cpp void(X::*pXfoo)(int, int); // 成员函数指针类型 void(*pfoo)(X* THIS, int, int); ...
几种函数调用的方式,关于函数调用的一些东西,选自 Hacker Disassembling Uncovered 里的一节 ,精简版..
在x64环境下,汇编语言通常遵循Microsoft的X64调用约定,其中,前四个参数通过RCX、RDX、R8和R9寄存器传递,其余参数则通过堆栈传递,返回值一般存储在RAX寄存器中。 接下来,我们来看一个具体的例子。假设你有一个...
当用户执行特定操作时,如点击按钮或加载页面,ASM会在对应的函数调用前后插入埋点代码,记录用户的行为并上报至服务器。这样,我们无需在每个可能触发行为的地方手动添加埋点代码,极大地提高了开发效率和代码的...