1

現在、C++ を使用してメモリ修飾子アプリケーションを再作成しています。元は C# でした。

すべての功績は、私が YouTube でフォローしているチュートリアルの "gimmeamilk" にあります (ビデオ 1/8)。同様のアプリケーションを作成しようとしている人には、これらのチュートリアルを強くお勧めします。

私が抱えている問題は、VirtualQueryEx が永久に実行されているように見えることです。スキャンしているプロセスは「notepad.exe」で、コマンド ライン パラメータを介してアプリケーションに渡しています。

std::cout<<"Create scan started\n";
#define WRITABLE (PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) //These are all the flags that will be used to determin if a memory block is writable.
MEMBLOCK * mb_list = NULL;          //pointer to the head of the link list to be returned
MEMORY_BASIC_INFORMATION meminfo;   //holder for the VirtualQueryEx return struct
unsigned char *addr = 0;            //holds the value to pass to VirtualQueryEx

HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS,false, pid);
if(hProc) 
{
    while(1)
    {
        if(VirtualQueryEx(hProc,addr, &meminfo, sizeof(meminfo)) == 0) 
        {
            break;
        }


        if((meminfo.State & MEM_COMMIT) && (meminfo.Protect & WRITABLE)) //((binary comparison of meminfos state and MEM_COMMIT, this is basically filtering out memory that the process has reserved but not used)())
        {
            MEMBLOCK * mb = create_memblock(hProc, &meminfo);
            if(mb)
            {
                mb->next = mb_list;
                mb_list = mb;
            }
        }
        addr = (unsigned char *)meminfo.BaseAddress + meminfo.RegionSize;//move the adress along by adding on the length of the current block

    }
}
else
{
    std::cout<<"Failed to open process\n";
}
std::cout<<"Create scan finished\n";

return mb_list;

このコードの出力は、次のようになります。

Create scan started on process:7228

その後、コンソールには何も返されません。残念ながら、YouTube ビデオ経由でリンクされているサンプル ソース コードは利用できなくなりました。(7228 は、notepad.exe の現在の pid に基づいて変更されます)

@Hans Passantの質問への編集返信 まだ理解できません。私がやっていることは

Starting a infinite loop
{
   Testing using vqx if the address is valid and populating my MEM_BASIC_etc..
   {
        (has the process commited to using that addr of memory)(is the memory writeable)
        {
            create memblock etc
        } 
   }
   move the address along by the size of the current block
}

私のプログラムはx32で、メモ帳もそうです(私が知る限り)。

私の問題は、x64 ビット OS を使用しているため、実際にブロックの半分 (ここではメモリ内の OS によって割り当てられたユニットを意味するブロック) を検査していて、それが原因でループしていることですか?

助けてくれてありがとう!私は自分の問題を理解し、それを修正したいと思っています。

4

1 に答える 1