-1

質問は、書き込みプロセス メモリを使用してメモリ内の値を変更するというタイトルにあります。 64 ビット Windows と 32 ビット Windows ですが、問題は書き込みにあります。助けてください (:

編集:コードは:

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Loading..."<< endl;
    int address = 0x3458CBC0; 
    int address2 = 0x3458CBC4; 
    int value = 20;
    DWORD pid;
    HWND hwnd = FindWindowA(NULL,"some window");
    GetWindowThreadProcessId(hwnd,&pid);
    HANDLE phandle;
    cout << "Found Proccess ID:" << pid << endl;
    phandle = OpenProcess(0x1F0FFF,0,pid);
    cout << "Loaded Successfully."<< endl ;
    ReadProcessMemory(phandle,(LPVOID)address,&value,4,0);
    cout << "Readed Value:" << value << endl;
    ReadProcessMemory(phandle,(LPVOID)address2,&value,4,0);
    cout << "Readed Value:" << value << endl;
    address = 0x3458CBC0; 
    address2 = 0x3458CBC4; 
    value = 20;
    WriteProcessMemory(phandle,(LPVOID)address,&value,4,0);
    WriteProcessMemory(phandle,(LPVOID)address2,&value,4,0);
    cin.get();
    return 0;
}

解決策:

アプリケーションは、カーネルのメモリに書き込む API をフックしました。このフックは 64 ビット Windows では機能しないため、メモリに書き込むことができます。

みんな、ありがとう!

4

1 に答える 1

2

Windows で実行されている 32 ビット アプリは、実際には特殊な 32 ビット エミュレーション ラッパー (WOW64) を使用しています。そこから 64 ビット アプリケーションのアドレス空間に書き込むことはできません。

これは、私ができるよりも詳しく説明しているページです。

追加するために編集:

32 ビット Windows で実行している 32 ビット ビルドを実行している場合は、動作するはずです。そうでない場合は、コードを投稿してください。

追加するために編集:

の戻り値をテストしますWriteProcessMemory()。ゼロの場合 (可能性が高いと思われます)、GetLastError()を呼び出します。これで手がかりが得られるはずです。

于 2013-03-25T21:24:35.523 に答える