更改另一个应用程序的地址指针
我需要有人来编辑标题,我找不到更好的标题。
假设有一个名为source.exe
简单程序:
#include int main() { int a = 5; printf("%p", &a); return 0; }
我想编写另一个应用程序, change.exe
,它改变a
上面的内容。
我试过这样的事情:
int main() { int * p = (int*) xxx; // xxx is what have printed above *p = 1; printf("%d", *p); return 0; }
它不起作用。 假设我拥有管理员权限,有没有办法做我上面尝试过的事情? 谢谢。
首先,当你运行第二个程序时,第a
程序中的a
将很久(或加载到不同的位置)。 第二,许多操作系统通过将程序加载到不同的空间来保护程序。
您真正需要的是进程间通信(IPC)机制,特别是共享内存或内存映射文件。
在人们处理的大多数传统计算机上,操作系统使用虚拟内存。 这意味着两个进程都可以使用地址0x12340000
,它可以引用两个不同的内存。
这有很多原因,包括内存碎片,允许多个应用程序随机启动和停止。
在某些系统上,例如TI DSP,没有MMU,因此没有虚拟内存。 在这些系统上,像演示应用程序这样的东西可以工作。
我感觉有点冒险,所以我想在Windows下使用WinAPI写这样的东西,当然。 与Linux的ptrace
一样,此代码使用的调用只能由调试器使用,通常不会出现在任何正常的应用程序代码中。
此外,打开另一个进程的内存进行写入需要您使用PROCESS_VM_WRITE
和PROCESS_VM_OPERATION
权限打开进程句柄。 但是,只有在打开进程的应用程序启用了SeDebugPriviledge
特权时才可以执行此操作。 我使用管理员权限以提升模式运行应用程序,但是我真的不知道这是否对SeDebugPriviledge
有任何影响。
无论如何,这是我用于此的代码。 它是用VS2008编译的。
#include #include #include #include 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 #include 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
可以做什么。 希望能帮助到你。
- 为什么你认为这是可能的 – 调试器只能读取?
- 如果有可能那么各种各样的混乱都可能发生!
- 记住共享记忆。