我感覺有點冒險,所以我想在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
可以做什麼而創建的。希望能幫助到你。
由於調試器可以做到這一點,答案是'是的,這是可能的',但它不是你通常期望做的事情。除此之外,'source.exe'會運行得如此簡單,以至於很難正確執行'change.exe'的執行,以便有機會更改'source.exe'中的任何內容。假設你添加了一些機制來延遲'source.exe'的退出,你仍然遇到各種各樣的問題。 O/S的目的之一是阻止ProcessA與ProcessB的內存混淆 - 因此您正在破壞該保護。 –
要知道答案需要操作系統。在Linux上你使用ptrace。在Windows上,您可以使用WriteProcessMemory。 –
一個應用程序中的地址與另一個應用程序中的地址不同。閱讀http://en.wikipedia.org/wiki/Virtual_address_space – chris