关于javaagent拦截不到File类的问题

liumangbunny 2017-01-11 01:09:04
main类:

public static void main(String[] args) {
File file = new File("e:\\3.txt");
System.out.println(file.getName());
}

premain类:

public static void premain(String agentArs, Instrumentation inst) throws IOException {
// 初始化配置
inst.addTransformer(new ThunisoftClassFileTransformer());
}

转换器类:

public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
className = className.replace('/', '.');
System.out.println(className);
return null;
}


拦截什么都不干,只是输出拦截到的类,执行结果只能拦截到以下类,为什么拦截不到File类???贴图有点问题,我就直接贴运行结果了。求大神解答啊,这个拦截的类到底是怎么定义的,是拦截哪些类啊,为什么会没有File类?
java.lang.invoke.Method
java.lang.invoke.Method
java.lang.invoke.Method
java.util.function.Func
java.lang.invoke.Method
java.lang.invoke.Method
java.lang.ClassValue
java.lang.ClassValue$En
java.lang.ClassValue$Id
java.lang.ClassValue$Ve
java.lang.invoke.Member
java.lang.invoke.Method
java.lang.invoke.Method
sun.misc.PostVMInitHook
sun.usagetracker.UsageT
java.util.concurrent.at
sun.usagetracker.UsageT
sun.usagetracker.UsageT
sun.usagetracker.UsageT
java.lang.ProcessEnviro
java.lang.ProcessEnviro
java.lang.ProcessEnviro
java.util.Collections$U
java.lang.ProcessEnviro
java.util.HashMap$Entry
java.lang.ProcessEnviro
java.util.HashMap$Entry
java.lang.ProcessEnviro
sun.usagetracker.UsageT
java.io.FileOutputStrea
sun.launcher.LauncherHe
hello.IOTest
sun.launcher.LauncherHe
3.txt
sun.misc.Signal$1
java.lang.Shutdown
java.lang.Shutdown$Lock
...全文
551 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
秘密基塔 2017-07-20
  • 打赏
  • 举报
回复
javaagent 拦截不到BootstrarLoader加载器加载的类
liumangbunny 2017-01-13
  • 打赏
  • 举报
回复
还有高手了解吗,为什么拦截不到File类
liumangbunny 2017-01-12
  • 打赏
  • 举报
回复
引用 9 楼 M173475237 的回复:
[quote=引用 8 楼 liumangbunny 的回复:] [quote=引用 7 楼 M173475237 的回复:] 这样的话,在transform方法里找你的hello.IOTest类,然后写对应的classVisitor,根据全限定名找调用file类的init方法,并重写即可。没必要改file类 如果我没记错的话,直接改File类的话,实际执行的还是没有改过的类。而且还涉及到类加载器方面的问题。
我想拦截不一定是真正有的File类啊,比如PrintWriter(String FileName),这个方法底层也是调用了File(String FileName)的,这种我也想拦截下来。[/quote] 举个例子吧,我之前做的是拦截网络请求。比如httpclient这个框架,是在调用urlconnection方法时开启网络请求。我就可以在目标代码里(相当与app,jar)找所有调用urlconnection方法的地方进行hook,而不用更改框架本身。    虽然公司内部肯定会针对框架再封装一层,但是只要他是基于httpclient的话,都是一样可以拦截的。  [/quote] 哦哦,所以用这个方法,也可以找到封装过的方法是吗?我是想拦截所有File的构造方法,获取文件名文件路径,然后分析判断记录。因为像PrintWriter和FileOutputStream这些方法,如果传入的是文件路径,其实jdk底层还是调用了File的构造方法来创建的,所以就想拦截File的构造方法。
M阳光 2017-01-11
  • 打赏
  • 举报
回复
引用 8 楼 liumangbunny 的回复:
[quote=引用 7 楼 M173475237 的回复:] 这样的话,在transform方法里找你的hello.IOTest类,然后写对应的classVisitor,根据全限定名找调用file类的init方法,并重写即可。没必要改file类 如果我没记错的话,直接改File类的话,实际执行的还是没有改过的类。而且还涉及到类加载器方面的问题。
我想拦截不一定是真正有的File类啊,比如PrintWriter(String FileName),这个方法底层也是调用了File(String FileName)的,这种我也想拦截下来。[/quote] 举个例子吧,我之前做的是拦截网络请求。比如httpclient这个框架,是在调用urlconnection方法时开启网络请求。我就可以在目标代码里(相当与app,jar)找所有调用urlconnection方法的地方进行hook,而不用更改框架本身。    虽然公司内部肯定会针对框架再封装一层,但是只要他是基于httpclient的话,都是一样可以拦截的。  
liumangbunny 2017-01-11
  • 打赏
  • 举报
回复
引用 7 楼 M173475237 的回复:
这样的话,在transform方法里找你的hello.IOTest类,然后写对应的classVisitor,根据全限定名找调用file类的init方法,并重写即可。没必要改file类 如果我没记错的话,直接改File类的话,实际执行的还是没有改过的类。而且还涉及到类加载器方面的问题。
我想拦截不一定是真正有的File类啊,比如PrintWriter(String FileName),这个方法底层也是调用了File(String FileName)的,这种我也想拦截下来。
M阳光 2017-01-11
  • 打赏
  • 举报
回复
引用 6 楼 liumangbunny 的回复:
[quote=引用 5 楼 M173475237 的回复:] [quote=引用 4 楼 liumangbunny 的回复:] [quote=引用 2 楼 M173475237 的回复:] java -javaagent agent.jar -jar app.jar 楼主的app.jar里有用的file类吗?虚拟机没有加载的话,肯定不能transform的
肯定用了啊,app.jar就是第一段测试代码,main类导出的呀[/quote] 是想实现哪一种功能呢?你试一下这个:在premain里,看看有没有你要找的类
inst.getAllLoadedClasses();
[/quote] 这个我试过,感觉输出出来的类太多了,不只是加载过的类,感觉JDK里的类都会输出来。 是想在transform中拦截File类,监控所有涉及了File类传入文件的操作并记录传入的文件到数据库。[/quote] 这样的话,在transform方法里找你的hello.IOTest类,然后写对应的classVisitor,根据全限定名找调用file类的init方法,并重写即可。没必要改file类 如果我没记错的话,直接改File类的话,实际执行的还是没有改过的类。而且还涉及到类加载器方面的问题。
liumangbunny 2017-01-11
  • 打赏
  • 举报
回复
引用 5 楼 M173475237 的回复:
[quote=引用 4 楼 liumangbunny 的回复:] [quote=引用 2 楼 M173475237 的回复:] java -javaagent agent.jar -jar app.jar 楼主的app.jar里有用的file类吗?虚拟机没有加载的话,肯定不能transform的
肯定用了啊,app.jar就是第一段测试代码,main类导出的呀[/quote] 是想实现哪一种功能呢?你试一下这个:在premain里,看看有没有你要找的类
inst.getAllLoadedClasses();
[/quote] 这个我试过,感觉输出出来的类太多了,不只是加载过的类,感觉JDK里的类都会输出来。 是想在transform中拦截File类,监控所有涉及了File类传入文件的操作并记录传入的文件到数据库。
M阳光 2017-01-11
  • 打赏
  • 举报
回复
引用 4 楼 liumangbunny 的回复:
[quote=引用 2 楼 M173475237 的回复:] java -javaagent agent.jar -jar app.jar 楼主的app.jar里有用的file类吗?虚拟机没有加载的话,肯定不能transform的
肯定用了啊,app.jar就是第一段测试代码,main类导出的呀[/quote] 是想实现哪一种功能呢?你试一下这个:在premain里,看看有没有你要找的类
inst.getAllLoadedClasses();
liumangbunny 2017-01-11
  • 打赏
  • 举报
回复
引用 2 楼 M173475237 的回复:
java -javaagent agent.jar -jar app.jar 楼主的app.jar里有用的file类吗?虚拟机没有加载的话,肯定不能transform的
肯定用了啊,app.jar就是第一段测试代码,main类导出的呀
M阳光 2017-01-11
  • 打赏
  • 举报
回复
引用 2 楼 M173475237 的回复:
java -javaagent agent.jar -jar app.jar 楼主的app.jar里有用的file类吗?虚拟机没有加载的话,肯定不能transform的
唉,看到你这个问题让我想起了在以前那个公司用asm 给安卓做hook的日子。虽然苦逼,不过挺有意思的
M阳光 2017-01-11
  • 打赏
  • 举报
回复
java -javaagent agent.jar -jar app.jar 楼主的app.jar里有用的file类吗?虚拟机没有加载的话,肯定不能transform的
liumangbunny 2017-01-11
  • 打赏
  • 举报
回复
3.txt那行是复制错了哈,结果没有那一行的
Java Agent是Arthas使用的技术,是Skywalking使用的技术,是一份十分重要的技术。 课程的稀缺性在此之前,市面上并没有针对Java Agent进行系统介绍的课程。 通过搜索引擎查找,会发现与Java Agent相关的内容大多是个人知识总结分享的内容。这些内容有如下特点:内容质量不一详略程度不一学习难度千差万别总体上来说,学习者很难有一个整体认知、系统学习的过程。 课程的设计目标 在构思课程内容时,本课程带有以下目标:课程学习梯度:从简单到复杂,让学习者有一个循序渐进的理解过程。构造完整、统一的知识体系:不是零散的知识点堆砌,而是有一个统一的贯穿始终的知识框架。具有可操作性的代码示例,不只是讲概念,更注意于实践。课程内容安排 本课程通过四章内容对Java Agent相关知识进行讲解:第一章,介绍Agent Jar的三个组成部分:Manifest、Agent Class和ClassFileTransformer。第二章,介绍Agent Jar的两种启动方式:从命令行启动和使用Attach机制启动。第三章,介绍如何利用Instrumentation API来实现Agent Jar的功能。第四章,Java Agent的应用与技巧。 通过本课程的学习,让同学们更好地建立起一个完整的知识体系:  讲师介绍我叫刘森,南京师范大学研究生毕业,2015年获得信息系统项目管理师(高级),2014年获得系统集成项目管理工程师(中级)。 目前,我的课程都是围绕着“Java字节码”技术展开: 《Java Agent基础篇》是在一个运行JVM当中提供修改字节码的机会《Java ASM系列》(免费课程)是一个操作字节码的库《Java 8 ClassFile》专注于字节码的理论知识,入选为“51CTO数字化人才证书项目认证课程” 因此,我对字节码技术有较为深入的研究和理解,大家想学习字节码的技术可以找我:字节码技术找刘森,轻松学习又省心~~~ 

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧