如何 Hook 方法 Class.class.getResourceAsStream?

2020-04-16 08:09发布

起因

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

经过

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

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

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

尝试过这些方案:

  • 自定义 ClassLoader,不执行双亲委派原则。但是此时我的自定义 ClassLoader 无法加载系统类的.jar 文件。提示 refusing reopen framework .....(filename)
  • 在自定义 ClassLoader 中,尝试通过双亲委派获得的 Class 对象,通过反射修改其 classloader 对象。[失败]原因不明,提示找不到 classloader 对应的字段。通过Field.getDeclaredFields()方法,也确实没有该属性

求结果

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

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


登录 后发表评论
1条评论