其实本身环境是反编译注入代码 当前的上下文环境中 有一个 innerclass 可以 find 然后 new 出来 innerclass 本身扩展重写了 baseclass 里面的某个回调函数 onrespones innerclass 生成的对象可以通过 invoke 的方式去执行 execute 函数触发 onrespones
问题:如何 1)正向的方式去 new 出一个对象 2 )重写这个对象的 onrespones 方法 3)执行 execute 函数 4)触发自己重写的 onrespones 函数
问题扩展 1:当前环境下只有一个 object 如何通过反射或者代理或者其他方式 来重写这个 object 的某个方法
问题扩展 2:使用动态代理 new 出一个新的 object 在动态代理类中过滤 invoke 方法进行处理可以实现当前问题 但是仅限于源码级别编译环境 (innerclass)Proxy.newProxyInstance(classloader, Class, new InvocationHandler() {.....}); 上句代码中使用类型强转应该是在编译期间就固定了返回对象的类,从而使返回的对象可以执行 innerclass 中 exexcute 函数 而在注入环境中,无法使用强制转换,使用 cast 函数也一样无效 应该怎么去使用动态代理 new 出 innerclass 的对象进行调用?
问题补充:只是修改当前自己 new 出的 object 的方法 所以动态代理本身就是做这个事情的但是当前环境已经问题 2 讲出来了 并不需要也不想直接修改 innerclass 的方法 不然可以直接使用 hook 框架替换掉 这样子的话就影响到了原程序中所有使用这个 innerclass 的对象
1
kings0527 OP 打的回车全部没了 难受了 。。。
|
2
kings0527 OP 再加一下问题总结 抱歉上面的格式 需要各位耐心读懂一下
不是只执行这个对象的 execute 方法 还要重写这个对象的 onrespones 方法 1 通过反射并且仅能 new 一个 imp 类的对象 2 修改重写这个对象的 onrespones 方法 执行自己的逻辑(目前的方法是动态代理) 3 通过动态代理 new 出来的对象去执行原对象的 execute 方法(没有类型转换 运行时 invoke 会 no method ) 一句话概括就是当前的 context 下 只有一个 innerobj 如何执行这个 innerobj 的 execute 方法 并且 劫持 onrespones 方法 |
3
kings0527 OP 感觉来几个做 Java 架构师的大佬应该可以几句话就点明解决方法
感觉自己的思路被动态代理捆绑了 或许还有其他思路达到这个目的 我绕了两天实在想不到了 最差最差的办法就是 先 hook 修改这个类的 onrespones 方法 然后添加标志位属性 然后自己 new 出来的时候去更新标志位 hook 拦截到以后根据标志位来查看是否处理 但是这样子的话逻辑就需要写在两坨甚至很多坨代码里面 不利于扩展和回调 代码丑陋 数据混乱 看着实在想吐 最主要的是想把这个坑填上 |
4
CoderGeek 2020-07-23 11:43:53 +08:00
你能做个接口 子类继承这个 innerobj 嘛 然后 onrespones 自己实现 都注入可以不? 也可以做个 map 管理一下呢? 基本上就是动态代理 重写 一般配合接口和继承子类之类的方式解决
|
5
kings0527 OP @CoderGeek 只能通过 findclass 获取到类 所以不能使用 extends 关键字
当前上下文 有且仅有一个 object 所有的操作 都是基于反射来查找和调用 |
6
kings0527 OP 红包答谢可以吗 或许能解决这个问题的大神根本不在乎小恩小惠 略表心意 仅想做个技术储备
|
7
blindpirate 2020-07-23 13:54:32 +08:00
|
8
SakuraSa 2020-07-23 15:14:17 +08:00
感觉是想做 AOP ?
Spring 中是用 Proxy 和 Cglib 实现的。 |
9
kings0527 OP 是的 中心思想其实是 aop
我还在看楼上大佬介绍的 buddy 框架 |
10
quericy 2020-07-23 16:23:03 +08:00
试试 Instrument ?可以运行时做字节码增强
https://tech.meituan.com/2019/09/05/java-bytecode-enhancement.html#3-2-instrument |
11
kings0527 OP @blindpirate
byte duddy 失败告终 找不到类 我不知道它的操作是怎么实现的 但是我的操作环境其实类似于在一个已经多个 jar 包项目的进程中 注入我自己的 jar 包 其实就是通过注入的方式 入侵到某个 Android app 的进程 然后执行我自己的 jar @quericy 基于字节码的方式估计有点行不通 类似的还有 dexmaker 还有很多 暂时弃坑了 心塞的很 先写一个屎一样的代码凑合吧 |
12
CoooooolFrog 2020-07-27 10:25:59 +08:00
你可以了解一下 Java Attach 机制,通过 Attach 的方式可以实现你上面说的需求。
“在一个已经多个 jar 包项目的进程中 注入我自己的 jar 包” 但是你的环境是 Android App,我不太了解 Android 的 JVM 是否支持 Attach 机制,具体你可以搜索一下。 |
13
CoooooolFrog 2020-07-27 10:28:47 +08:00
另外给你推荐一个开源项目,https://github.com/alibaba/jvm-sandbox,和你的需求很像,但是都是 Java 服务端的东西,不知道能否直接用在客户端上
|
14
LLaMA2 2020-07-27 16:07:19 +08:00
感觉你在研究别人的 android 项目,想要搞他的 okhttp3 中的网络请求返回,加点自己的"佐料"已满足自己的口味,那么问题来了,这种事情直接下 hook,可以做到的效果是,该方法执行前和执行后中添加佐料
|
15
122006 2020-07-31 19:58:57 +08:00
啥,又要运行原来的代码又要运行你重写的方法?那就上 hook 。标志位判断一下
可以看一下 weishu 大佬的 epic |