0

プロセスの特権をプログラムで調整して、後で子プロセスを作成した場合に、そのプロセスのメモリへの書き込みアクセスを常に (絶対に) 持つようにすることはできますか?

2 つの異なるプロセスによってロードされる dll を作成しました。コードのある時点で、プロセスを作成します。どのプロセスが自分の dll をロードするかに応じて、子プロセスのメモリを持っているPAGE_EXECUTE_WRITECOPY0、子プロセスのメモリにアクセスすることがわかりました。私の推測では、どちらのプロセスでも別のことをしていないため、ロード プロセスがこの動作につながる制限を課したに違いありません。でプロセスのセキュリティ情報を調べましたProcess Explorerが、両者の間に違いは見当たりませんでした。このhToken値は、API を呼び出す呼び出し元によって提供されます。こいつが原因か。そうであるかどうかを確認するためにどのようにテストできますか?

CreateProcessAsUserW(hToken, exe, cmd_line, NULL, NULL, 
    false,
    CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT | DETACHED_PROCESS | EXTENDED_STARTUPINFO_PRESENT | CREATE_BREAKAWAY_FROM_JOB,
    NULL, NULL, 
    &si, &pi);

MEMORY_BASIC_INFORMATION buffer;
// 'address' is some valid address
SIZE_T num = VirtualQueryEx(pi.hProcess_handle, address,&buffer,sizeof(MEMORY_BASIC_INFORMATION)); 
if(num > 0)
{
        DWORD access = buffer.AllocationProtect;  // 0x0 or 0x80 depending on which process loads dll 
        DWORD state = buffer.State;
        DWORD type = buffer.Type;
 }
4

1 に答える 1

0

メモリの各ページのメモリ保護定数は、継承されているかどうかにかかわらず、ハンドルとは関係ありません。

VirtualQuery を呼び出すには、特定のプロセス アクセス権が必要です。それらがない場合、VirtualQueryEx は失敗します。

0 は AllocationProtect の有効な値ではありません。したがって、問題の原因は、アドレスが間違っているか、必要なプロセス アクセス権がないために VirtualQuery が失敗していることだと思います。

于 2020-05-17T01:07:19.690 に答える