在逆向中,我们往往通过修改某个方法达到目的,在javaassist中有insertBefore,insertAfter,setBody,在AspectJ中也可以通过Around实现类似的功能。
看一个简单的例子
java文件Main.java//Main.java
package com.vvvtimes;
public class Main {
public int add(int x, int y) {
return x + y;
}
public int add(int x, int y, int z) {
return x + y + z;
}
public static void main(String[] args) {
Main m = new Main();
System.out.println(m.add(1, 2));
System.out.println(m.add(1, 2, 3));
}
}
aj文件Tracing.aj//Tracing.aj
public aspect Tracing {
private pointcut mainMethod():
execution(public static void main(String[]));
before(): mainMethod() {
System.out.println("> " + thisJoinPoint);
}
after(): mainMethod() {
System.out.println("
}
pointcut addMethodOne() : call (public int add(int,int));
int around() : addMethodOne() {
System.out.println("> " + thisJoinPoint);
Object[] args = thisJoinPoint.getArgs();
for (int i = 0; i
if( args[i]!=null) {
System.out.println("args[" + i + "]: " + args[i].toString());
}
}
int result = proceed();//这里执行原有方法体
System.out.println("original return value: " + result);//输出原有返回值
return 777; //指定新值返回
}
pointcut addMethodTwo(int a, int b, int c) : call (public int add(int,int,int)) && args (a, b, c);
int around(int a, int b, int c) : addMethodTwo (a, b, c){
System.out.println("> " + thisJoinPoint);
System.out.println("1st passed value: " + a);
System.out.println("2nd passed value: " + b);
System.out.println("3rd passed value: " + c);
a = 6;
b = 6;
c = 6;
int result = proceed(a, b, c);//修改传入的参数值
return result;
}
}
运行后的结果如下
proceed用于执行原有方法体,return方法用于改变返回值
在第一个修改中我们输出了其中的参数,执行了原有方法之后,直接指定了一个返回值777
在第二个修改中,我们通过&& args 指定了参数,修改其参数之后执行原有方法体并返回。