更改另一个应用程序的地址指针

我需要有人来编辑标题,我找不到更好的标题。


假设有一个名为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_WRITEPROCESS_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可以做什么。 希望能帮助到你。

  1. 为什么你认为这是可能的 – 调试器只能读取?
  2. 如果有可能那么各种各样的混乱都可能发生!
  3. 记住共享记忆。