1. 程式人生 > >Java逆向基礎之AspectJ的獲取成員變量的值

Java逆向基礎之AspectJ的獲取成員變量的值

java aspectj 成員變量 值

註意:由於JVM優化的原因,方法裏面的局部變量是不能通過AspectJ攔截並獲取其中的值的,但是成員變量可以

在逆向中,我們經常要跟蹤某些類的成員變量的值,這裏以獲取ZKM9中的qs類的成員變量g為例進行說明

在StackOverFlow上有這麽一篇提問:AspectJ: How to get accessed field's value in a get() pointcut

將其中內容改寫為qs類的代碼如下:

	private pointcut qsfiledMethod() :
		get(* com.zelix.qs.*);
	
	after() returning(Object field) :qsfiledMethod(){
		System.out.println(thisJoinPoint.toLongString());
		System.out.println("  " + thisJoinPoint.getSignature().getName());
		System.out.println("  " + field);
	}

但是這個方法有缺陷,只能獲取公共變量,運行之後獲取到的都是qs的成員變量j和k

運行結果如下

技術分享圖片

所以此路不通,那麽就需要再找一條路:反射

qs類中的某個方法調用了jj.a方法,所以用call找出調用者,然後通過反射方式獲取filed,talk is cheap,show you code?

	private pointcut jjaMethod() :
		call(String com.zelix.jj.a(String, String, String, Object, int));

	before() : jjaMethod() {
		System.out.println("> " + thisJoinPoint);
		if (thisJoinPoint.getThis() != null) {
            System.out.println("this "+thisJoinPoint.getThis().getClass().getName()  +  "   " + thisJoinPoint.getSourceLocation());
            Object obj  = thisJoinPoint.getThis();
            Class clazz =  obj.getClass();
            
            //遍歷成員
    		Field[] fileds = clazz.getDeclaredFields();
    		for (Field field : fileds) {
    			System.out.println(field);
    		}
    		try {
    			//獲取單個成員private final java.lang.String[] com.zelix.qs.g
    			//並輸出它的值
				Field filed = clazz.getDeclaredField("g");
				System.out.println(filed);
				filed.setAccessible(true);
				String[] g= (String[]) filed.get(obj);
				for (int i = 0; i < g.length; i++) {
					System.out.println("g["+i+"] ="+g[i]);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
        }else if (thisJoinPoint.getTarget() != null) {
            System.out.println("target "+thisJoinPoint.getTarget().getClass().getName()  +  "   " + thisJoinPoint.getSourceLocation());
        }
	}

運行結果如下

技術分享圖片

before方法裏的功能如下

1.打印出調用者的名稱和位置

2.遍歷打印qs類的所有成員名稱

3.獲取成員g的值,由於這個成員是數組類型,遍歷這個數組打印值


Java逆向基礎之AspectJ的獲取成員變量的值