我觉得有点冒险,所以我想在 Windows 下写这样的东西,当然使用 WinAPI。与 Linux 一样ptrace
,此代码使用的调用只能由调试器使用,并且通常不会出现在任何正常的应用程序代码中。
此外,打开另一个进程的内存进行写入需要您以PROCESS_VM_WRITE
和PROCESS_VM_OPERATION
权限打开进程句柄。但是,这只有在打开进程的应用程序启用了SeDebugPriviledge
权限时才有可能。我以管理员权限在提升模式下运行应用程序,但是我真的不知道这是否对SeDebugPriviledge
.
无论如何,这是我用于此的代码。它是用VS2008编译的。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char cmd[2048];
int a = 5;
printf("%p %d\n", &a, a);
sprintf(cmd, "MemChange.exe %lu %x", GetCurrentProcessId(), &a);
system(cmd);
printf("%p %d\n", &a, a);
return 0;
}
这MemChange.exe
是此代码调用的代码。
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
DWORD pId;
LPVOID pAddr;
HANDLE pHandle;
SIZE_T bytesWritten;
int newValue = 666;
sscanf(argv[1], "%lu", &pId);
sscanf(argv[2], "%x", &pAddr);
pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
WriteProcessMemory(pHandle, pAddr, &newValue, sizeof(newValue), &bytesWritten);
CloseHandle(pHandle);
fprintf(stderr, "Written %u bytes to process %u.\n", bytesWritten, pId);
return 0;
}
但请不要使用此代码。这太可怕了,没有错误检查,并且可能像地狱一样泄漏。创建它只是为了说明可以用WriteProcessMemory
. 希望能帮助到你。