2

C でメモリ スキャナーを作成する方法に関するこの簡単なチュートリアルに従っています。

ここにコードがあります

MEMBLOCK* create_scan(unsigned int pid){

    MEMBLOCK *mb_list = NULL;
    MEMORY_BASIC_INFORMATION meminfo;   
    unsigned char *addr = 0;

    HANDLE hProc = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);

    if(hProc){
        while(1){
            // print the address for debug purpose
            printf("%d \r\n", addr);

            // loop should break out when the address overflows (return 0)
            if(VirtualQueryEx (hProc, addr, &meminfo, sizeof(meminfo)) == 0){
                break;
            }

 #define WRITABLE (PAGE_READWRITE | PAGE_WRITECOPY |PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)
            if ((meminfo.State & MEM_COMMIT) && (meminfo.Protect & WRITABLE)){
                MEMBLOCK *mb = create_memblock (hProc, &meminfo);
                if(mb){
                    mb->next = mb_list;
                    mb_list = mb;
                }
            }

            addr = (unsigned char*)meminfo.BaseAddress + meminfo.RegionSize;
        }
    }
    return mb_list;
}

何らかの理由で出力(printf)はこれです

123863040
125943808
... until ...
2147418112
... all on the sudden ...
-1207959552
... 
-243924992
0
65536
loop start again

どんなアイデアでも、私はちょっと迷っています!

4

1 に答える 1

1

VirtualQueryEx() からの戻り値は、データで満たされた構造体のサイズです。エラーがない限り、ゼロは返されません。

負の値は 2GB を超えるアドレスであり、printf() で負の数として解釈されます。4GB を超えると、0 に戻ります。0 は初期値であり、最初は機能していたので、最初からやり直します。

ループを終了するには、別の基準が必要です。

%d の代わりに %p を使用して、現在のアドレスを出力することもできます。

于 2012-12-14T23:58:36.570 に答える