Всем привет!
Пришло в голову попробовать хукнуть ReadProcessMemory функцию внутри x64dbg и посмотреть на результат.
Как по мне, получилось неплохо, в этой статье я коротко расскажу как я это реализовал.
Для хука я использовал библиотеку Detours, так-же можно использовать MinHook.
Для начала создадим нужную функцию, которой мы заменим оригинальный ReadProcessMemory.
В данном хуке, мы получаем размер буфера и заменяем все значения в нем на 0x90 (инструкция nop).
Далее нам нужно установить этот хук внутри приложения.
Функция Main:
На этом наш хук готов, дополнительно вы можете написать лоадер вашей длл, но в этой статье мы опустим этот момент.
Результат:
Либо можно сделать
Благодаря чему мы получим:
Пришло в голову попробовать хукнуть 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;
}
На этом наш хук готов, дополнительно вы можете написать лоадер вашей длл, но в этой статье мы опустим этот момент.
Результат:
Либо можно сделать
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;
}
Благодаря чему мы получим:
Последнее редактирование: