diff --git a/Dalamud/Game/Network/GameNetworkAddressResolver.cs b/Dalamud/Game/Network/GameNetworkAddressResolver.cs index fc95bae52..69b97c59d 100644 --- a/Dalamud/Game/Network/GameNetworkAddressResolver.cs +++ b/Dalamud/Game/Network/GameNetworkAddressResolver.cs @@ -21,6 +21,6 @@ internal sealed class GameNetworkAddressResolver : BaseAddressResolver // ProcessZonePacket = sig.ScanText("48 89 74 24 18 57 48 83 EC 50 8B F2 49 8B F8 41 0F B7 50 02 8B CE E8 ?? ?? 7A FF 0F B7 57 02 8D 42 89 3D 5F 02 00 00 0F 87 60 01 00 00 4C 8D 05"); // ProcessZonePacket = sig.ScanText("48 89 74 24 18 57 48 83 EC 50 8B F2 49 8B F8 41 0F B7 50 02 8B CE E8 ?? ?? 73 FF 0F B7 57 02 8D 42 ?? 3D ?? ?? 00 00 0F 87 60 01 00 00 4C 8D 05"); this.ProcessZonePacketDown = sig.ScanText("40 53 56 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 ?? 8B F2"); - this.ProcessZonePacketUp = sig.ScanText("E8 ?? ?? ?? ?? 48 83 C4 28 C3 32 C0 48 83 C4 28 C3 CC"); + this.ProcessZonePacketUp = sig.ScanText("48 89 5C 24 ?? 48 89 74 24 ?? 4C 89 64 24 ?? 55 41 56 41 57 48 8B EC 48 83 EC 70"); } } diff --git a/Dalamud/Game/SigScanner.cs b/Dalamud/Game/SigScanner.cs index 92c230f54..3422848f3 100644 --- a/Dalamud/Game/SigScanner.cs +++ b/Dalamud/Game/SigScanner.cs @@ -276,8 +276,7 @@ public class SigScanner : IDisposable, ISigScanner } } - var mBase = this.IsCopy ? this.moduleCopyPtr : this.TextSectionBase; - var scanRet = Scan(mBase, this.TextSectionSize, signature); + var scanRet = Scan(this.TextSectionBase, this.TextSectionSize, signature); if (this.IsCopy) scanRet = new IntPtr(scanRet.ToInt64() - this.moduleCopyOffset); @@ -285,7 +284,15 @@ public class SigScanner : IDisposable, ISigScanner var insnByte = Marshal.ReadByte(scanRet); if (insnByte == 0xE8 || insnByte == 0xE9) + { scanRet = ReadJmpCallSig(scanRet); + var rel = scanRet - this.Module.BaseAddress; + if (rel < 0 || rel >= this.TextSectionSize) + { + throw new KeyNotFoundException( + $"Signature \"{signature}\" resolved to 0x{rel:X} which is outside .text section. Possible signature conflicts?"); + } + } // If this is below the module, there's bound to be a problem with the sig/resolution... Let's not save it // TODO: THIS IS A HACK! FIX THE ROOT CAUSE! @@ -319,8 +326,9 @@ public class SigScanner : IDisposable, ISigScanner public IEnumerable ScanAllText(string signature, CancellationToken cancellationToken) { var (needle, mask, badShift) = ParseSignature(signature); - var mBase = this.IsCopy ? this.moduleCopyPtr : this.TextSectionBase; - while (mBase < this.TextSectionBase + this.TextSectionSize) + var mBase = this.TextSectionBase; + var mTo = this.TextSectionBase + this.TextSectionSize; + while (mBase < mTo) { cancellationToken.ThrowIfCancellationRequested();