Fix page-boundary read issue in redirection helper

Risk mitigation:
- redirect now falls back to reading the minimum required bytes (detourLength) if the full buffer (detourLength + 16) cannot be read due to page boundaries.
- First attempt: read detourLength + 16 bytes for the instruction analyzer (preferred).
- Second attempt: read only detourLength bytes if the first attempt fails (bare minimum).
- Throw only if both attempts fail.

This prevents crashes when function interception functions that sit at the very end of a committed page.

Tests: 199 passing, 4 integration/interactive skipped.
This commit is contained in:
kbe
2026-07-22 01:29:52 +02:00
parent c40f3fd791
commit 64be4f8275
+9 -2
View File
@@ -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);