go-kiss / monkey

Go语言猴子补丁框架
https://taoshu.in/go/monkey/
MIT License
119 stars 18 forks source link

如何做到在patch状态下调用原函数 #1

Closed zeromake closed 2 years ago

zeromake commented 2 years ago

刚刚睡不着,画了大概10多分钟看了go夜读的

119 Go monkey patch 的原理及应用

录播,发现都有一个问题对于类似这种情况见: https://github.com/cch123/supermonkey/issues/12 我看了原理以后感觉应该还是有办法能解决的,例如给开始加个汇编的判断,然后强制走回原函数,不过这个判断的值就比较麻烦了,如果引用一个全局变量倒是比较简单,但是这样频繁修改也不是太合理,要是能直接判断出父级方法是指定的方法然后调用原函数就好了。

顺便放一下应用场景: https://blog.zeromake.com/pages/replace-now-offset/

zeromake commented 2 years ago

顺便一提刚刚手机浏览器去博文一看就放弃了,广告入侵的有点多,可能只是我个人对强制长期占屏幕上一部分那种广告非常反感的原因吧,文中插一两条广告还行。

taoso commented 2 years ago

我看了原理以后感觉应该还是有办法能解决的

从原理上讲,要想实现 mock 某个函数而不修改调用的地方,那就只能修改该函数的代码段。而这一段在进程内是唯一的。一旦改了代码段,那原函数就不能通过简单的方法来运行了。当前的方案是把修改之前的部分备份下来,分两步跳转执行。

频繁修改确实不好。所以我只在第一次 mock 的时候写入完整的跳转指令,后续都只修改跳转地址。但可能没有地址对齐,所以写入地址的过程可能不是原子的。

taoso commented 2 years ago

顺便一提刚刚手机浏览器去博文一看就放弃了,广告入侵的有点多,可能只是我个人对强制长期占屏幕上一部分那种广告非常反感的原因吧,文中插一两条广告还行。

多谢反馈。不过广告是我有意添加的。广告的内容 Google Adsens 会自动选择,数量也是自动控制的,但我已经调到最低了。

我写的文章大多涉及代码,不太适合在手机端阅读。你觉得广告有点多不想阅读,只能说明我的文章内容质量不够。我会把广告当作内容质量的试金石。只有真正高质量的内容才会吸引读者。