119 lines
4.0 KiB
C#
119 lines
4.0 KiB
C#
|
|
using HarmonyLib;
|
||
|
|
using AsmodeeNet.Network;
|
||
|
|
using AsmodeeNet.Network.ScalableServer;
|
||
|
|
using com.daysofwonder.mm;
|
||
|
|
using Google.Protobuf;
|
||
|
|
using System;
|
||
|
|
|
||
|
|
namespace CustomServerMod
|
||
|
|
{
|
||
|
|
[HarmonyPatch]
|
||
|
|
public static class NetworkPatches
|
||
|
|
{
|
||
|
|
// 1. Redirect REST API
|
||
|
|
[HarmonyPatch(typeof(NetworkParameters), "RestAPIBaseUrl")]
|
||
|
|
[HarmonyPostfix]
|
||
|
|
public static void RestAPIBaseUrl_Postfix(ref string __result)
|
||
|
|
{
|
||
|
|
CustomServerMod.Log.LogInfo($"[ORIGINAL] HTTP BaseURL request: {__result}");
|
||
|
|
|
||
|
|
if (CustomServerMod.RedirectTraffic)
|
||
|
|
{
|
||
|
|
__result = "http://127.0.0.1:8080";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 2. Redirect Scalable Server (TCP)
|
||
|
|
[HarmonyPatch(typeof(ServerConnection), "Connect")]
|
||
|
|
[HarmonyPrefix]
|
||
|
|
public static void Connect_Prefix(ServerConnection __instance)
|
||
|
|
{
|
||
|
|
if (__instance.NetworkParameters != null)
|
||
|
|
{
|
||
|
|
CustomServerMod.Log.LogInfo($"[ORIGINAL] TCP Target: {__instance.NetworkParameters.HostName}:{__instance.NetworkParameters.HostPort}");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (CustomServerMod.RedirectTraffic && __instance.NetworkParameters != null)
|
||
|
|
{
|
||
|
|
__instance.NetworkParameters.HostName = "127.0.0.1";
|
||
|
|
__instance.NetworkParameters.HostPort = 3000;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 3. Bypass SSL/Certificate Pinning
|
||
|
|
[HarmonyPatch(typeof(CertificateVerifier), "ValidateCertificate")]
|
||
|
|
[HarmonyPrefix]
|
||
|
|
public static bool ValidateCertificate_Prefix(ref bool __result)
|
||
|
|
{
|
||
|
|
if (CustomServerMod.RedirectTraffic)
|
||
|
|
{
|
||
|
|
__result = true;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
[HarmonyPatch(typeof(CertificateVerifier), "isValid", MethodType.Getter)]
|
||
|
|
[HarmonyPostfix]
|
||
|
|
public static void IsValid_Postfix(ref bool __result)
|
||
|
|
{
|
||
|
|
if (CustomServerMod.RedirectTraffic)
|
||
|
|
{
|
||
|
|
__result = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
[HarmonyPatch(typeof(ServerConnection), "ValidateRemoteCertificate")]
|
||
|
|
[HarmonyPrefix]
|
||
|
|
public static bool ValidateRemoteCertificate_Prefix(ref bool __result)
|
||
|
|
{
|
||
|
|
if (CustomServerMod.RedirectTraffic)
|
||
|
|
{
|
||
|
|
__result = true;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 4. Packet Logger (Incoming)
|
||
|
|
[HarmonyPatch(typeof(ServerConnection), "DispatchMessage")]
|
||
|
|
[HarmonyPrefix]
|
||
|
|
public static void DispatchMessage_Prefix(Message receivedMessage, long packetId)
|
||
|
|
{
|
||
|
|
if (CustomServerMod.LogPackets)
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
// Use simple ToString or JsonFormatter
|
||
|
|
string json = receivedMessage.ToString();
|
||
|
|
CustomServerMod.Log.LogInfo($"[IN] Packet {packetId} (Type: {receivedMessage.RequestCase}): {json}");
|
||
|
|
}
|
||
|
|
catch (Exception e)
|
||
|
|
{
|
||
|
|
CustomServerMod.Log.LogWarning($"Failed to log incoming packet {packetId}: {e.Message}");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 5. Packet Logger (Outgoing)
|
||
|
|
// Hook EnqueuePacketToBeSentToServer to capture outgoing messages before they are serialized
|
||
|
|
[HarmonyPatch(typeof(ServerConnection), "EnqueuePacketToBeSentToServer")]
|
||
|
|
[HarmonyPostfix]
|
||
|
|
public static void EnqueuePacketToBeSentToServer_Postfix(Packet packet)
|
||
|
|
{
|
||
|
|
if (CustomServerMod.LogPackets && packet?.Payload != null)
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
string json = packet.Payload.ToString();
|
||
|
|
CustomServerMod.Log.LogInfo($"[OUT] Packet {packet.Id} (Type: {packet.Payload.RequestCase}): {json}");
|
||
|
|
}
|
||
|
|
catch (Exception e)
|
||
|
|
{
|
||
|
|
CustomServerMod.Log.LogWarning($"Failed to log outgoing packet: {e.Message}");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|