如何 Hook 方法 Class.class.getResourceAsStream?

2017-10-19 14:01:27 +08:00
 gam2046

起因

leader 提的诡异需求,有一批旧项目,需要在一个 android 项目中使用。 使用场景是在 android 设备中通过网络下载这些 jar (已使用 dx --dex 转换 bytecode ),加载并启动。 但是由于环境的变化导致原项目中一些资源请求不存在,需要重定向。

经过

目前的做法是,在 android 项目中使用自定义 ClassLoader 加载这些 jar,并启动。 目前碰到的问题是由于旧项目中大量的使用了 Class.class.getResourceAsSteamthis.getClass().getResourceAsStream方法。

后者由于是通过我自定义的 ClassLoader 加载, 因此调用请求会被委托到我自定义 ClassLoader 的 getResourceAsStream 方法上。没有问题。

问题就在于Class.class.getResourceAsSteam这样的调用,由于双亲委派,是由 Boot ClassLoader 加载。 因此我无法重定向这些资源请求。

尝试过这些方案:

求结果

目前需要的效果是,可以通过各种奇技淫巧(不包括修改旧项目的源代码),重定向这些代码中的类似 String/Class/System.clsss.getResourceAsStream方法的调用。

感谢各位能够提供解决方法或者思路的。

1547 次点击
所在节点    Java
3 条回复
cppgohan
2017-10-20 10:27:42 +08:00
关注一下, 总觉得用反射修改 classloader 应该是可以一试的.. 不知道为什么会找不到
sutra
2017-10-20 15:28:47 +08:00
在 classpath 里给它那个 resource,用符号链接,不知道行不行。
teemoer
2017-10-23 15:45:32 +08:00
xposed (手动滑稽)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/398929

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX