diff --git a/universal_redirect.js b/universal_redirect.js index 580efe0..82abc51 100644 --- a/universal_redirect.js +++ b/universal_redirect.js @@ -5,26 +5,64 @@ function main(stage, parameters) { return; } - const SystemDll = Il2cppApiWrap.GetImageByName("System.dll"); + // Redirect http requests + const UnityWebRequestSetUrlPtr = Helpers.FindMethodImpl("UnityEngine.UnityWebRequestModule.dll", "UnityEngine.Networking", "UnityWebRequest", "set_url", 1); + const UriCtorPtr = Helpers.FindMethodImpl("System.dll", "System", "Uri", ".ctor", 1); + + console.log("Found UnityWebRequest::set_url at " + UnityWebRequestSetUrlPtr); + console.log("Found Uri::ctor at " + UriCtorPtr); + + RedirectCallback.targetHost = parameters.redirectHost; + Interceptor.attach(UnityWebRequestSetUrlPtr, RedirectCallback); + Interceptor.attach(UriCtorPtr, RedirectCallback); - const SystemUriClass = Il2cppApiWrap.GetClassByName(SystemDll, "System", "Uri"); - const SystemUriCtor = Il2cppApiWrap.GetClassMethodByName(SystemUriClass, ".ctor", 1); - - console.log("Found System.Uri.ctor(System.String) at " + SystemUriCtor.readPointer()); - - Interceptor.attach(SystemUriCtor.readPointer(), { - onEnter(args) { - var requestUrl = args[1].readCSharpString(); - if (requestUrl.startsWith("http://") || requestUrl.startsWith("https://")) { + console.log("Attached successfully, will redirect all requests to: " + parameters.redirectHost); + + // Hook ZFGameBrowser to redirect in-game WebView + const BrowserLoadURL = Helpers.FindMethodImpl("ZFBrowser.dll", "ZenFulcrum.EmbeddedBrowser", "Browser", "LoadURL", 2); + + if (BrowserLoadURL) { + Interceptor.attach(BrowserLoadURL, { + onEnter(args) { + var requestUrl = args[1].readCSharpString(); var prefix = requestUrl.split('/', 3).join('/'); args[1] = Il2cppApiWrap.AllocateString(requestUrl.replace(prefix, parameters.redirectHost)); - console.log("redirected: " + args[1].readCSharpString()); + console.log("EmbeddedBrowser redirected: " + args[1].readCSharpString()); } + }); + + console.log("Successfully hooked EmbeddedBrowser"); + } +} + +const RedirectCallback = { + onEnter(args) { + var requestUrl = args[1].readCSharpString(); + if (requestUrl.startsWith("http://") || requestUrl.startsWith("https://")) { + if (requestUrl.includes(RedirectCallback.targetHost)) return; // already redirected + + var prefix = requestUrl.split('/', 3).join('/'); + args[1] = Il2cppApiWrap.AllocateString(requestUrl.replace(prefix, RedirectCallback.targetHost)); + + console.log("redirected: " + args[1].readCSharpString()); } - }); - - console.log("Attached successfully, will redirect all requests to: " + parameters.redirectHost); + } +}; + +const Helpers = { + FindMethodImpl(moduleName, namespace, className, methodName, argCount) { + const module = Il2cppApiWrap.GetImageByName(moduleName); + if (module.equals(ptr(0))) return null; + + const il2cppClass = Il2cppApiWrap.GetClassByName(module, namespace, className); + if (il2cppClass.equals(ptr(0))) return null; + + const il2cppMethod = Il2cppApiWrap.GetClassMethodByName(il2cppClass, methodName, argCount); + if (il2cppMethod.equals(ptr(0))) return null; + + return il2cppMethod.readPointer(); + } } const Il2cppApiWrap = {