Added ptrguard to be used whenever ptrs are being used.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user