using System; using System.Reflection; using HarmonyLib; using undead_universal_patch_il2cpp.Core; namespace undead_universal_patch_il2cpp.Patches { [HarmonyPatch] public class BestHTTP_Unob { static string TargetTypeName = "BestHTTP.HTTPManager"; static string TargetMethodName = "SendRequest"; static string Description = "Unobfuscated BestHTTP request URL rewrite patch"; static readonly Type targetType = AccessTools.TypeByName(TargetTypeName); static readonly Type requestType = AccessTools.TypeByName("BestHTTP.HTTPRequest"); static bool Prepare() { if (targetType == null) { Plugin.Log.LogWarning($"'{Description}' disabled. The type for this patch was not found."); return false; } if (requestType == null) { Plugin.Log.LogWarning($"'{Description}' disabled. The request type for this patch was not found."); return false; } if (AccessTools.Method(targetType, TargetMethodName, [requestType]) == null) { Plugin.Log.LogWarning($"'{Description}' disabled. The method for this patch was not found."); return false; } Plugin.Log.LogInfo($"'{Description}' succeeded validation."); return true; } static MethodBase TargetMethod() => AccessTools.Method(targetType, TargetMethodName, [requestType]); [HarmonyPrefix] static void Prefix(ref object request) { PropertyInfo uriProperty = AccessTools.Property(requestType, "Uri"); if (uriProperty == null) { Plugin.Log.LogFatal("BestHTTP_Unob failed: uriProperty was null."); return; } var uriInstance = (Il2CppSystem.Uri)uriProperty.GetValue(request, null); if (uriInstance == null) { Plugin.Log.LogFatal("BestHTTP_Unob failed: uriInstance was null."); return; } if (GenericConfig.LogAllRequests.Value) Plugin.Log.LogInfo($"BestHTTP_Unob request b-URL: {uriInstance.ToString()}"); if (!NameserverConfig.Rewrite.Value) return; Il2CppSystem.Uri newUri = new(uriInstance.ToString()); // Request changes below if (newUri.ToString().Contains("ns.rec.net")) newUri = new Il2CppSystem.Uri(NameserverConfig.NewUrl.Value); if (GalvanicConfig.Enabled.Value) { string[] applyHeader = [ "/cachedlogin/forplatformid", "/account/create", "/connect/token" ]; foreach (string header in applyHeader) { if (newUri.PathAndQuery.Contains(header)) { // refresh the token if it expired // this is somewhat inefficient, but we don't hook into many requests (see above) so it should be fine GalvanicWebAuth.TokenExpiry(); Type httpRequestType = request.GetType(); MethodInfo addHeaderMethod = httpRequestType.GetMethod("AddHeader"); addHeaderMethod.Invoke(request, ["GalvanicAuth", GalvanicWebAuth.Token]); break; } } } if (GenericConfig.LogAllRequests.Value) Plugin.Log.LogInfo($"BestHTTP_Unob request a-URL: {newUri.ToString()}"); uriProperty.SetValue(request, NameserverConfig.Rewrite.Value ? newUri : uriInstance, null); } } }