나는 약간 모험적 이었기 때문에 WinAPI를 사용하여 Windows에서 이와 비슷한 것을 작성하려고했습니다. 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