无法写入进程内存

时间:2013-11-08 12:57:27

标签: winapi shared-memory createprocess

我正在尝试修复我不熟悉的代码中的问题。我已经跟踪它以调用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位进程。

1 个答案:

答案 0 :(得分:0)

在尝试写入另一个进程之前,您正在执行本地VirtualQuery,该进程的地址空间可能大不相同。

如果你想确保在该进程的地址空间中有一个有效的指针,你要么找到那个进程放置你感兴趣的地方(祝ASLR好运),要么在那个进程中为你分配一些内存(用,说VirtualAllocEx())。

注意:如果您确实需要共享内存,则应使用CreateFileMapping(INVALID_HANDLE_VALUE)。