-3

プログラムをクラッシュさせずに、持っているメモリアドレスから値を取得したい。

ここに私のコードがあります:

int main(){
    int *ptr=(int*)0x09D37570;
    while(1){
        system("cls");
        cout<<(*ptr);
    }
    return 0;
}

しかし、それはプログラムをクラッシュさせます。*ptr を呼び出すとクラッシュします。なぜそれが起こるのでしょうか? どうすれば問題なく値を取得できますか?

4

3 に答える 3

5

ハードコーディングされたアドレスを取得し、見た値が保持されることを期待しています。ただし、これにはいくつかの問題があります。

自分のプロセスについて心配している場合は、そのメモリを所有する必要があります。あなたが割り当てnewたものなどは、そのアドレスを奪ったほうがいいです。そうしないと、何が起こるかわかりません。例えば:

int *someAddress = new int (5);
int *somePtr = someAddress; //point to same address as newed
int someInt = *somePtr; //someInt is 5
++somePtr; //uh-oh, now we've left what we newed; it might not be allocated
someInt = *somePtr; //there's no telling if that memory was ok to use

たまたまうまくいった場合は、乱数を取得するだけです。実際、十分に長くループすると、最終的にクラッシュします。しかし、問題があっても、ここでは直接関係しません。

最大の問題は、同じアドレスを持っていても、同じメモリではないことです。これは紛らわしいかもしれませんが、非常に優れたトピックです ( http://en.wikipedia.org/wiki/Virtual_address_space )。基本的に、各プロセスは同じアドレス値を持ちますが、実際のメモリでは異なる領域にマップされます。したがって、ハードコードされたアドレスはプロセスにのみ関係します。

少なくとも Windows で他のプロセスのメモリを調べる方法の 1 つは、ReadProcessMemoryを使用することです。PROCESS_VM_READこのページでは、読み取り元のプロセスに対する特権を持っているなどの要件を確認できます。GetLastError失敗するかどうかも確認してください。ここにちょっとした例があります。

VirtualQueryExも、 を呼び出す前に調べておくとよいことに注意してくださいReadProcessMemory

うまくいくかもしれませんし、うまくいかないかもしれませんが、他のプロセスのメモリ空間をいじるには、私が知っている最高のものです。これを達成したいなら、試してみる価値があります。

于 2012-07-05T02:36:56.307 に答える
3

すべてのプロセスには独自のメモリ空間があり、異なるプロセスの同じアドレスは異なる物理アドレスにマップされるため、そのようにすることは無意味です。

于 2012-07-05T02:35:16.070 に答える
1

Linux を使用している場合は、 を使用gdbしてプロセスにアタッチし、ある時点で Ctrl-C を押してからメモリを調べることができます。コマンドはx、だから

x 0x09D37570

そして、あなたもできるはずです

print *(int*)0x09D37570;

を使用gdbすると、プロセスの保護されたメモリ空間にいます。

オペレーティングシステムがない場合、あなたがやろうとしていることはうまくいきます。ファームウェアを開発している場合、仮想メモリ アドレスを使用せずにメモリに到達する正しい方法です。

https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html

于 2021-04-05T06:48:22.103 に答える