Winapi 如何在进程读取我的进程时调用函数';s内存-Win32 API

Winapi 如何在进程读取我的进程时调用函数';s内存-Win32 API,winapi,hook,readprocessmemory,Winapi,Hook,Readprocessmemory,最近我一直在研究如何连接函数和创建回调函数。虽然我不完全理解整个技术,但似乎我应该能够钩住Windows API的ReadProcessMemory()函数,让我的进程在某个对象读取其内存时调用一个函数。虽然我只是出于好奇才想这么做,但连接windows功能似乎对防止在线游戏中的黑客攻击非常有用 不幸的是,关于这个主题的教程、文章等非常缺乏。我看过很多注入代码,但缺乏理解让我望而却步。我想做的事情可能吗?有人能给我指出正确的方向吗 我要提到的是,这是我第一次自愿跳出OO编程,因此如果这毫无意义,

最近我一直在研究如何连接函数和创建回调函数。虽然我不完全理解整个技术,但似乎我应该能够钩住Windows API的ReadProcessMemory()函数,让我的进程在某个对象读取其内存时调用一个函数。虽然我只是出于好奇才想这么做,但连接windows功能似乎对防止在线游戏中的黑客攻击非常有用

不幸的是,关于这个主题的教程、文章等非常缺乏。我看过很多注入代码,但缺乏理解让我望而却步。我想做的事情可能吗?有人能给我指出正确的方向吗

我要提到的是,这是我第一次自愿跳出OO编程,因此如果这毫无意义,我深表歉意。

使用钩子函数:

BOOL WINAPI hkReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead)
{

    if (GetCurrentProcess() == hProcess) {

           // your process
    }
        return oReadProcessMemory( hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead);

}
typedef BOOL (WINAPI* _NtReadProcessMemory)( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);
_NtReadProcessMemory oReadProcessMemory = (_NtReadProcessMemory)
GetProcAddress(GetModuleHandle(L"ntdll"), "NtReadProcessMemory");
函数的类型定义:

BOOL WINAPI hkReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead)
{

    if (GetCurrentProcess() == hProcess) {

           // your process
    }
        return oReadProcessMemory( hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead);

}
typedef BOOL (WINAPI* _NtReadProcessMemory)( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);
_NtReadProcessMemory oReadProcessMemory = (_NtReadProcessMemory)
GetProcAddress(GetModuleHandle(L"ntdll"), "NtReadProcessMemory");
声明旧函数:

BOOL WINAPI hkReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead)
{

    if (GetCurrentProcess() == hProcess) {

           // your process
    }
        return oReadProcessMemory( hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead);

}
typedef BOOL (WINAPI* _NtReadProcessMemory)( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);
_NtReadProcessMemory oReadProcessMemory = (_NtReadProcessMemory)
GetProcAddress(GetModuleHandle(L"ntdll"), "NtReadProcessMemory");
安装绕道:

BOOL bHook = Mhook_SetHook((PVOID*)&oReadProcessMemory, 
            hkReadProcessMemory));
显然,您需要将此DLL注入到系统上运行的所有进程中


Mhook:(迂回库)

然后他们会在不调用
ReadProcessMemory
的情况下钩住你并读取你的内存。应该注意的是,如果你考虑到所有在你控制之外的东西都会读取你的内存,
ReadProcessMemory
,它们中的一小部分甚至都不会被注意到。DMA可以发生;您的页面可以交换到磁盘,各种第三方代码可以从您的进程内部运行,等等