5

そのため、別のプログラムの値を変更するために、C++ でプログラムを作成しようとしています。私の場合、Windows の電卓です。コードは次のとおりです。

#include <iostream>
#include <windows.h>

using namespace std;

int main(void) {

    int nVal = 2000;

    HWND hWnd = FindWindowA(0, "Calculator");
    if(hWnd == 0){
        cerr << "Could not find window." << endl;
    } else {
        DWORD PID;
        GetWindowThreadProcessId(hWnd, &PID);
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, PID);

        if(!hProc) {
            cerr << "Cannot open process." << endl;
        } else {
            int stat = WriteProcessMemory(hProc, (LPVOID)0xC6A0EB922C, &nVal, (DWORD)sizeof(nVal), NULL);

            if(stat > 0){
                clog << "Memory written to process." << endl;
            } else {
                cerr << "Memory couldn't be written to process." << endl;
            }

            CloseHandle(hProc);

            cin.get();

        }

    }

    return 0;
}

プログラムは、電卓の「MS」ボタンで保存された 1 つの値を上書きしようとします。問題は、プログラムがこれを実行できないことです。実行可能ファイルを管理者として実行しようとしましたが、何も変わりません。YouTube ビデオでこのコードを見つけました。男は XP を使用しており、私は Windows 8 を使用しています。

Cheat Engineを使用して0xC6A0EB922Cアドレスを見つけ、内部の値を変更しようとしたところ、完全に機能しました!

誰かが私を助けることができるなら、してください。ありがとう!

4

2 に答える 2

7

ハードコードされたアドレスから判断すると、電卓は 64 ビット アプリケーションとして実行されています。

プログラムが 32 ビットとしてコンパイルされている場合、ハード コードされたアドレス(LPVOID)0xC6A0EB922Cは 32 ビットに切り捨てられるため、正しくありません。

これを解決するには、プログラムを 64 ビットとしてコンパイルするか、32 ビットの計算機をテスト ターゲットとして使用する必要があります。にありますC:\Windows\SysWOW64\calc.exe

WinAPI 関数は失敗する可能性があり、必要以上に頻繁に実行されます。常に戻り値を確認しGetLastError()、エラーが発生した場合は呼び出して、失敗した理由がわかるようにします。

他のプロセスを開くときは、プログラムを管理者として実行するか、UAC をオフにすることを忘れないでください。

于 2013-09-23T22:37:11.350 に答える