在应用层一般是通过ReadProcessMomory来读取指定进程的内存数据。其函数原型如下:
BOOL
ReadProcessMemory(
HANDLE hProcess,
LPCVOID lpBaseAddress,
LPVOID lpBuffer,
DWORD nSize,
LPDWORD lpNumberOfBytesRead
);
但有的时候,并不是所有的进程能都很轻晚的读取,这时需要提权等相关的操作。但是如果在驱动层,就没有上面一系列的问题,我们完全可以任意读取进程的内存数据。但在内核中有一个问题就是,在读取数据是,由于进程的调度,有的时候读的时候发生了进程切换,导致了读取应用层的数据时虽然地址正确,但读的数据却是别的进程的。
Windows给我们提供了一下函数KeStackAttachProcess,可使当前的内核环境附加到目标进程,这时候读的内存就是指定进程的内存数据了。
具体的代码可详见:https://www.bytekits.com/wdm/windrv-attach-to-process.html
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)