xh321 / BetterQQMini-bilibili-external

BetterQQMini 插件 - QQNT B站小程序自动跳转浏览器
MIT License
2 stars 0 forks source link

[Discussion] 关于屏蔽小程序页面出现 #1

Closed festoney8 closed 1 year ago

festoney8 commented 1 year ago

我试验了一下,在解包asar后的 app/index.js 里,把所有 BrowserWindow ready-to-show 时调用的 show() 方法注释掉(大概有3处),可以做到不展示小程序页面,配合拦截B站URL就可以做到浏览器打开

那么可不可以在插件里覆盖 BrowserWindow 的 show() 方法让它什么都不做,达到无窗口展示直接跳浏览器的效果?不知道会不会影响主程序运行

xh321 commented 1 year ago

尽量不要解包,因为小程序asar随时可能被QQ自动更新,很容易失效。 我稍微深入看了一下,可以直接覆盖BrowserWindow的show函数,但这会通杀所有小程序,导致你一个都打不开,毕竟可能还是有人需要别的小程序的,比如腾讯文档。 如果能获取小程序启动参数,判定是b站就kill,其他不管就好了,但不太能做到。小程序启动的时候(也就是插件加载的时候)根本不知道目标小程序,而是先无脑拉起loading界面,然后等待MSF回调才能知道目标小程序。

festoney8 commented 1 year ago

get,我这需求只有打开B站小程序,所以选择了干掉窗口显示,直接把main指向解包后的文件夹了。 MSF回调里很多的参,打log看见一个走MSF的https请求获取小程序信息,里面出现了bvid,索性直接拦截之后quit

判定是b站就kill其实有可能做到,它好像在MSF获取数据之前和之后分别调用了BrowserWindow,只干掉loading的,在MSF中判定小程序名称就可以,但无法通过插件实现,只能走解包路线。

xh321 commented 1 year ago

我这里可以require MSF模块来拿到初始化信息,但是这样的话,小程序就会报错 猜测可能MSF只能通讯一次 appid: 'miniapp://open/1036?url=https%3A%2F%2Fm.q.qq.com%2Fa%2Fs%2Fe99903d4f9cff285e942de2b076c605e%3Fscene%3D1007%26min_refer%3D10001' 这里可以根据URL参数判断是b站小程序 做应该是能做到的,就是得想想办法

festoney8 commented 1 year ago

这个URL就是返回小程序信息的URL,走MSF模块调用获取到一个json,里面有小程序的各种数据,但无法用其他方法模拟这个请求,后端疑似做了UA验证,或者他自己有一套请求格式。 MSF请求的底层不是nodejs通信,它好像调用了本地二进制文件 msf-win32-x64.node和child-ipc-core-x64.dll,是一个TLSv1.2的客户端通信,无法抓明文包,调用过程参数很多很复杂,里面还有sso request之类的复杂流程.... 路基本堵死了XD

xh321 commented 1 year ago

至少,根据里面的id你可以知道是b站小程序,这就足够了 现在是插件使用msf后,即使我把msf session destory了,小程序自己还是会崩溃,就到不了后面的窗口创建,拿不到参数了

xh321 commented 1 year ago

解析那个URL的函数倒是找到了,好像是一个protobuf,还得走MSF才能请求

festoney8 commented 1 year ago

我不知道你发的URL是不是去除了敏感信息,我log里的URL会包含gid和sessionid,sessiontype,其中gid是小程序信息所在群的群号,后面会用到,感觉是你获取到的URL不大对 后面确实是一个IPC通信,离不开MSF模块的,目前看只能顺着他混淆后JS的流程走

xh321 commented 1 year ago

感觉挺麻烦的,只是一个窗口展示问题就弄复杂了 我告诉你不拆包怎么解决,修改BetterQQMini的index.js源码 你会发现有一个HookedBrowserWindowClass没用上 在里面写一个空的show函数 最终是这样

class HookedBrowserWindowClass extends loaded_module.BrowserWindow {
        constructor(original_config) {
          const config = {
            ...original_config,
            webPreferences: {
              ...original_config?.webPreferences,
              devTools: true,
            },
          };
          super(config);
          callback(this);
        }
        show(){
          console.log("Miniprogram BrowserWindow show, let's do nothing!")
        }
      }

然后在return里加上 BrowserWindow: HookedBrowserWindowClass, 变成

      return {
        ...loaded_module,
        BrowserWindow: HookedBrowserWindowClass,
        BrowserView: HookBrowserView,
      };

就可以了 不需要拆包解决,但这样会导致弹2次网页窗口,暂时不知道什么原因

festoney8 commented 1 year ago

好的我去试试,如果不行我就维持我自己的魔改包,QQ更新一次我就魔改一次XD

xh321 commented 1 year ago

问题终结,NTQQ更新了右键小程序打开浏览器(