1. 程式人生 > >Java逆向基礎之AspectJ的Around方法修改方法體

Java逆向基礎之AspectJ的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("< " + thisJoinPoint);
	}
	
	pointcut addMethodOne() : call (public int add(int,int));

	int around() : addMethodOne() {
		System.out.println("> " + thisJoinPoint);
		Object[] args = thisJoinPoint.getArgs();
		for (int i = 0; i < args.length; 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 指定了參數,修改其參數之後執行原有方法體並返回。


Java逆向基礎之AspectJ的Around方法修改方法體