我需要有人来编辑标题,我找不到更好的标题。
假设有一个名为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;
}
它不起作用。假设我拥有管理员权限,有没有办法做我上面尝试过的事情?感谢。
答案 0 :(得分:1)
首先,当你运行第二个程序时,第一个程序中的a
将很久(或加载到不同的位置)。第二,许多操作系统通过将程序加载到不同的空间来保护程序。
您真正需要的是进程间通信(IPC)机制,特别是共享内存或内存映射文件。
答案 1 :(得分:1)
在人们处理的大多数传统计算机上,操作系统都使用虚拟内存。这意味着两个进程都可以使用地址0x12340000
,它可以引用两个不同的内存。
这有很多原因,包括内存碎片,允许多个应用程序随机启动和停止。
在某些系统上,例如TI DSP,没有MMU,因此没有虚拟内存。在这些系统上,像演示应用程序这样的东西可以工作。
答案 2 :(得分:1)
我感觉有点冒险,所以我想在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
可以做些什么。希望它有所帮助。
答案 3 :(得分:0)