1

教育目的で Icy Tower 1.4 のトレーナーを作成しようとしています。

私はそのような WriteProcessMemory 関数を短縮する関数を書きました:

void WPM(HWND hWnd,int address,byte data[])
{
    DWORD proc_id;
    GetWindowThreadProcessId(hWnd, &proc_id);
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);

    if(!hProcess)
        return;

    DWORD dataSize = sizeof(data);
    WriteProcessMemory(hProcess,(LPVOID)address,&data,dataSize,NULL);
    CloseHandle(hProcess);
}

これが、Icy Tower Clock を停止する関数です。

void ClockHack(int status)
{
    if(status==1)//enable
    {
        //crashes the game
        byte data[]={0xc7,0x05,0x04,0x11,0x45,0x00,0x00,0x00,0x00,0x00};
        WPM(FindIcyTower(),0x00415E19,data);
    }
    else if(status==0)//disable
    {
            byte data[]={0xA3,0x04,0x11,0x45,0x00};
    }
}

else ステートメントには、オペコードの元の AOB があります。status パラメーターを 1 に設定して ClockHack 関数を呼び出すと、ゲームがクラッシュします。

Cheat Engine では、このためにスクリプトを書きましたが、Code Cave を実行したため、同じアドレスに正確に書き込むことはできず、うまく機能します。

誰かが理由を知っていますか?ありがとうございました。

ちなみに、これは教育目的のみです。

4

2 に答える 2

2

配列が関数に渡される場合、常に参照によって渡されるため、byte[] は byte* と同じでsizeof(byte*)あり、コードの最初のバイトのみを記述しています。または X86 プラットフォームでは 4 バイト。

また、あなたが書いているのはオブジェクトコードのようです。そうでない場合は、この回答の残りを無視してください。

まあ、正しい場所に書き込んでいて、書き込んでいる内容が正しいと仮定すると、まだ問題があります-WriteProcessMemoryターゲットプロセスで実行されているスレッドに関してアトミックであることが保証されていません.

そのターゲット スレッドが中断され、コードのその部分で実行されていないことを確認する必要があります。また、命令デコード パイプラインや L1 キャッシュをフラッシュするためにどのようなことを行う必要があるか (可能性がある) もわかりません。

編集:もう少し考えてみました。ミューテックスを使用して、実行中にこのコードが上書きされないように保護することは、スレッドを中断するよりも優れていると思います。

于 2010-01-15T22:59:32.033 に答える
2

そのような関数に配列を渡すことはできません。パラメータを持つことはパラメータbyte[]と同じであり、ポインタのサイズを与えるだけです。また、すでにポインターであるため、使用しないでください。byte *sizeof(data)&data

したがって、関数は次のようになります。

void WPM(HWND hWnd,int address, byte *data, int dataSize)
{
    //....
    WriteProcessMemory(hProcess,(LPVOID)address,data,dataSize,NULL);
    //...
}
于 2010-01-15T22:45:58.933 に答える