注意:由于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的值,由于这个成员是数组类型,遍历这个数组打印值

转载于:https://blog.51cto.com/7317859/2114892

Java逆向基础之AspectJ的获取成员变量的值相关推荐

  1. Java逆向基础之AspectJ的Eclipse插件AJDT

    AJDT即Eclipse AspectJ Development Tools.是一个Eclipse插件,可以编写AspectJ项目 安装 help-->Install New Software ...

  2. 通过反射获取成员变量并使用

    package cn.learn_03;import java.lang.reflect.Constructor; import java.lang.reflect.Field;/** 通过发生获取成 ...

  3. Java中反射获取成员变量、构造方法、成员方法及类名

    都说反射是框架的灵魂,但是反射到底是啥呢,今天就聊聊反射的基础操作,也是必备操作. 反射机制是在程序运行时,对任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用他的任意一个属性和 ...

  4. Java反射机制——获取成员变量构造函数

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制--获取成员变量&构造函数 一.成员变量是java.lang.reflect.Field的对象 1.F ...

  5. java 27 - 4 反射之 通过反射获取成员变量并使用

    类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...

  6. 反射:通过反射获取成员变量并使用

    首先建一个实体类,用于数据访问 package star.july.entity;public class Student {private String name;int age;public St ...

  7. java 反射 成员变量_java使用反射访问成员变量的值示例

    本文实例讲述了java使用反射访问成员变量的值.分享给大家供大家参考,具体如下: 一 代码 import java.lang.reflect.*; class Person { private Str ...

  8. 反射获取成员变量并改值

    package cn.learn.demo1;import java.lang.reflect.Field;/** 反射获取成员变量,并修改值* Person类中的成员String name*/ pu ...

  9. 反射获取成员变量并使用【应用】

    Class类获取成员变量对象的方法 方法分类 方法名 说明 Field[] getFields() 返回所有公共成员变量对象的数组 Field[] getDeclaredFields() 返回所有成员 ...

最新文章

  1. 中小企业市场 一些超级IT企业的动向
  2. HTML转义字符 Unicode和CSS伪类介绍
  3. linux deepin手动升级内核命令
  4. SAP Fiori Elements 在本地测试模式下如何修改 List Report 里字段标签和图标
  5. linux 定时备份mysql数据库
  6. Android之自定义属性
  7. 虚拟机随服务器启动,VMware Server中虚拟机随宿主机自动启动
  8. “扎金花FANS”进行了改进
  9. EMLOG复制网站文字提醒弹窗源码美化版
  10. 深度学习《Life-Long Learning》
  11. mc服务器tps优化,LaggRemover——降低延迟/优化TPS/内存
  12. CKEditor 4 编辑器已与 Vue.js 集成
  13. Mipmap与可绘制文件夹[重复]
  14. mac git 冲突工具
  15. git SourceTree 客户端 安装/使用教程
  16. Drupal主题开发
  17. 计算机打字皮肤怎么退出,使用搜狗输入法电脑版中设置快捷键更换皮肤的方法...
  18. IDEA 在hdfs中创建目录
  19. VmWare12 遭win11程序兼容性助手阻止运行的解决方法
  20. CSS3中颜色渐变色彩

热门文章

  1. 一个很好的自学网站~推荐一下
  2. 已知一个掺杂了多个数字字符的中文名拼音,去掉所有数字字符之后,形式为“名”+空格+“姓”;并且名和姓的首字母大写,其他小写,要求输出姓名全拼,且全为小写。(后附详细样例说明)
  3. 如何创建Java程序
  4. python网页爬虫例子_Python网络爬虫 - 一个简单的爬虫例子
  5. 计算机里的东西不小心删除如何恢复,原先在电脑界面上的文件不小心删除了怎么恢复,谢谢了...
  6. Qt使用invokeMethod反射机制实现进程间的通信
  7. html css 核心设计理念
  8. Makefile用法链接
  9. 大厂首发:2021年Java工作或更难找
  10. CSS的三种基础选择器,面试必问