0

よく知らないコードの問題を修正しようとしています。私はそれを追跡して、WriteProcessMemory を呼び出すと常にERROR_INVALID_ADDRESS. 失敗する理由がわかりません。自分のプロセスが子プロセスに書き込むために必要なアクセス権を持っているかどうかを確認しようとしましたが、VirtualQUeryそうです。誰でもこれに光を当てることができますか?コード パスは非常に複雑なので、多くをスキップしました。抜けている情報があれば教えてください。

CreateProcessAsUserW(hToken, exe, cmd_line, 
NULL, // No security attribute.
NULL, // No thread attribute.
false, // do not inherit handles
CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT | DETACHED_PROCESS | EXTENDED_STARTUPINFO_PRESENT | CREATE_BREAKAWAY_FROM_JOB, // start suspended, extended startup info, break out of job
NULL, // Use the environment of the caller
NULL, // Use current directory of the caller.
&si, 
&pi);

/*
 ....lots of work here
*/

void* address = {...};
void* var = address;   // note this line

SIZE_T written;
if(!WriteProcessMemory( pi.handle, 
var, address,  // not completely sure what it is doing here - writing contents of address to address of var?
size, &written))
{
    DWORD error = GetLastError();     // ERROR_INVALID_ADDRESS
    MEMORY_BASIC_INFORMATION buffer;
    SIZE_T num = VirtualQuery(address,&buffer,sizeof(MEMORY_BASIC_INFORMATION));
    if(num > 0)
    {
        DWORD access = buffer.AllocationProtect;  // PAGE_EXECUTE_WRITECOPY
        DWORD state = buffer.State; // MEM_COMMIT
        DWORD type = buffer.Type;
    }
}

これは、64 ビット Win7 で実行される 32 ビット プロセスです。

4

1 に答える 1

0

アドレス空間が大きく異なる可能性がある別のプロセスに書き込もうとする前に、ローカルの VirtualQuery を実行しています。

そのプロセスのアドレス空間に有効なポインターを確実に保持したい場合は、そのプロセスが興味のあるものを配置する場所を見つけるか (ASLR で頑張ってください)、そのプロセス内でメモリを割り当てます (たとえば、VirtualAllocEx( を使用) )))。

注: 実際に共有メモリが必要な場合は、代わりに CreateFileMapping(INVALID_HANDLE_VALUE) を使用する必要があります。

于 2013-11-08T13:12:26.847 に答える