diff --git a/WhiteMagic/Hooking/Detour.cs b/WhiteMagic/Hooking/Detour.cs index b779ef0..541ef41 100644 --- a/WhiteMagic/Hooking/Detour.cs +++ b/WhiteMagic/Hooking/Detour.cs @@ -66,11 +66,18 @@ public sealed class Detour : IDisposable int pointerSize = _memory.Is64Bit ? 8 : 4; int detourLength = pointerSize == 8 ? 14 : 5; + // Try to read detourLength + 16 bytes for the prologue decoder. + // If the target is near a page boundary, this might fail, so fall back to the minimum. byte[] prologue = _memory.ReadBytes(Target, detourLength + 16); if (prologue.Length < detourLength) { - throw new InvalidOperationException( - "Could not read enough bytes from the target function to install a detour."); + // Second attempt: read only the minimum required bytes + prologue = _memory.ReadBytes(Target, detourLength); + if (prologue.Length < detourLength) + { + throw new InvalidOperationException( + "Could not read enough bytes from the target function to install a detour."); + } } int preserveLength = PrologueDecoder.GetWholeInstructionLength(prologue, detourLength, _memory.Is64Bit);