1

簡単なデバッガを書いてみます。簡単にするために、デバッガーが 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 リクエストが完了しました。)

デバッグ権限は有効になっていますが、効果はありません。

4

1 に答える 1

0

管理者として実行している場合、問題の原因として最も可能性が高いのは、breakpointAddr が無効なアドレスであることです。「無効なアドレスにアクセスしようとしています」というエラーが表示される VirtualProtectEx は、この結論を裏付けています。

于 2020-03-28T21:56:27.567 に答える