Java获取java文件成员变量_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 

before方法里的功能如下

1.打印出调用者的名称和位置

2.遍历打印qs类的所有成员名称

3.获取成员g的值,由于这个成员是数组类型,遍历这个数组打印值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值