From cc99fa83468f783447b87c8c5ee41e2787b93eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sat, 25 Jan 2025 00:37:33 +0800 Subject: [PATCH] fix: renderer --- src/framework/liteloader.cjs | 2 +- src/framework/napcat.cjs | 100 ++++++++++++++++++++++++++++++++--- src/framework/preload.cjs | 2 +- src/framework/renderer.js | 5 +- 4 files changed, 98 insertions(+), 11 deletions(-) diff --git a/src/framework/liteloader.cjs b/src/framework/liteloader.cjs index 75ce8d3f..beaf7b3f 100644 --- a/src/framework/liteloader.cjs +++ b/src/framework/liteloader.cjs @@ -2,7 +2,7 @@ const { ipcMain, BrowserWindow } = require('electron'); const napcat = require('./napcat.cjs'); const { shell } = require('electron'); -ipcMain.handle('napcat_get_webtoken', async (event, arg) => { +ipcMain.handle('napcat_get_webui', async (event, arg) => { return napcat.NCgetWebUiUrl(); }); ipcMain.on('open_external_url', (event, url) => { diff --git a/src/framework/napcat.cjs b/src/framework/napcat.cjs index fb44300a..e5f2424a 100644 --- a/src/framework/napcat.cjs +++ b/src/framework/napcat.cjs @@ -1,6 +1,94 @@ -/** - * @description 此代码禁止除NapCat外任何地方使用 使用需获取许可 - *@author: Mlikiowa - *@date: 2024-08-23 - */ -const _0x1a03ce=_0xad3e;(function(_0x58caf1,_0x24b227){const _0x338a63=_0xad3e,_0x23a224=_0x58caf1();while(!![]){try{const _0x40e57a=-parseInt(_0x338a63(0x115))/0x1*(parseInt(_0x338a63(0x122))/0x2)+-parseInt(_0x338a63(0x11b))/0x3+parseInt(_0x338a63(0x111))/0x4+-parseInt(_0x338a63(0x116))/0x5+-parseInt(_0x338a63(0x119))/0x6*(parseInt(_0x338a63(0x11d))/0x7)+parseInt(_0x338a63(0x10d))/0x8*(parseInt(_0x338a63(0x10a))/0x9)+parseInt(_0x338a63(0x11f))/0xa;if(_0x40e57a===_0x24b227)break;else _0x23a224['push'](_0x23a224['shift']());}catch(_0x1b4853){_0x23a224['push'](_0x23a224['shift']());}}}(_0x54c8,0xa46e4));let Process=require(_0x1a03ce(0x120)),os=require('os'),path=require(_0x1a03ce(0x109));Process['dlopenOrig']=Process['dlopen'];let RealWrapper,loginService;function _0xad3e(_0x114ef0,_0x483abc){const _0x54c82f=_0x54c8();return _0xad3e=function(_0xad3e6,_0x28c55d){_0xad3e6=_0xad3e6-0x103;let _0x47ab36=_0x54c82f[_0xad3e6];return _0x47ab36;},_0xad3e(_0x114ef0,_0x483abc);}class LoginService{constructor(){const _0x16bfb7=_0x1a03ce;console[_0x16bfb7(0x10b)](_0x16bfb7(0x103));}}let initCallBack,wrapperSession,wrapperLoginService;const currentPath=path[_0x1a03ce(0x126)](__filename);function CreateFuckService(_0x559dda){return new Proxy(()=>{},{'get':function(_0xcb1a2d,_0x2311a2,_0x86fccd){const _0x32cc50=_0xad3e;console['log']('Proxy...\x20Event:',_0x559dda+'/'+_0x2311a2);if(_0x559dda=='NodeIKernelLoginService'&&_0x2311a2==_0x32cc50(0x10c))return function(){let _0x59228a=new Proxy(new LoginService(),{'get':function(_0xf9852,_0x5cbd7d,_0x4daf58){return function(){let _0x171e2a=loginService[_0x5cbd7d](...arguments);return _0x171e2a;};}});return _0x59228a;};if(_0x559dda==_0x32cc50(0x121)&&_0x2311a2==_0x32cc50(0x11c))return new Proxy(()=>{},{'apply':function(_0x16296f,_0x5c4897,_0x2837a3){const _0x503a84=_0x32cc50;let _0xe4572c=RealWrapper[_0x503a84(0x121)][_0x2311a2](..._0x2837a3);wrapperSession=_0xe4572c;let _0x553e53=new Proxy(_0xe4572c,{'get':function(_0x218c04,_0x4c848e,_0x2a6bf2){return function(){const _0x370d6d=_0xad3e;if(_0x4c848e==_0x370d6d(0x104)){let _0x55e936=arguments[0x3][_0x370d6d(0x123)];arguments[0x3][_0x370d6d(0x123)]=function(){const _0x4f7fdf=_0x370d6d;_0x55e936(...arguments),initCallBack[_0x4f7fdf(0x105)](_0x3fac30=>_0x3fac30(...arguments)),clearHook();};}let _0x27b203=_0xe4572c[_0x4c848e](...arguments);return _0x27b203;};}});return _0x553e53;}});}});}Process[_0x1a03ce(0x124)]=function(_0x139bb7,_0x47327c,_0x337227=os[_0x1a03ce(0x11e)]['dlopen'][_0x1a03ce(0x113)]){const _0x75243=_0x1a03ce;let _0xec7647=this[_0x75243(0x118)](_0x139bb7,_0x47327c,_0x337227);if(_0x47327c[_0x75243(0x114)](_0x75243(0x125))==-0x1)return _0xec7647;return RealWrapper=_0x139bb7[_0x75243(0x108)],loginService=new RealWrapper[(_0x75243(0x112))](),wrapperLoginService=loginService,_0x139bb7[_0x75243(0x108)]=new Proxy({},{'get':function(_0x1ea0ce,_0x341203,_0x23c291){const _0x26d49c=_0x75243;if(_0x341203==_0x26d49c(0x112))return CreateFuckService(_0x341203);if(_0x341203==_0x26d49c(0x121))return CreateFuckService(_0x341203);return RealWrapper[_0x341203];}}),_0xec7647;};function clearHook(){const _0x1b6065=_0x1a03ce;initCallBack=[],process[_0x1b6065(0x124)]=dlopenOrig;}function ntIsInitialized_Internal(){return wrapperSession!==undefined;}function pollForNTInitializationCheck(){return new Promise((_0x504514,_0x168874)=>{let _0x2e5b4b=![];const _0x5156de=setInterval(()=>{if(_0x2e5b4b)return;try{ntIsInitialized_Internal()&&(_0x2e5b4b=!![],clearInterval(_0x5156de),_0x504514(!![]));}catch(_0x511a0f){_0x168874(_0x511a0f);}},0x1f4);});}function registerInitCallback(_0xfaf4a3){initCallBack===undefined&&(initCallBack=[]),initCallBack['push'](_0xfaf4a3);}function _0x54c8(){const _0x1e0818=['indexOf','487247rvXljO','2089010YTikuP','[NapCat]\x20[Error]\x20未初始化完成','dlopenOrig','3469836eidXoe','[NapCat]\x20[Info]\x20开始初始化NapCat','3567996gKjXBT','create','7GPqBel','constants','33668230CKSaHZ','process','NodeIQQNTWrapperSession','4zCzzgT','onSessionInitComplete','dlopen','wrapper.node','dirname','fetchServices\x20Timeout!','[NapCat]\x20Fuck\x20LoginService\x20Loading...','init','forEach','./napcat.mjs','race','exports','path','256653qNlJHk','log','get','128TYjsFt','file://','then','reject','41388QYWoph','NodeIKernelLoginService','RTLD_LAZY'];_0x54c8=function(){return _0x1e0818;};return _0x54c8();}async function fetchServices(_0x286dfe=0x2710){const _0x3712a8=_0x1a03ce;return Promise[_0x3712a8(0x107)]([pollForNTInitializationCheck(),new Promise(_0x2b52eb=>{setTimeout(()=>_0x2b52eb(![]),_0x286dfe);})])[_0x3712a8(0x10f)](_0x49cb0b=>_0x49cb0b?{'wrapperSession':wrapperSession,'wrapperLoginService':wrapperLoginService}:Promise[_0x3712a8(0x110)](_0x3712a8(0x127)));}let getWebUiUrlFunc=undefined;async function NCInit(){const _0x2db7c8=_0x1a03ce;console[_0x2db7c8(0x10b)](_0x2db7c8(0x11a));try{const {wrapperSession:_0x473fd0,wrapperLoginService:_0x19d524}=await fetchServices(),{NCoreInitFramework:_0x50ebf2,getWebUiUrl:_0x454874}=await import(_0x2db7c8(0x10e)+path['join'](currentPath,_0x2db7c8(0x106)));getWebUiUrlFunc=_0x454874,await _0x50ebf2(_0x473fd0,_0x19d524,registerInitCallback);}catch(_0x97e479){console[_0x2db7c8(0x10b)]('[NapCat]\x20[Error]\x20初始化NapCat失败',_0x97e479);}}NCInit(),module[_0x1a03ce(0x108)]={'NCgetWebUiUrl':async()=>{const _0x2cd33c=_0x1a03ce;if(getWebUiUrlFunc===undefined)return console[_0x2cd33c(0x10b)](_0x2cd33c(0x117)),'';return await getWebUiUrlFunc();}}; \ No newline at end of file +let process = require('process'); +let os = require('os'); +let path = require('path'); + +// 保存原始dlopen +const dlopenOrig = process.dlopen; + +let wrapperSession; +let wrapperNodeApi; +let wrapperLoginService; +let getWebUiUrlFunc; +let ncCallback = () => { }; +let napCatInitialized = false; // 添加一个标志 + +function createServiceProxy(ServiceName) { + return new Proxy(() => { }, { + get: (target, FunctionName) => { + console.log(ServiceName, FunctionName); + if (ServiceName === 'NodeIQQNTWrapperSession' && FunctionName === 'create') { + return () => new Proxy({}, { + get: function (target, ClassFunName, receiver) { + return function () { + if (ClassFunName === 'init') { + let origin = arguments[3].onOpentelemetryInit; + arguments[3].onOpentelemetryInit = function (result) { + origin(...arguments); + if (result.is_init) { + ncCallback(); + } + } + } + let ret = wrapperSession[ClassFunName](...arguments); + return ret; + } + } + }); + } + if (ServiceName === 'NodeIKernelLoginService' && FunctionName === 'get') { + return () => wrapperLoginService; + } + return wrapperNodeApi[ServiceName][FunctionName]; + } + }); +} + +function clearHook() { + process.dlopen = dlopenOrig; +} + +async function initializeNapCat() { + console.log('[NapCat] [Info] 开始初始化NapCat'); + try { + const currentPath = path.dirname(__filename); + const { NCoreInitFramework, getWebUiUrl } = await import('file://' + path.join(currentPath, './napcat.mjs')); + getWebUiUrlFunc = getWebUiUrl; + await NCoreInitFramework(wrapperSession, wrapperLoginService, (callback) => { ncCallback = callback }); + + } catch (error) { + console.log('[NapCat] [Error] 初始化NapCat', error); + } +} + +process.dlopen = function (module, filename, flags = os.constants.dlopen.RTLD_LAZY) { + const dlopenRet = dlopenOrig(module, filename, flags); + if (!filename.includes('wrapper.node') || napCatInitialized) return dlopenRet; + napCatInitialized = true; // 初始化完成后设置标志 + clearHook(); + wrapperNodeApi = module.exports; + wrapperLoginService = wrapperNodeApi.NodeIKernelLoginService.get(); + wrapperSession = wrapperNodeApi.NodeIQQNTWrapperSession.create(); + + initializeNapCat().then().catch(); + + module.exports = new Proxy({}, { + get: (target, ServiceName) => { + if (ServiceName === 'NodeIKernelLoginService' || ServiceName === 'NodeIQQNTWrapperSession') { + return createServiceProxy(ServiceName); + } + return wrapperNodeApi[ServiceName]; + } + }); + + return dlopenRet; +}; + +module.exports = { + NCgetWebUiUrl: async () => { + if (!getWebUiUrlFunc) { + console.log('[NapCat] [Error] 未初始化完成'); + return ''; + } + return await getWebUiUrlFunc(); + } +}; \ No newline at end of file diff --git a/src/framework/preload.cjs b/src/framework/preload.cjs index 8c9a961a..9a768da5 100644 --- a/src/framework/preload.cjs +++ b/src/framework/preload.cjs @@ -1,7 +1,7 @@ const { contextBridge, ipcRenderer } = require('electron'); const napcat = { getWebUiUrl: async () => { - return ipcRenderer.invoke('napcat_get_webtoken'); + return ipcRenderer.invoke('napcat_get_webui'); }, openExternalUrl: async (url) => { ipcRenderer.send('open_external_url', url); diff --git a/src/framework/renderer.js b/src/framework/renderer.js index 5d137f9b..dfcb9da3 100644 --- a/src/framework/renderer.js +++ b/src/framework/renderer.js @@ -1,13 +1,12 @@ export const onSettingWindowCreated = async (view) => { let webui = await window.napcat.getWebUiUrl(); - let webuiReact = await window.napcat.getWebUiUrlReact(); view.innerHTML = ` - 在QQ内打开配置页面(VUE) - 在默认浏览器打开配置页面(VUE) + 在QQ内打开配置页面 + 在默认浏览器打开配置页面