Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд Как поставить раком gameguard, eac и прочую хуйню. скелет для вашей uefi дешевки. занимаюсь благотворительностью

вот так прокидывается мост между физикой и виртуалом / разбиваем адреса на индексы через смещения pml4, pdpt и пр. мне не важно что вы меня не понимаете. шагаем по цепочке: Суть в том, что каждый уровень таблицы дает нам адрес следующей таблицы pd pt переключите с силы на ловкость обязательно и не забудьте KIRQL, а то винда в синьку упадет при маппинге. Учимся юзать прямой доступ к физ. памяти как дма карты только софтово епта. античит сосет, потому что мы не дергаем функции планировщика епта и нас нет в очередях доступа епта. Условно, мы уже во Владивостоке, когда разрабы гейгварда еще только приценяются на биленты еп.


Главные воппрос "Почему это заебись?":
-MmMapioSPace: мы юзаем как "очки", дабы посмотреть в физическую память, не создавая новых виртуальных маппингов в таблице процесса.
-NO API: нет ни одного вызова тупого гейсского PsGetWhatever. Мы пррсто тупо идем по хлебным крошкам, которые оставил процессор в оперативе.
-stealth: Если eac or gg не чекают MmMapIoSpace (а они её не хукают, это опасности для стабильности их назалупника та и системы в общем), то наше чтение проходит п==словно "под радаром". Кароче от хуя до CR3 и езще до конкретного байта в физике.
yougamebizservice:
Expand Collapse Copy
// константы для масок (x64)
#define PMASK 0xFFFFFFFFFF000
#define PTE_PRESENT 0x1

// ункция захода в физику и ручного разбора (real talk)
PVOID GetPhysAddr(PVOID VirtualAddress, ULONG_PTR DirectoryTableBase) {
    // 1. берем CR3 процесса (DirectoryTableBase)
    ULONG_PTR physAddr = DirectoryTableBase;

    // 2. PML4
    ULONG_PTR pml4e_addr = physAddr + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pml4e = 0;
    // мапим 8 байт, дабы прочитать запись в таблице
    PVOID pPml4e = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pml4e_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPml4e) return nullptr;
    pml4e = *(ULONG_PTR*)pPml4e;
    MmUnmapIoSpace(pPml4e, sizeof(ULONG_PTR));
    if (!(pml4e & PTE_PRESENT)) return nullptr;

    // 3. PDPT
    ULONG_PTR pdpte_addr = (pml4e & PMASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pdpte = 0;
    PVOID pPdpte = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pdpte_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPdpte) return nullptr;
    pdpte = *(ULONG_PTR*)pPdpte;
    MmUnmapIoSpace(pPdpte, sizeof(ULONG_PTR));
    if (!(pdpte & PTE_PRESENT)) return nullptr;

    // 4. PD (пэйж директори ептаЗ
    ULONG_PTR pde_addr = (pdpte & PMASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pde = 0;
    PVOID pPde = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pde_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPde) return nullptr;
    pde = *(ULONG_PTR*)pPde;
    MmUnmapIoSpace(pPde, sizeof(ULONG_PTR));
    if (!(pde & PTE_PRESENT)) return nullptr;

    // 5. PTE (пэйж тэйбл энтри)
    ULONG_PTR pte_addr = (pde & PMASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pte = 0;
    PVOID pPte = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pte_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPte) return nullptr;
    pte = *(ULONG_PTR*)pPte;
    MmUnmapIoSpace(pPte, sizeof(ULONG_PTR));
    if (!(pte & PTE_PRESENT)) return nullptr;

    // 6. иитоговый физический адрес = адрес из PTE + смещение внутри страницы (12 бит епта)
    ULONG_PTR finalPhys = (pte & PMASK) + ((ULONG_PTR)VirtualAddress & 0xFFF);
    return (PVOID)finalPhys;
   // кто напиздит лишнее про колонны идет нахуй смелно
}
а еще кстати для тех кто покупает дма для фейсит за деньги что стоят больше чем моя дизнь. у меня для вас плохие новости. вы долбаебы ебучие форумские все тут беззубые и безумные
P.S бля, ладно чуваки. Берегите винду.
main cpp:
Expand Collapse Copy
#include <ntddk.h>

// Маска для извлечения физического адреса из записей таблиц (4Кб страницы)
#define PAGE_MASK 0x0000FFFFFFFFF000ull
#define PAGE_PRESENT 0x1
#define PAGE_LARGE 0x80 // Бит PS (Page Size)

PVOID GetPhysicalAddressSafe(PVOID VirtualAddress, ULONG_PTR Cr3) {
    if (!VirtualAddress || !Cr3) return nullptr;

    PHYSICAL_ADDRESS addr;
    ULONG_PTR pml4e = 0, pdpte = 0, pde = 0, pte = 0;
    PVOID mapped = nullptr;

    __try {
        // --- 1. PML4 ---
        addr.QuadPart = Cr3 + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pml4e = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pml4e & PAGE_PRESENT)) return nullptr;

        // --- 2. PDPT ---
        addr.QuadPart = (pml4e & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pdpte = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pdpte & PAGE_PRESENT)) return nullptr;
        // Проверка на 1GB страницу
        if (pdpte & PAGE_LARGE) {
            return (PVOID)((pdpte & 0xFFFFFC0000000ull) + ((ULONG_PTR)VirtualAddress & 0x3FFFFFFF));
        }

        // --- 3. PD ---
        addr.QuadPart = (pdpte & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pde = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pde & PAGE_PRESENT)) return nullptr;
        // Проверка на 2MB страницу (Очень часто в играх/больших массивах)
        if (pde & PAGE_LARGE) {
            return (PVOID)((pde & 0xFFFFFFFE00000ull) + ((ULONG_PTR)VirtualAddress & 0x1FFFFF));
        }

        // --- 4. PTE ---
        addr.QuadPart = (pde & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pte = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pte & PAGE_PRESENT)) return nullptr;

        // Финальный адрес
        return (PVOID)((pte & PAGE_MASK) + ((ULONG_PTR)VirtualAddress & 0xFFF));
    }
    __except (EXCEPTION_EXECUTE_HANDLER) {
        if (mapped) MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        return nullptr;
    }
}
P.S.S первый код более рофл (пусть останется, там есть некоторые детали. Но риск BSOD для безумных - огромен.). Я не планировал изначально делать вообще такой гайд, которым он вышел по итогу. но первый код воркает (у тех кто с головой дружит разумеется) и читает постранично по 8кб дрочитесь кароче и на amd можете хуйца всосать (во втором случае пашет на amd как надо). Денег пока, не надо. спасибо за внимание. Тг в конце кода закоментил, если вопросы будут и я оффлайн здесь лол
 
Последнее редактирование:
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
28 Апр 2026
Сообщения
14
Реакции
0
вот так прокидывается мост между физикой и виртуалом / разбиваем адреса на индексы через смещения pml4, pdpt и пр. мне не важно что вы меня не понимаете. шагаем по цепочке: Суть в том, что каждый уровень таблицы дает нам адрес следующей таблицы pd pt переключите с силы на ловкость обязательно и не забудьте KIRQL, а то винда в синьку упадет при маппинге. Учимся юзать прямой доступ к физ. памяти как дма карты только софтово епта. античит сосет, потому что мы не дергаем функции планировщика епта и нас нет в очередях доступа епта. Условно, мы уже во Владивостоке, когда разрабы гейгварда еще только приценяются на биленты еп.


Главные воппрос "Почему это заебись?":
-MmMapioSPace: мы юзаем как "очки", дабы посмотреть в физическую память, не создавая новых виртуальных маппингов в таблице процесса.
-NO API: нет ни одного вызова тупого гейсского PsGetWhatever. Мы пррсто тупо идем по хлебным крошкам, которые оставил процессор в оперативе.
-stealth: Если eac or gg не чекают MmMapIoSpace (а они её не хукают, это опасности для стабильности их назалупника та и системы в общем), то наше чтение проходит п==словно "под радаром". Кароче от хуя до CR3 и езще до конкретного байта в физике.
yougamebizservice:
Expand Collapse Copy
// константы для масок (x64)
#define PMASK 0xFFFFFFFFFF000
#define PTE_PRESENT 0x1

// ункция захода в физику и ручного разбора (real talk)
PVOID GetPhysAddr(PVOID VirtualAddress, ULONG_PTR DirectoryTableBase) {
    // 1. берем CR3 процесса (DirectoryTableBase)
    ULONG_PTR physAddr = DirectoryTableBase;

    // tg @maxdosing для связи)

    // 2. PML4
    ULONG_PTR pml4e_addr = physAddr + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pml4e = 0;
    // мапим 8 байт, дабы прочитать запись в таблице
    PVOID pPml4e = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pml4e_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPml4e) return nullptr;
    pml4e = *(ULONG_PTR*)pPml4e;
    MmUnmapIoSpace(pPml4e, sizeof(ULONG_PTR));
    if (!(pml4e & PTE_PRESENT)) return nullptr;

    // 3. PDPT
    ULONG_PTR pdpte_addr = (pml4e & PMASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pdpte = 0;
    PVOID pPdpte = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pdpte_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPdpte) return nullptr;
    pdpte = *(ULONG_PTR*)pPdpte;
    MmUnmapIoSpace(pPdpte, sizeof(ULONG_PTR));
    if (!(pdpte & PTE_PRESENT)) return nullptr;

    // 4. PD (пэйж директори ептаЗ
    ULONG_PTR pde_addr = (pdpte & PMASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pde = 0;
    PVOID pPde = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pde_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPde) return nullptr;
    pde = *(ULONG_PTR*)pPde;
    MmUnmapIoSpace(pPde, sizeof(ULONG_PTR));
    if (!(pde & PTE_PRESENT)) return nullptr;

    // 5. PTE (пэйж тэйбл энтри)
    ULONG_PTR pte_addr = (pde & PMASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pte = 0;
    PVOID pPte = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pte_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPte) return nullptr;
    pte = *(ULONG_PTR*)pPte;
    MmUnmapIoSpace(pPte, sizeof(ULONG_PTR));
    if (!(pte & PTE_PRESENT)) return nullptr;

    // 6. иитоговый физический адрес = адрес из PTE + смещение внутри страницы (12 бит епта)
    ULONG_PTR finalPhys = (pte & PMASK) + ((ULONG_PTR)VirtualAddress & 0xFFF);
    return (PVOID)finalPhys;
   // кто напиздит лишнее про колонны идет нахуй смелно
}
а еще кстати для тех кто покупает дма для фейсит за деньги что стоят больше чем моя дизнь. у меня для вас плохие новости. вы долбаебы ебучие форумские все тут беззубые и безумные
P.S бля, ладно чуваки. Берегите винду :3
main cpp:
Expand Collapse Copy
#include <ntddk.h>

// --- константы и маски ---
#define PAGE_SIZE           0x1000
#define PAGE_MASK           0x0000FFFFFFFFF000ull
#define PAGE_OFFSET_MASK    0xFFFull
#define PAGE_PRESENT        0x1
#define PAGE_LARGE          0x80 // PS бит: 2мб или 1гб страницы

// Структура для удержания "окна" маппинга
struct MemoryWindow {
    PVOID MappedVa;
    ULONG_PTR BasePhys;
    ULONG Size;   
};

// --- ФУНКЦИЯ 1: Перевод Виртуалки в Физику ---
PVOID GetPhysicalAddressSafe(PVOID VirtualAddress, ULONG_PTR Cr3) {
    if (!VirtualAddress || !Cr3) return nullptr;
    PHYSICAL_ADDRESS addr;
    ULONG_PTR pml4e = 0, pdpte = 0, pde = 0, pte = 0;
    PVOID mapped = nullptr;

    __try {
        // 1. PML4
        addr.QuadPart = Cr3 + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pml4e = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pml4e & PAGE_PRESENT)) return nullptr;

        // 2. PDPT
        addr.QuadPart = (pml4e & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pdpte = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pdpte & PAGE_PRESENT)) return nullptr;
        if (pdpte & PAGE_LARGE)
            return (PVOID)((pdpte & 0xFFFFFC0000000ull) + ((ULONG_PTR)VirtualAddress & 0x3FFFFFFF));

        // 3. PD
        addr.QuadPart = (pdpte & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pde = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pde & PAGE_PRESENT)) return nullptr;
        if (pde & PAGE_LARGE)
            return (PVOID)((pde & 0xFFFFFFFE00000ull) + ((ULONG_PTR)VirtualAddress & 0x1FFFFF));

        // 4. PTE
        addr.QuadPart = (pde & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pte = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pte & PAGE_PRESENT)) return nullptr;

        return (PVOID)((pte & PAGE_MASK) + ((ULONG_PTR)VirtualAddress & PAGE_OFFSET_MASK));
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        return nullptr;
    }
}

// --- ФУНКЦИЯ 2: Умный Маппинг Блока (Окно) ---
PVOID MapBlock(ULONG_PTR PhysicalAddress, ULONG Size, MemoryWindow* Window) {
    if (Window->MappedVa && PhysicalAddress >= Window->BasePhys &&
        (PhysicalAddress + Size) <= (Window->BasePhys + Window->Size)) {
        return (PVOID)((ULONG_PTR)Window->MappedVa + (PhysicalAddress - Window->BasePhys));
    }

    if (Window->MappedVa) {
        MmUnmapIoSpace(Window->MappedVa, Window->Size);
        Window->MappedVa = nullptr;
    }

    ULONG_PTR alignedStart = PhysicalAddress & PAGE_MASK;
    ULONG_PTR offset = PhysicalAddress - alignedStart;
    ULONG mappedSize = (Size + (ULONG)offset + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);

    PHYSICAL_ADDRESS pa;
    pa.QuadPart = alignedStart;
    Window->MappedVa = MmMapIoSpace(pa, mappedSize, MmCached);
 
    if (!Window->MappedVa) return nullptr;

    Window->BasePhys = alignedStart;
    Window->Size = mappedSize;
    return (PVOID)((ULONG_PTR)Window->MappedVa + offset);
}

// --- ФУНКЦИЯ 3: ТО САМОЕ СКОРОСТНОЕ ЧТЕНИЕ ---
// это вызывайте в своем основном цикле (например, в обработчике IOCTL)
bool ReadMemoryFinal(ULONG_PTR TargetVirtual, ULONG_PTR Cr3, PVOID Buffer, SIZE_T Size) {
    static MemoryWindow win = { 0 }; // кеширует маппинг в памяти ядра

    PVOID physAddr = GetPhysicalAddressSafe((PVOID)TargetVirtual, Cr3);
    if (!physAddr) return false;

    // в кач-ве размера для MapBlock можно передать Size,
    // но если читать буш много мелкого, лучше забить окно покрупнее
    PVOID accessPtr = MapBlock((ULONG_PTR)physAddr, (ULONG)Size, &win);
    if (!accessPtr) return false;

    __try {
        RtlCopyMemory(Buffer, accessPtr, Size);
        return true;
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        return false;
    // tg @maxdosing для связи)
    }
}


ПРИМЕР использования СКЕЛЕТА в ВАШЕМ драйвере ниже.


driver:
Expand Collapse Copy
// 1. Тут находим процесс игры по PID (делаешь это один раз при запуске)
PEPROCESS TargetProcess = NULL;
if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)1234, &TargetProcess))) {
 
    // 2. Вытаскиваем CR3 через смещение (хз насчет Windows 11, четко ли будет)
    ULONG_PTR cr3 = *(PULONG_PTR)((PUCHAR)TargetProcess + 0x28);

    // 3. ЧИТАЕМ!
    BYTE buffer[16];
    ULONG_PTR targetAddress = 0x7FF712345678; // адрес внутри игры

    if (ReadMemoryFinal(targetAddress, cr3, buffer, sizeof(buffer))) {
        DbgPrint("Освобожденные байты: %02X %02X %02X %02X...\n", buffer[0], buffer[1], buffer[2], buffer[3]);
    } else {
        DbgPrint("Вы пососали хуй.\n"); // это если все по пизде пошло лично у ВАС
    }

    // Не забывайте уменьшать счетчик ссылок, чтобы система не лагала. Опять же, если будет лагать лично у вас.
    ObDereferenceObject(TargetProcess);
    // tg @maxdosing для связи то))
}

А ниже представлен чуть модифицированный код от gpt 5.2 и новой gemini. Я не тестил, но больно уж они убедительно со мной общались и уверяли что эти правки не дадут никакого шанса GameGuard ac задектить код.
Держите в курсе, что во всех фрагментах кода что я выложил сюда, не используются встроенные инструменты. Мы маппим сами, своими силами - через таблицу. Этот код от нейросеток полагаю что будет работать на Windows 11 (самой новой сборки 23Н2). В основном, из за изменений в смещении - ULONG_PTR Cr3 = *(PULONG_PTR)((PUCHAR)TargetProcess + <span>0x280</span>); <span>// 23H2</span>

Я почитал этот код и могу сглаголить имхо.
1. Отказ от RtlCopyMemory - это стандарт функция, на которую сегодняшние античиты любят вешать свои хуки или просто мониторить ее вызовы. Так что замена на ручной цикл for (dst = src ). Делает операцию своего образа "атомарной" для большинства системных инструментов анализатора. Могу кинуть плюс к невидимости в пользу AI. Можете юзать!
2. kdDisableDebugger() - это классика защиты. Если мы вырубаем системный дебагггер прямо в DriverEntry, то мы ослепляем многие инструменты AC, которые пытаются анализировать и поставить раком ваш драйвер снаружи. Неплохой фаерволл для НАЧАЛА. Можете применить с головой.

3. ВОТ ТУТ ВАЖНО, ГОСПОДА. Ключевой флаг где нас пытаются наебать это MmNonCashed. Нейронка хуйнула его во все поля..
Полагаю он думает, что если мы не кэшируем память, то GameGuard не увидит пиздеца в кеше процессора. Типа бля, мы читаем сразу из RAM, минуя кэш линии.. Поэтому этот метод можно слать нахуй с NonCashed. Вообще, на AMD и на современных intel это замедляет чтение в пару раз) Но это хуйня.. Потому что, самое главное это риск Conflict memory type (CMT). Если игра работает с этой памятью как с CASHED, А ОНА РАБОТАЕТ С НЕЙ, то ваш драйвер лезет туда как NonCashed и вы можете поймать Machine Check Exception (MCE) или просто нахуй битые данные из за тогоЮ, что кэш процессора не успел сброситься в RAM..

В общем 1,2 пункты заебись, а мою структуру с MmCashed оставьте как есть!

AI modify:
Expand Collapse Copy
#include <ntddk.h>

#define PAGE_SIZE 0x1000
#define PAGE_MASK 0x0000FFFFFFFFF000ull
#define PAGE_OFFSET_MASK 0xFFFull
#define PAGE_PRESENT 0x1
#define PAGE_LARGE 0x80

struct MemoryWindow {
    PVOID MappedVa;
    ULONG_PTR BasePhys;
    ULONG Size;
};

PVOID GetPhysicalAddressSafe(PVOID VirtualAddress, ULONG_PTR Cr3) {
    if (!VirtualAddress || !Cr3) return nullptr;

    PHYSICAL_ADDRESS addr;
    ULONG_PTR pml4e = 0, pdpte = 0, pde = 0, pte = 0;
    PVOID mapped = nullptr;

    // 1. PML4
    addr.QuadPart = Cr3 + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached); // ⚡️ НЕКЭШИРУЕМ
    if (!mapped) return nullptr;
    pml4e = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pml4e & PAGE_PRESENT)) return nullptr;

    // 2. PDPT
    addr.QuadPart = (pml4e & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached);
    if (!mapped) return nullptr;
    pdpte = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pdpte & PAGE_PRESENT)) return nullptr;
    if (pdpte & PAGE_LARGE) {
        return (PVOID)((pdpte & 0xFFFFFC0000000ull) + ((ULONG_PTR)VirtualAddress & 0x3FFFFFFF));
    }

    // 3. PD
    addr.QuadPart = (pdpte & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached);
    if (!mapped) return nullptr;
    pde = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pde & PAGE_PRESENT)) return nullptr;
    if (pde & PAGE_LARGE) {
        return (PVOID)((pde & 0xFFFFFFFE00000ull) + ((ULONG_PTR)VirtualAddress & 0x1FFFFF));
    }

    // 4. PTE
    addr.QuadPart = (pde & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached);
    if (!mapped) return nullptr;
    pte = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pte & PAGE_PRESENT)) return nullptr;

    return (PVOID)((pte & PAGE_MASK) + ((ULONG_PTR)VirtualAddress & PAGE_OFFSET_MASK));
}

PVOID MapBlock(ULONG_PTR PhysicalAddress, ULONG Size, MemoryWindow* Window) {
    if (Window->MappedVa && PhysicalAddress >= Window->BasePhys && (PhysicalAddress + Size) <= (Window->BasePhys + Window->Size)) {
        return (PVOID)((ULONG_PTR)Window->MappedVa + (PhysicalAddress - Window->BasePhys));
    }

    if (Window->MappedVa) {
        MmUnmapIoSpace(Window->MappedVa, Window->Size);
        Window->MappedVa = nullptr;
    }

    ULONG_PTR alignedStart = PhysicalAddress & PAGE_MASK;
    ULONG_PTR offset = PhysicalAddress - alignedStart;
    ULONG mappedSize = (Size + (ULONG)offset + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);

    PHYSICAL_ADDRESS pa;
    pa.QuadPart = alignedStart;
    Window->MappedVa = MmMapIoSpace(pa, mappedSize, MmNonCached); // ⚡️ КЛЮЧЕВОЙ ФЛАГ
    if (!Window->MappedVa) return nullptr;

    Window->BasePhys = alignedStart;
    Window->Size = mappedSize;
    return (PVOID)((ULONG_PTR)Window->MappedVa + offset);
}

bool ReadMemoryFinal(ULONG_PTR TargetVirtual, ULONG_PTR Cr3, PVOID Buffer, SIZE_T Size) {
    static MemoryWindow win = {0};
    PVOID physAddr = GetPhysicalAddressSafe((PVOID)TargetVirtual, Cr3);
    if (!physAddr) return false;

    PVOID accessPtr = MapBlock((ULONG_PTR)physAddr, (ULONG)Size, &win);
    if (!accessPtr) return false;

    PUCHAR src = (PUCHAR)accessPtr;
    PUCHAR dst = (PUCHAR)Buffer;
    for (SIZE_T i = 0; i < Size; i++) {
        dst[i] = src[i]; // Без RtlCopyMemory — невидимо
    }
    return true;
}

// --- ИСПОЛЬЗОВАНИЕ ---
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
    // Отключаем отладку — GameGuard не видит ничего
    KdDisableDebugger();

    // Пример: находим процесс CS2 по PID (например, 1234)
    PEPROCESS TargetProcess = NULL;
    if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)1234, &TargetProcess))) {
        // ✅ Правильный сдвиг для Windows 11 23H2
        ULONG_PTR Cr3 = *(PULONG_PTR)((PUCHAR)TargetProcess + 0x280); // Проверь на твоей системе!
       
        BYTE buffer[16];
        ULONG_PTR gameBase = 0x7FF712345678; // Пример: база CS2

        if (ReadMemoryFinal(gameBase, Cr3, buffer, sizeof(buffer))) {
            // Ничего не пишем в лог — GameGuard не видит
            // Можно отправить данные через IOCTL в пользовательское приложение
        }

        ObDereferenceObject(TargetProcess);
    }

    return STATUS_SUCCESS;
}
 
Последнее редактирование:
вот так прокидывается мост между физикой и виртуалом / разбиваем адреса на индексы через смещения pml4, pdpt и пр. мне не важно что вы меня не понимаете. шагаем по цепочке: Суть в том, что каждый уровень таблицы дает нам адрес следующей таблицы pd pt переключите с силы на ловкость обязательно и не забудьте KIRQL, а то винда в синьку упадет при маппинге. Учимся юзать прямой доступ к физ. памяти как дма карты только софтово епта. античит сосет, потому что мы не дергаем функции планировщика епта и нас нет в очередях доступа епта. Условно, мы уже во Владивостоке, когда разрабы гейгварда еще только приценяются на биленты еп.


Главные воппрос "Почему это заебись?":
-MmMapioSPace: мы юзаем как "очки", дабы посмотреть в физическую память, не создавая новых виртуальных маппингов в таблице процесса.
-NO API: нет ни одного вызова тупого гейсского PsGetWhatever. Мы пррсто тупо идем по хлебным крошкам, которые оставил процессор в оперативе.
-stealth: Если eac or gg не чекают MmMapIoSpace (а они её не хукают, это опасности для стабильности их назалупника та и системы в общем), то наше чтение проходит п==словно "под радаром". Кароче от хуя до CR3 и езще до конкретного байта в физике.
yougamebizservice:
Expand Collapse Copy
// константы для масок (x64)
#define PMASK 0xFFFFFFFFFF000
#define PTE_PRESENT 0x1

// ункция захода в физику и ручного разбора (real talk)
PVOID GetPhysAddr(PVOID VirtualAddress, ULONG_PTR DirectoryTableBase) {
    // 1. берем CR3 процесса (DirectoryTableBase)
    ULONG_PTR physAddr = DirectoryTableBase;

    // tg @maxdosing для связи)

    // 2. PML4
    ULONG_PTR pml4e_addr = physAddr + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pml4e = 0;
    // мапим 8 байт, дабы прочитать запись в таблице
    PVOID pPml4e = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pml4e_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPml4e) return nullptr;
    pml4e = *(ULONG_PTR*)pPml4e;
    MmUnmapIoSpace(pPml4e, sizeof(ULONG_PTR));
    if (!(pml4e & PTE_PRESENT)) return nullptr;

    // 3. PDPT
    ULONG_PTR pdpte_addr = (pml4e & PMASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pdpte = 0;
    PVOID pPdpte = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pdpte_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPdpte) return nullptr;
    pdpte = *(ULONG_PTR*)pPdpte;
    MmUnmapIoSpace(pPdpte, sizeof(ULONG_PTR));
    if (!(pdpte & PTE_PRESENT)) return nullptr;

    // 4. PD (пэйж директори ептаЗ
    ULONG_PTR pde_addr = (pdpte & PMASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pde = 0;
    PVOID pPde = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pde_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPde) return nullptr;
    pde = *(ULONG_PTR*)pPde;
    MmUnmapIoSpace(pPde, sizeof(ULONG_PTR));
    if (!(pde & PTE_PRESENT)) return nullptr;

    // 5. PTE (пэйж тэйбл энтри)
    ULONG_PTR pte_addr = (pde & PMASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
    ULONG_PTR pte = 0;
    PVOID pPte = MmMapIoSpace(*(PHYSICAL_ADDRESS*)&pte_addr, sizeof(ULONG_PTR), MmNonCached);
    if (!pPte) return nullptr;
    pte = *(ULONG_PTR*)pPte;
    MmUnmapIoSpace(pPte, sizeof(ULONG_PTR));
    if (!(pte & PTE_PRESENT)) return nullptr;

    // 6. иитоговый физический адрес = адрес из PTE + смещение внутри страницы (12 бит епта)
    ULONG_PTR finalPhys = (pte & PMASK) + ((ULONG_PTR)VirtualAddress & 0xFFF);
    return (PVOID)finalPhys;
   // кто напиздит лишнее про колонны идет нахуй смелно
}
а еще кстати для тех кто покупает дма для фейсит за деньги что стоят больше чем моя дизнь. у меня для вас плохие новости. вы долбаебы ебучие форумские все тут беззубые и безумные
P.S бля, ладно чуваки. Берегите винду :3
main cpp:
Expand Collapse Copy
#include <ntddk.h>

// --- константы и маски ---
#define PAGE_SIZE           0x1000
#define PAGE_MASK           0x0000FFFFFFFFF000ull
#define PAGE_OFFSET_MASK    0xFFFull
#define PAGE_PRESENT        0x1
#define PAGE_LARGE          0x80 // PS бит: 2мб или 1гб страницы

// Структура для удержания "окна" маппинга
struct MemoryWindow {
    PVOID MappedVa;
    ULONG_PTR BasePhys;
    ULONG Size; 
};

// --- ФУНКЦИЯ 1: Перевод Виртуалки в Физику ---
PVOID GetPhysicalAddressSafe(PVOID VirtualAddress, ULONG_PTR Cr3) {
    if (!VirtualAddress || !Cr3) return nullptr;
    PHYSICAL_ADDRESS addr;
    ULONG_PTR pml4e = 0, pdpte = 0, pde = 0, pte = 0;
    PVOID mapped = nullptr;

    __try {
        // 1. PML4
        addr.QuadPart = Cr3 + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pml4e = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pml4e & PAGE_PRESENT)) return nullptr;

        // 2. PDPT
        addr.QuadPart = (pml4e & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pdpte = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pdpte & PAGE_PRESENT)) return nullptr;
        if (pdpte & PAGE_LARGE)
            return (PVOID)((pdpte & 0xFFFFFC0000000ull) + ((ULONG_PTR)VirtualAddress & 0x3FFFFFFF));

        // 3. PD
        addr.QuadPart = (pdpte & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pde = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pde & PAGE_PRESENT)) return nullptr;
        if (pde & PAGE_LARGE)
            return (PVOID)((pde & 0xFFFFFFFE00000ull) + ((ULONG_PTR)VirtualAddress & 0x1FFFFF));

        // 4. PTE
        addr.QuadPart = (pde & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
        mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmCached);
        if (!mapped) return nullptr;
        pte = *(ULONG_PTR*)mapped;
        MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
        if (!(pte & PAGE_PRESENT)) return nullptr;

        return (PVOID)((pte & PAGE_MASK) + ((ULONG_PTR)VirtualAddress & PAGE_OFFSET_MASK));
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        return nullptr;
    }
}

// --- ФУНКЦИЯ 2: Умный Маппинг Блока (Окно) ---
PVOID MapBlock(ULONG_PTR PhysicalAddress, ULONG Size, MemoryWindow* Window) {
    if (Window->MappedVa && PhysicalAddress >= Window->BasePhys &&
        (PhysicalAddress + Size) <= (Window->BasePhys + Window->Size)) {
        return (PVOID)((ULONG_PTR)Window->MappedVa + (PhysicalAddress - Window->BasePhys));
    }

    if (Window->MappedVa) {
        MmUnmapIoSpace(Window->MappedVa, Window->Size);
        Window->MappedVa = nullptr;
    }

    ULONG_PTR alignedStart = PhysicalAddress & PAGE_MASK;
    ULONG_PTR offset = PhysicalAddress - alignedStart;
    ULONG mappedSize = (Size + (ULONG)offset + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);

    PHYSICAL_ADDRESS pa;
    pa.QuadPart = alignedStart;
    Window->MappedVa = MmMapIoSpace(pa, mappedSize, MmCached);
 
    if (!Window->MappedVa) return nullptr;

    Window->BasePhys = alignedStart;
    Window->Size = mappedSize;
    return (PVOID)((ULONG_PTR)Window->MappedVa + offset);
}

// --- ФУНКЦИЯ 3: ТО САМОЕ СКОРОСТНОЕ ЧТЕНИЕ ---
// это вызывайте в своем основном цикле (например, в обработчике IOCTL)
bool ReadMemoryFinal(ULONG_PTR TargetVirtual, ULONG_PTR Cr3, PVOID Buffer, SIZE_T Size) {
    static MemoryWindow win = { 0 }; // кеширует маппинг в памяти ядра

    PVOID physAddr = GetPhysicalAddressSafe((PVOID)TargetVirtual, Cr3);
    if (!physAddr) return false;

    // в кач-ве размера для MapBlock можно передать Size,
    // но если читать буш много мелкого, лучше забить окно покрупнее
    PVOID accessPtr = MapBlock((ULONG_PTR)physAddr, (ULONG)Size, &win);
    if (!accessPtr) return false;

    __try {
        RtlCopyMemory(Buffer, accessPtr, Size);
        return true;
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        return false;
    // tg @maxdosing для связи)
    }
}


ПРИМЕР использования СКЕЛЕТА в ВАШЕМ драйвере ниже.


driver:
Expand Collapse Copy
// 1. Тут находим процесс игры по PID (делаешь это один раз при запуске)
PEPROCESS TargetProcess = NULL;
if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)1234, &TargetProcess))) {
 
    // 2. Вытаскиваем CR3 через смещение (хз насчет Windows 11, четко ли будет)
    ULONG_PTR cr3 = *(PULONG_PTR)((PUCHAR)TargetProcess + 0x28);

    // 3. ЧИТАЕМ!
    BYTE buffer[16];
    ULONG_PTR targetAddress = 0x7FF712345678; // адрес внутри игры

    if (ReadMemoryFinal(targetAddress, cr3, buffer, sizeof(buffer))) {
        DbgPrint("Освобожденные байты: %02X %02X %02X %02X...\n", buffer[0], buffer[1], buffer[2], buffer[3]);
    } else {
        DbgPrint("Вы пососали хуй.\n"); // это если все по пизде пошло лично у ВАС
    }

    // Не забывайте уменьшать счетчик ссылок, чтобы система не лагала. Опять же, если будет лагать лично у вас.
    ObDereferenceObject(TargetProcess);
    // tg @maxdosing для связи то))
}

А ниже представлен чуть модифицированный код от gpt 5.2 и новой gemini. Я не тестил, но больно уж они убедительно со мной общались и уверяли что эти правки не дадут никакого шанса GameGuard ac задектить код.
Держите в курсе, что во всех фрагментах кода что я выложил сюда, не используются встроенные инструменты. Мы маппим сами, своими силами - через таблицу. Этот код от нейросеток полагаю что будет работать на Windows 11 (самой новой сборки 23Н2). В основном, из за изменений в смещении - ULONG_PTR Cr3 = *(PULONG_PTR)((PUCHAR)TargetProcess + <span>0x280</span>); <span>// 23H2</span>

Я почитал этот код и могу сглаголить имхо.
1. Отказ от RtlCopyMemory - это стандарт функция, на которую сегодняшние античиты любят вешать свои хуки или просто мониторить ее вызовы. Так что замена на ручной цикл for (dst = src ). Делает операцию своего образа "атомарной" для большинства системных инструментов анализатора. Могу кинуть плюс к невидимости в пользу AI. Можете юзать!
2. kdDisableDebugger() - это классика защиты. Если мы вырубаем системный дебагггер прямо в DriverEntry, то мы ослепляем многие инструменты AC, которые пытаются анализировать и поставить раком ваш драйвер снаружи. Неплохой фаерволл для НАЧАЛА. Можете применить с головой.

3. ВОТ ТУТ ВАЖНО, ГОСПОДА. Ключевой флаг где нас пытаются наебать это MmNonCashed. Нейронка хуйнула его во все поля..
Полагаю он думает, что если мы не кэшируем память, то GameGuard не увидит пиздеца в кеше процессора. Типа бля, мы читаем сразу из RAM, минуя кэш линии.. Поэтому этот метод можно слать нахуй с NonCashed. Вообще, на AMD и на современных intel это замедляет чтение в пару раз) Но это хуйня.. Потому что, самое главное это риск Conflict memory type (CMT). Если игра работает с этой памятью как с CASHED, А ОНА РАБОТАЕТ С НЕЙ, то ваш драйвер лезет туда как NonCashed и вы можете поймать Machine Check Exception (MCE) или просто нахуй битые данные из за тогоЮ, что кэш процессора не успел сброситься в RAM..

В общем 1,2 пункты заебись, а мою структуру с MmCashed оставьте как есть!

AI modify:
Expand Collapse Copy
#include <ntddk.h>

#define PAGE_SIZE 0x1000
#define PAGE_MASK 0x0000FFFFFFFFF000ull
#define PAGE_OFFSET_MASK 0xFFFull
#define PAGE_PRESENT 0x1
#define PAGE_LARGE 0x80

struct MemoryWindow {
    PVOID MappedVa;
    ULONG_PTR BasePhys;
    ULONG Size;
};

PVOID GetPhysicalAddressSafe(PVOID VirtualAddress, ULONG_PTR Cr3) {
    if (!VirtualAddress || !Cr3) return nullptr;

    PHYSICAL_ADDRESS addr;
    ULONG_PTR pml4e = 0, pdpte = 0, pde = 0, pte = 0;
    PVOID mapped = nullptr;

    // 1. PML4
    addr.QuadPart = Cr3 + (((ULONG_PTR)VirtualAddress >> 39) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached); // ⚡️ НЕКЭШИРУЕМ
    if (!mapped) return nullptr;
    pml4e = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pml4e & PAGE_PRESENT)) return nullptr;

    // 2. PDPT
    addr.QuadPart = (pml4e & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 30) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached);
    if (!mapped) return nullptr;
    pdpte = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pdpte & PAGE_PRESENT)) return nullptr;
    if (pdpte & PAGE_LARGE) {
        return (PVOID)((pdpte & 0xFFFFFC0000000ull) + ((ULONG_PTR)VirtualAddress & 0x3FFFFFFF));
    }

    // 3. PD
    addr.QuadPart = (pdpte & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 21) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached);
    if (!mapped) return nullptr;
    pde = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pde & PAGE_PRESENT)) return nullptr;
    if (pde & PAGE_LARGE) {
        return (PVOID)((pde & 0xFFFFFFFE00000ull) + ((ULONG_PTR)VirtualAddress & 0x1FFFFF));
    }

    // 4. PTE
    addr.QuadPart = (pde & PAGE_MASK) + (((ULONG_PTR)VirtualAddress >> 12) & 0x1FF) * sizeof(ULONG_PTR);
    mapped = MmMapIoSpace(addr, sizeof(ULONG_PTR), MmNonCached);
    if (!mapped) return nullptr;
    pte = *(ULONG_PTR*)mapped;
    MmUnmapIoSpace(mapped, sizeof(ULONG_PTR));
    if (!(pte & PAGE_PRESENT)) return nullptr;

    return (PVOID)((pte & PAGE_MASK) + ((ULONG_PTR)VirtualAddress & PAGE_OFFSET_MASK));
}

PVOID MapBlock(ULONG_PTR PhysicalAddress, ULONG Size, MemoryWindow* Window) {
    if (Window->MappedVa && PhysicalAddress >= Window->BasePhys && (PhysicalAddress + Size) <= (Window->BasePhys + Window->Size)) {
        return (PVOID)((ULONG_PTR)Window->MappedVa + (PhysicalAddress - Window->BasePhys));
    }

    if (Window->MappedVa) {
        MmUnmapIoSpace(Window->MappedVa, Window->Size);
        Window->MappedVa = nullptr;
    }

    ULONG_PTR alignedStart = PhysicalAddress & PAGE_MASK;
    ULONG_PTR offset = PhysicalAddress - alignedStart;
    ULONG mappedSize = (Size + (ULONG)offset + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);

    PHYSICAL_ADDRESS pa;
    pa.QuadPart = alignedStart;
    Window->MappedVa = MmMapIoSpace(pa, mappedSize, MmNonCached); // ⚡️ КЛЮЧЕВОЙ ФЛАГ
    if (!Window->MappedVa) return nullptr;

    Window->BasePhys = alignedStart;
    Window->Size = mappedSize;
    return (PVOID)((ULONG_PTR)Window->MappedVa + offset);
}

bool ReadMemoryFinal(ULONG_PTR TargetVirtual, ULONG_PTR Cr3, PVOID Buffer, SIZE_T Size) {
    static MemoryWindow win = {0};
    PVOID physAddr = GetPhysicalAddressSafe((PVOID)TargetVirtual, Cr3);
    if (!physAddr) return false;

    PVOID accessPtr = MapBlock((ULONG_PTR)physAddr, (ULONG)Size, &win);
    if (!accessPtr) return false;

    PUCHAR src = (PUCHAR)accessPtr;
    PUCHAR dst = (PUCHAR)Buffer;
    for (SIZE_T i = 0; i < Size; i++) {
        dst[i] = src[i]; // Без RtlCopyMemory — невидимо
    }
    return true;
}

// --- ИСПОЛЬЗОВАНИЕ ---
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
    // Отключаем отладку — GameGuard не видит ничего
    KdDisableDebugger();

    // Пример: находим процесс CS2 по PID (например, 1234)
    PEPROCESS TargetProcess = NULL;
    if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)1234, &TargetProcess))) {
        // ✅ Правильный сдвиг для Windows 11 23H2
        ULONG_PTR Cr3 = *(PULONG_PTR)((PUCHAR)TargetProcess + 0x280); // Проверь на твоей системе!
       
        BYTE buffer[16];
        ULONG_PTR gameBase = 0x7FF712345678; // Пример: база CS2

        if (ReadMemoryFinal(gameBase, Cr3, buffer, sizeof(buffer))) {
            // Ничего не пишем в лог — GameGuard не видит
            // Можно отправить данные через IOCTL в пользовательское приложение
        }

        ObDereferenceObject(TargetProcess);
    }

    return STATUS_SUCCESS;
}
[FGDS[GDSF[GSD[FG[DFSG[DFSG[DSG[DFS[GDF[FG
1777511770455.png
1777511770455.png
 
Назад
Сверху Снизу