From 7bab5ddceb3361346c7fcbf613558c811ac9d05b Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sun, 1 Jan 2023 23:02:54 +0100 Subject: [PATCH] feat(binding): use asm hooking for network --- .../Objects/NetworkBinding.cs | 84 +++++++++---------- .../SimplePiiBot/Commands/EntityCommands.cs} | 0 2 files changed, 38 insertions(+), 46 deletions(-) rename src/Samples/{LowLevel/WalkCommands/Commands/CombatCommands.cs => HighLevel/SimplePiiBot/Commands/EntityCommands.cs} (100%) diff --git a/src/Core/NosSmooth.LocalBinding/Objects/NetworkBinding.cs b/src/Core/NosSmooth.LocalBinding/Objects/NetworkBinding.cs index ea573ea..cd1ab3a 100644 --- a/src/Core/NosSmooth.LocalBinding/Objects/NetworkBinding.cs +++ b/src/Core/NosSmooth.LocalBinding/Objects/NetworkBinding.cs @@ -4,6 +4,7 @@ // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using System.Collections.Concurrent; using System.Diagnostics; using System.Runtime.InteropServices; using NosSmooth.LocalBinding.Errors; @@ -27,7 +28,7 @@ public class NetworkBinding FunctionAttribute.StackCleanup.Callee, new[] { FunctionAttribute.Register.ebx, FunctionAttribute.Register.esi, FunctionAttribute.Register.edi, FunctionAttribute.Register.ebp } )] - private delegate void PacketSendDelegate(nuint packetObject, nuint packetString); + private delegate nuint PacketSendDelegate(nuint packetObject, nuint packetString); [Function ( @@ -36,7 +37,7 @@ public class NetworkBinding FunctionAttribute.StackCleanup.Callee, new[] { FunctionAttribute.Register.ebx, FunctionAttribute.Register.esi, FunctionAttribute.Register.edi, FunctionAttribute.Register.ebp } )] - private delegate void PacketReceiveDelegate(nuint packetObject, nuint packetString); + private delegate nuint PacketReceiveDelegate(nuint packetObject, nuint packetString); /// /// Create the network binding with finding the network object and functions. @@ -59,14 +60,14 @@ public class NetworkBinding (nuint)(networkObjectAddress.Offset + (int)process.MainModule!.BaseAddress + 0x01) ); - var sendHookResult = bindingManager.CreateHookFromPattern + var sendHookResult = bindingManager.CreateCustomAsmHookFromPattern ("NetworkBinding.SendPacket", binding.SendPacketDetour, options.PacketSendHook); if (!sendHookResult.IsDefined(out var sendHook)) { return Result.FromError(sendHookResult); } - var receiveHookResult = bindingManager.CreateHookFromPattern + var receiveHookResult = bindingManager.CreateCustomAsmHookFromPattern ("NetworkBinding.ReceivePacket", binding.ReceivePacketDetour, options.PacketReceiveHook); if (!receiveHookResult.IsDefined(out var receiveHook)) { @@ -80,8 +81,10 @@ public class NetworkBinding private readonly NosBindingManager _bindingManager; private readonly nuint _networkManagerAddress; - private IHook _sendHook = null!; - private IHook _receiveHook = null!; + private NosAsmHook _sendHook = null!; + private NosAsmHook _receiveHook = null!; + private bool _callingReceive; + private bool _callingSend; private NetworkBinding ( @@ -118,8 +121,10 @@ public class NetworkBinding { try { + _callingSend = true; using var nostaleString = NostaleStringA.Create(_bindingManager.Memory, packet); - _sendHook.OriginalFunction(GetManagerAddress(false), nostaleString.Get()); + _sendHook.OriginalFunction.GetWrapper()(GetManagerAddress(false), nostaleString.Get()); + _callingSend = false; } catch (Exception e) { @@ -138,8 +143,10 @@ public class NetworkBinding { try { + _callingReceive = true; using var nostaleString = NostaleStringA.Create(_bindingManager.Memory, packet); - _receiveHook.OriginalFunction(GetManagerAddress(true), nostaleString.Get()); + _receiveHook.OriginalFunction.GetWrapper()(GetManagerAddress(true), nostaleString.Get()); + _callingReceive = false; } catch (Exception e) { @@ -154,8 +161,8 @@ public class NetworkBinding /// public void EnableHooks() { - _receiveHook.EnableOrActivate(); - _sendHook.EnableOrActivate(); + _receiveHook.Hook.EnableOrActivate(); + _sendHook.Hook.EnableOrActivate(); } /// @@ -163,8 +170,8 @@ public class NetworkBinding /// public void DisableHooks() { - _receiveHook.Disable(); - _sendHook.Disable(); + _receiveHook.Hook.Disable(); + _sendHook.Hook.Disable(); } private nuint GetManagerAddress(bool third) @@ -182,51 +189,36 @@ public class NetworkBinding return networkManager; } - private void SendPacketDetour(nuint packetObject, nuint packetString) + private nuint SendPacketDetour(nuint packetObject, nuint packetString) { + if (_callingSend) + { + return 1; + } + var packet = Marshal.PtrToStringAnsi((IntPtr)packetString); if (packet is null) { // ? - _sendHook.OriginalFunction(packetObject, packetString); - } - else - { - var result = PacketSend?.Invoke(packet); - if (result ?? true) - { - _sendHook.OriginalFunction(packetObject, packetString); - } + return 1; } + var result = PacketSend?.Invoke(packet); + return result ?? true ? (nuint)1 : 0; } - private bool _receivedCancel = false; - - private void ReceivePacketDetour(nuint packetObject, nuint packetString) + private nuint ReceivePacketDetour(nuint packetObject, nuint packetString) { + if (_callingReceive) + { + return 1; + } + var packet = Marshal.PtrToStringAnsi((IntPtr)packetString); if (packet is null) { // ? - _receiveHook.OriginalFunction(packetObject, packetString); - } - else - { - var result = PacketReceive?.Invoke(packet); - if (result ?? true) - { - // This is a TEMPORARY fix, I don't know why, - // but upon logging in (for OpenNos servers) - // there is an exception when receiving packet - // cancel. - // TODO FIX THIS correctly - if (_receivedCancel || !packet.StartsWith("cancel")) - { - _receiveHook.OriginalFunction(packetObject, packetString); - } - else - { - _receivedCancel = true; - } - } + return 1; } + + var result = PacketReceive?.Invoke(packet); + return result ?? true ? (nuint)1 : 0; } } \ No newline at end of file diff --git a/src/Samples/LowLevel/WalkCommands/Commands/CombatCommands.cs b/src/Samples/HighLevel/SimplePiiBot/Commands/EntityCommands.cs similarity index 100% rename from src/Samples/LowLevel/WalkCommands/Commands/CombatCommands.cs rename to src/Samples/HighLevel/SimplePiiBot/Commands/EntityCommands.cs -- 2.49.0