我不看参考他的注释,仅看堆栈偏移对应的参数来重写,也能成功写入数据。请问这是为什么呢?
BOOL WINAPI MyWriteProcessMemory(
HANDLE hProcess, // handle to process
LPVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
DWORD nSize, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // number of bytes written
)
{
DWORD dwRet = FALSE;
经过分析,我猜测是系统在WriteProcessMemory内部,将存放hProcess的栈地址,用于临时存放用于返回实际写入数据长度的储存地址(即number of bytes written),再经过ZwFlushInstructionCache函数后,将实际写入数据的长度写入最初传入的参数lpNumberOfBytesWritten(number of bytes written)地址。
也不知道分析的对不对。
后面我按自己得传参方式中过中断门也实现了三环部分的功能:
BOOL WINAPI MyWriteProcessMemoryPro(
HANDLE hProcess, // handle to process
LPVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
DWORD nSize, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // number of bytes written
)
{
__asm
{
pushad
pushfd