-3

外部で使用されていたプロセスが現在内部で使用されています。このプログラムは ReadProcessMemory を使用してメモリからデータを Char * にコピーします。以下はコードです。

char* szMemDump = (char*)malloc(mbi.RegionSize+1);
ReadProcessMemory( NULL, (unsigned long*)dwMemAddr, szMemDump, mbi.RegionSize, NULL );

私は現在、プログラム内からこれを行っています。私の目的は、RPM を使用せずにその情報を同じ配列に読み込むことです。

memcpy を試みましたが、プログラムがクラッシュするようですが、大量のメモリを読み込んでいるため、なぜこれが起こっているのかを発見するのは困難です。

memcpy(szMemDump, (void*)dwMemAddr, mbi.RegionSize);

RPM を使用するこのプログラムの代替手段には問題がなく、データを正確にスキャンできるため、memcpy が間違っているとしか思えません。

編集: 新しいコードはプロセス内で DLL としてロードされています。これにより、内部で値を読み取ることができるようになります。

更新コードを編集します。

    if( VirtualQuery((unsigned long*)dwMemAddr, &mbi, sizeof(mbi) ) == sizeof(mbi) )
    {
        if( (mbi.Protect != PAGE_NOACCESS) && (mbi.State == MEM_COMMIT) )
        {
            char* szMemDump = (char*)malloc(mbi.RegionSize+1);
            //ReadProcessMemory( NULL, (unsigned long*)dwMemAddr, szMemDump, mbi.RegionSize, NULL );
            memcpy(szMemDump, (unsigned long*)dwMemAddr, mbi.RegionSize);


            for( x=0; x<mbi.RegionSize; x++ )
            {
                //Loop actions      
            }
            free( szMemDump );
        }
    }
4

1 に答える 1

3

無効なアドレスを使用すると、ReadProcessMemory() から FALSE が返されます。チェックしないので、間違っていることに気づかないだけです。

memcpy() に無効なアドレスを使用すると、幸せな忘却は終わります。これは、間違っていることをより強制的に思い出させるためのカブームです。これは、RPM のように引数をチェックする関数ではありません。

有効なメモリ アドレスを検出するには、VirtualQuery() を使用します。また、照会したアドレスではなく、必ず MEMORY_BASIC_INFORMATION.BaseAddress を使用してください。

于 2013-09-22T20:07:09.460 に答える