来几个真* Java 大神指点一下一个重写方法的非正常操作 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kings0527
V2EX    Java

来几个真* Java 大神指点一下一个重写方法的非正常操作

  •  
  •   kings0527 2020-07-23 11:32:35 +08:00 3523 次点击
    这是一个创建于 1974 天前的主题,其中的信息可能已经有所发展或是发生改变。

    其实本身环境是反编译注入代码 当前的上下文环境中 有一个 innerclass 可以 find 然后 new 出来 innerclass 本身扩展重写了 baseclass 里面的某个回调函数 onrespones innerclass 生成的对象可以通过 invoke 的方式去执行 execute 函数触发 onrespones

    问题:如何 1)正向的方式去 ne 出一个对象 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 的对象

    16 条回复    2020-08-19 18:06:17 +08:00
    kings0527
        1
    kings0527  
    OP
       2020-07-23 11:33:24 +08:00
    打的回车全部没了 难受了 。。。
    kings0527
        2
    kings0527  
    OP
       2020-07-23 11:36:57 +08:00
    再加一下问题总结 抱歉上面的格式 需要各位耐心读懂一下

    不是只执行这个对象的 execute 方法 还要重写这个对象的 onrespones 方法

    1 通过反射并且仅能 new 一个 imp 类的对象
    2 修改重写这个对象的 onrespones 方法 执行自己的逻辑(目前的方法是动态代理)
    3 通过动态代理 new 出来的对象去执行原对象的 execute 方法(没有类型转换 运行时 invoke 会 no method )

    一句话概括就是当前的 context 下 只有一个 innerobj 如何执行这个 innerobj 的 execute 方法 并且 劫持 onrespones 方法
    kings0527
        3
    kings0527  
    OP
       2020-07-23 11:42:24 +08:00
    感觉来几个做 Java 架构师的大佬应该可以几句话就点明解决方法
    感觉自己的思路被动态代理捆绑了
    或许还有其他思路达到这个目的 我绕了两天实在想不到了

    最差最差的办法就是 先 hook 修改这个类的 onrespones 方法
    然后添加标志位属性
    然后自己 new 出来的时候去更新标志位
    hook 拦截到以后根据标志位来查看是否处理

    但是这样子的话逻辑就需要写在两坨甚至很多坨代码里面
    不利于扩展和回调
    代码丑陋 数据混乱 看着实在想吐
    最主要的是想把这个坑填上
    CoderGeek
        4
    CoderGeek  
       2020-07-23 11:43:53 +08:00
    你能做个接口 子类继承这个 innerobj 嘛 然后 onrespones 自己实现 都注入可以不? 也可以做个 map 管理一下呢? 基本上就是动态代理 重写 一般配合接口和继承子类之类的方式解决
    kings0527
        5
    kings0527  
    OP
       2020-07-23 12:12:15 +08:00
    @CoderGeek 只能通过 findclass 获取到类 所以不能使用 extends 关键字
    当前上下文 有且仅有一个 object 所有的操作 都是基于反射来查找和调用
    kings0527
        6
    kings0527  
    OP
       2020-07-23 13:21:46 +08:00
    红包答谢可以吗 或许能解决这个问题的大神根本不在乎小恩小惠 略表心意 仅想做个技术储备
    blindpirate
        7
    blindpirate  
       2020-07-23 13:54:32 +08:00
    Bytebuddy.subclass(X.class)

    https://zhuanlan.zhihu.com/p/84514959
    SakuraSa
        8
    SakuraSa  
       2020-07-23 15:14:17 +08:00
    感觉是想做 AOP ?
    Spring 中是用 Proxy 和 Cglib 实现的。
    kings0527
        9
    kings0527  
    OP
       2020-07-23 15:58:27 +08:00
    是的 中心思想其实是 aop
    我还在看楼上大佬介绍的 buddy 框架
    quericy
        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
    kings0527
        11
    kings0527  
    OP
       2020-07-23 17:27:46 +08:00
    @blindpirate
    byte duddy 失败告终 找不到类
    我不知道它的操作是怎么实现的
    但是我的操作环境其实类似于在一个已经多个 jar 包项目的进程中 注入我自己的 jar 包
    其实就是通过注入的方式 入侵到某个 Android app 的进程 然后执行我自己的 jar


    @quericy 基于字节码的方式估计有点行不通 类似的还有 dexmaker 还有很多

    暂时弃坑了 心塞的很 先写一个屎一样的代码凑合吧
    CoooooolFrog
        12
    CoooooolFrog  
       2020-07-27 10:25:59 +08:00
    你可以了解一下 Java Attach 机制,通过 Attach 的方式可以实现你上面说的需求。
    “在一个已经多个 jar 包项目的进程中 注入我自己的 jar 包”
    但是你的环境是 Android App,我不太了解 Android 的 JVM 是否支持 Attach 机制,具体你可以搜索一下。
    CoooooolFrog
        13
    CoooooolFrog  
       2020-07-27 10:28:47 +08:00
    另外给你推荐一个开源项目,https://github.com/alibaba/jvm-sandbox,和你的需求很像,但是都是 Java 服务端的东西,不知道能否直接用在客户端上
    LLaMA2
        14
    LLaMA2  
       2020-07-27 16:07:19 +08:00
    感觉你在研究别人的 android 项目,想要搞他的 okhttp3 中的网络请求返回,加点自己的"佐料"已满足自己的口味,那么问题来了,这种事情直接下 hook,可以做到的效果是,该方法执行前和执行后中添加佐料
    122006
        15
    122006  
       2020-07-31 19:58:57 +08:00
    啥,又要运行原来的代码又要运行你重写的方法?那就上 hook 。标志位判断一下
    可以看一下 weishu 大佬的 epic
    kings0527
        16
    kings0527  
    OP
       2020-08-19 18:06:17 +08:00
    @122006 其实就是写 xposed 插件

    最差最差的办法就是 先 hook 修改这个类的 onrespones 方法
    然后添加标志位属性
    然后自己 new 出来的时候去更新标志位
    hook 拦截到以后根据标志位来查看是否处理


    上面说过了 不想一坨坨的写
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1188 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:43 PVG 01:43 LAX 09:43 JFK 12:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86