Added ptrguard to be used whenever ptrs are being used.

This commit is contained in:
cake
2026-01-20 00:24:42 +01:00
parent 367af2c3d0
commit cff866dcc2
4 changed files with 183 additions and 106 deletions

View File

@@ -127,79 +127,23 @@ public class PlayerDataFactory
{
nint basePtr = playerPointer;
if (!LooksLikeUserPtr(basePtr))
if (!PtrGuard.LooksLikePtr(basePtr))
return true;
nint drawObjAddr = basePtr + _drawObjectOffset;
if (!TryReadIntPtr(drawObjAddr, out var drawObj))
if (!PtrGuard.IsReadable(drawObjAddr, (nuint)IntPtr.Size))
return true;
if (!PtrGuard.TryReadIntPtr(drawObjAddr, out var drawObj))
return true;
if (drawObj != 0 && !PtrGuard.LooksLikePtr(drawObj))
return true;
return drawObj == 0;
}).ConfigureAwait(false);
private static bool LooksLikeUserPtr(nint p)
{
if (p == 0) return false;
ulong u = (ulong)p;
if (u < 0x0000_0001_0000UL) return false;
if (u > 0x0000_7FFF_FFFF_FFFFUL) return false;
if ((u & 0x7UL) != 0) return false;
return true;
}
private static bool TryReadIntPtr(nint addr, out nint value)
{
value = 0;
if (!VirtualReadable(addr))
return false;
try
{
value = Marshal.ReadIntPtr(addr);
return true;
}
catch
{
return false;
}
}
private static bool VirtualReadable(nint addr)
{
if (VirtualQuery(addr, out var mbi, (nuint)Marshal.SizeOf<MEMORY_BASIC_INFORMATION>()) == 0)
return false;
const uint MEM_COMMIT = 0x1000;
const uint PAGE_NOACCESS = 0x01;
const uint PAGE_GUARD = 0x100;
if (mbi.State != MEM_COMMIT) return false;
if ((mbi.Protect & PAGE_GUARD) != 0) return false;
if (mbi.Protect == PAGE_NOACCESS) return false;
return true;
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern nuint VirtualQuery(nint lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, nuint dwLength);
[StructLayout(LayoutKind.Sequential)]
private struct MEMORY_BASIC_INFORMATION
{
public nint BaseAddress;
public nint AllocationBase;
public uint AllocationProtect;
public nuint RegionSize;
public uint State;
public uint Protect;
public uint Type;
}
private static bool IsCacheFresh(CacheEntry entry)
=> (DateTime.UtcNow - entry.CreatedUtc) <= _characterCacheTtl;