Информация Хукаем ReadProcessMemory и запрещаем x64dbg читать память нашего приложения.


MKII

Просветленный
Просветленный
Регистрация
03.10.2022
Сообщения
263
Репутация
195
Всем привет!
Пришло в голову попробовать хукнуть ReadProcessMemory функцию внутри x64dbg и посмотреть на результат.
Как по мне, получилось неплохо, в этой статье я коротко расскажу как я это реализовал.

Для хука я использовал библиотеку Detours, так-же можно использовать MinHook.
Для начала создадим нужную функцию, которой мы заменим оригинальный ReadProcessMemory.
C++:
typedef BOOL(WINAPI* READPROCESSMEMORY)(
    HANDLE  hProcess,
    LPCVOID lpBaseAddress,
    LPVOID  lpBuffer,
    SIZE_T  nSize,
    SIZE_T* lpNumberOfBytesRead
    ); READPROCESSMEMORY original_ReadProcessMemory;

BOOL hook_ReadProcessMemory(
    HANDLE  hProcess,
    LPCVOID lpBaseAddress,
    LPVOID  lpBuffer,
    SIZE_T  nSize,
    SIZE_T* lpNumberOfBytesRead
)
{
    if (lpBuffer != NULL) {
        memset(lpBuffer, 0x90, nSize);
    }
    if (lpNumberOfBytesRead) {
        *lpNumberOfBytesRead = nSize;
    }
    return TRUE;
}

В данном хуке, мы получаем размер буфера и заменяем все значения в нем на 0x90 (инструкция nop).

Далее нам нужно установить этот хук внутри приложения.
Функция Main:

C++:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        // Получаем адреса оригинальных функций
        original_ReadProcessMemory = (READPROCESSMEMORY)GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "ReadProcessMemory");
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)original_ReadProcessMemory, hook_ReadProcessMemory);
        DetourTransactionCommit();
        break;
    }
    return TRUE;
}

На этом наш хук готов, дополнительно вы можете написать лоадер вашей длл, но в этой статье мы опустим этот момент.
Результат:

1727096080956.png


Либо можно сделать
C++:
BOOL hook_ReadProcessMemory(

    HANDLE  hProcess,

    LPCVOID lpBaseAddress,

    LPVOID  lpBuffer,

    SIZE_T  nSize,

    SIZE_T* lpNumberOfBytesRead

)

{

    if (lpBuffer != NULL) {

        memset(lpBuffer, rand() % 256, nSize);

    }

    if (lpNumberOfBytesRead) {

        *lpNumberOfBytesRead = nSize;

    }

    return TRUE;

}

Благодаря чему мы получим:
1727113199778.png
 
Последнее редактирование:

MKII

Просветленный
Просветленный
Регистрация
03.10.2022
Сообщения
263
Репутация
195
Ещё можно хукнуть OpenProcess и передать с него return INVALID_HANDLE_VALUE
А так-же CreateProcessW return STATUS_ACCESS_VIOLATION
Получаем это:

1727108708827.png



Так-же при попытке присоединиться к приложению или открыть его с помощью xdbg, отладчик не сможет его открыть.
 
Верх Низ