私は少し冒険的な気分だったので、もちろん 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
。それが役に立てば幸い。