1

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


假设有一个名为的简单程序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

4 回答 4

1

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

出于多种原因,这很有帮助,包括内存碎片,以及允许多个应用程序在随机时间启动和停止。

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

于 2013-08-20T04:33:58.803 回答
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. 希望能帮助到你。

于 2013-08-20T07:07:13.203 回答
1

首先,当您运行第二个程序时,第一个程序a中的 将早已消失(或加载到不同的位置)。其次,许多操作系统通过将程序加载到单独的空间来保护程序。

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

于 2013-08-20T04:23:04.710 回答
0
  1. 为什么你认为这是可能的——调试器只能读取?
  2. 如果有可能,那么各种混乱都可能发生!
  3. 共享内存浮现在脑海中。
于 2013-08-20T04:21:00.547 回答