1

私がやろうとしているのは、何らかの値を保持する動的アドレスを指している静的アドレスを読み取ることです。しかし、静的アドレスを読み取ろうとすると、常に 0 が返されます。それを読み取る唯一の方法は、チート エンジンの動的アドレスにデバッガをアタッチすることです。ただし、動的アドレスから読み取るだけで問題なく読み取ることができます。

DWORD address = 0x74EA46D8;
int value = 0;
int new_address = 0;
DWORD pid;
HWND hwnd;
hwnd = FindWindow(NULL,L"HackMe.exe");
if(!hwnd) {
    cout <<"Window not found!\n";
    cin.get();
} else {
    GetWindowThreadProcessId(hwnd,&pid);

    HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);
    if(!phandle) {
        cout <<"Could not get handle!\n";
        cin.get();
    } else {
        while(1) {
            ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
            cout << new_address << "\n"; //Always print 0
            //int new_address = 0x2ECA40B0; //This works if I uncomment this
            ReadProcessMemory(phandle,(void*)new_address,&value,sizeof(value),0);

デバッグ権限を取得しようとしましたが、何もしませんでした。私はC++を初めて使用するため、問題が何であるかについての手がかりがありません。どんな助けでも大歓迎です。

ありがとうございました。

編集

GetLastError() は最初は 0 を返し、次に 299 を返します

編集 2

BOOL x = ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
cout << x << " " << GetLastError() << "\n";

戻り値

1 0
1 299
1 299
1 299

等々

Edit 3 読み取りバイトは 4 です。

編集 4

明確にするために。

ReadProcessMemory() を使用して 0x74EA46D8 から直接読み取ると、0 が返されます。

チート エンジンを開いてアドレス 0x74EA46D8 ポイントをアドレス リストに追加するとします。次に、それを右クリックして「このアドレスにアクセスしたものを見つける」を押すと、突然読み取ることができます。SeDebugPrivelege を有効にしても何も起こりません。

動的アドレスは、デバッグ特権がなくても通常どおり読み取ることができます (アドレスを手動で入力するか、チート エンジンがアドレスをデバッグして静的アドレスを読み取ることができる限り)

次のように構成されています。

読み取ろうとするアドレスを指す静的アドレス。上記を参照しない限り、これは「新しいアドレス」として 0 を返します。

読み取ろうとしている値を含む動的アドレス。動的アドレスを手動で定義すると、これは問題なく読み取れます。しかし、上記を参照しない限り、new_address が 0 であるため、そうしないと失敗します。

編集 5

ようやく問題が判明しました。以前のアドレスが間違っていました。そのアドレスはチート エンジンの一部であり、実際のアドレスは 0x013CD878 で、オフセットは 0x4B0 でした。それが、デバッグしないと機能しなかった理由です。

しかし、他の人が私の過ちから学ぶことを願っています :P

4

1 に答える 1

1

違うアドレスから読んでいませんか?address != new_address. (void*)address- は、読み取りを開始するアドレスです。

于 2012-09-14T19:55:22.713 に答える