簡単なデバッガを書いてみます。簡単にするために、デバッガーが Windows XP で実行されると仮定します。
最初に、次のように新しいプロセスを作成します。
CreateProcess(processName,
NULL,
NULL,
NULL,
false,
DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS,
NULL,
NULL,
&startInfo,
&openedProcessInfo);
そして、デバッグプロセスのメモリで何かを読み書きしようとすると、いくつかの問題があります。例えば:
DWORD oldProtect;
if(!VirtualProtectEx(hProcess, breakpointAddr, 1, PAGE_EXECUTE_READWRITE, &oldProtect)) {
printf("Error: %d\n", GetLastError());
}
SIZE_T bytesRead = 0;
SIZE_T bytesWritten = 0;
BYTE instruction;
BOOL isOk = ReadProcessMemory(hProcess, breakpointAddr, &instruction, 1, &bytesRead);
BYTE originalByte = instruction;
instruction = 0xCC;
if(isOk && bytesRead == 1) {
isOk = WriteProcessMemory(hProcess, breakpointAddr, &instruction, 1, &bytesWritten);
if(isOk) {
isOk = FlushInstructionCache(hProcess, breakpointAddr, 1);
}
}
if(!isOk) {
printf("Error: %d\n", GetLastError());
}
機能しますが、どこでも機能するわけではありません。何かを書き込み(読み取り)たいアドレスが実行可能モジュール(.exe)内にある場合に機能します。
しかし、DLL ライブラリ内で何かを書き込み (読み取り) ようとすると (たとえば、関数 VirtualAlloc のアドレスで読み取る)、VirtualProtectEx は false を返し、GetLastError = 487 (無効なアドレスにアクセスしようとする) とReadProcessMemory も false を返し、GetLastError = 299 (一部のみ) を返します。 ReadProcessMemory または WriteProcessMemory リクエストが完了しました。)
デバッグ権限は有効になっていますが、効果はありません。