2

私はこのコードでプロセスのメモリに書き込もうとしています(チートコードを作成するため):


    #include 

    int main() 
    {
    HWND hWnd = FindWindow(0, "xyz");
    if(hWnd == 0)
    {
            MessageBox(0, "Error cannot find window.", "Error", MB_OK|MB_ICONERROR);
    } 
    else 
    {
            DWORD proccess_ID;
            GetWindowThreadProcessId(hWnd, &proccess_ID);
            HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID);
            if(!hProcess)
        {
                MessageBox(0, "Could not open the process!", "Error!", MB_OK|MB_ICONERROR);
            } 
        else 
        {
                int newdata = 500;
                DWORD newdatasize = sizeof(newdata);
                if(WriteProcessMemory(hProcess, (LPVOID)0x57C2A4, &newdata, newdatasize, NULL))
            {
                        MessageBox(NULL, "WriteProcessMemory worked.", "Success", MB_OK + MB_ICONINFORMATION);
                } 
            else 
            {
                        MessageBox(NULL, "Error cannot WriteProcessMemory!", "Error", MB_OK + MB_ICONERROR);
                }
                CloseHandle(hProcess);
            }
    }
    return 0;
    }

たとえば、jnz を jz で上書きすると、両方とも同じサイズであるため、正常に動作します。しかし、たとえば pop を jmp で上書きしようとすると、これらのコマンドのサイズが異なるため、エラーが発生します。

ここで、WriteProcessMemory が検証を実行して、指定されたアドレスで使用可能なサイズを確認することを読みました。

私がやりたいことは、サイズチェックなしでメモリアドレスに書き込むことです。そのため、プログラムはコードに必要なバイト数を単純に上書きします。

Cheat Engine を使用すると、必要なバイトを上書きすることができたので、これを行うことができました。

だから私の質問は、チートエンジンと同じようにC ++で行う方法ですか?

4

1 に答える 1

0

「チートエンジンと同じようにC++で行うにはどうすればよいですか?」というあなたの正確な質問に対する答えがわかりません。あなたのケースでチートエンジンがどのように機能するかわかりません。単一の命令を上書きするだけではなく、はるかに複雑なことをしている可能性があります。

WriteProcessMemory は、検証すると思われるものを検証しません。

呼び出しプロセスのアドレス空間から一連のバイトを取得し、それらのバイトを別のプロセスに書き込みます。これらのバイトからも、上書きされるバイトからも x86 命令をデコードしません。コードを書いているのかデータを書いているのかさえわからないからです。

自分が何をしているのかを知っていれば、短い命令を長い命令に確実に置き換えることができます。新しい長いコードを書くだけです。副作用があります。古い短い命令の後にある命令を (おそらく部分的に) 上書きします。これにより、パッチの直後にコードが壊れる可能性があります。

長い命令を短い命令に置き換えるのは簡単で、副作用もありません。新しい命令に 0x90 バイト = NOP 命令を埋め込むだけです。

于 2016-09-10T23:59:59.757 に答える