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

时间:2013-08-20 04:15:08

标签: c pointers access-violation

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


假设有一个名为source.exe的简单程序:

#include <stdio.h>

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;
}

它不起作用。假设我拥有管理员权限,有没有办法做我上面尝试过的事情?感谢。

4 个答案:

答案 0 :(得分:1)

首先,当你运行第二个程序时,第一个程序中的a将很久(或加载到不同的位置)。第二,许多操作系统通过将程序加载到不同的空间来保护程序。

您真正需要的是进程间通信(IPC)机制,特别是共享内存或内存映射文件。

答案 1 :(得分:1)

在人们处理的大多数传统计算机上,操作系统都使用虚拟内存。这意味着两个进程都可以使用地址0x12340000,它可以引用两个不同的内存。

这有很多原因,包括内存碎片,允许多个应用程序随机启动和停止。

在某些系统上,例如TI DSP,没有MMU,因此没有虚拟内存。在这些系统上,像演示应用程序这样的东西可以工作。

答案 2 :(得分:1)

我感觉有点冒险,所以我想在Windows下使用WinAPI编写类似的东西,当然。与Linux的ptrace一样,此代码使用的调用只能由调试器使用,通常不会出现在任何普通的应用程序代码中。

此外,打开另一个进程的内存进行写入需要您使用PROCESS_VM_WRITEPROCESS_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可以做些什么。希望它有所帮助。

答案 3 :(得分:0)

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