よく知らないコードの問題を修正しようとしています。私はそれを追跡して、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 ビット プロセスです。