Java逆向基礎之AspectJ的Around方法修改方法體
阿新 • • 發佈:2018-05-12
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方法修改方法體