java around_Java逆向基础之AspectJ的Around方法修改方法体

在逆向中,我们往往通过修改某个方法达到目的,在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;

}

}

运行后的结果如下

ae408bbb211308eeef966ccc013f0e5f.png

proceed用于执行原有方法体,return方法用于改变返回值

在第一个修改中我们输出了其中的参数,执行了原有方法之后,直接指定了一个返回值777

在第二个修改中,我们通过&& args 指定了参数,修改其参数之后执行原有方法体并返回。


版权声明:本文为weixin_30880157原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。