2011-07-05 31 views
0

我分配了一些空间,写了一些asm并试图在那一刻开始一个线程。 但我不断收到访问冲突。它假设推四个0并调用messageboxa函数。但是在区域地址,它会发生访问违规。 如何让它像普通代码一样运行?C++动态线程

void test2() 
{ 
    byte* area; 
    HANDLE process; 

    area = new byte[1024]; 

    for(int i = 0; i < 1024; i++) 
     area[i] = 0; 

    memmove((char*)area, "\x6a\x00\x6a\x00\x6a\x00\x6a\x00\xE8", 9); 

    *(DWORD*)&area[9] = ((DWORD)GetProcAddress(GetModuleHandle("User32.dll"), "MessageBoxA") - (DWORD)&area[9] - 4); 

    memmove((char*)&area[13], "\x33\xc0\xc3", 3); 

    VirtualProtect(area, 17, PAGE_EXECUTE_READWRITE, 0); 

    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)area, 0, 0, 0); 
} 

这里的拆卸 http://screensnapr.com/v/P33NsH.png

+0

也许试试'PAGE_EXECUTE_READ'。 –

+0

您能从获得访问冲突的地方获得堆栈跟踪吗?它是在汇编代码中,还是在调用CreateThread的时候? –

+0

它来自第一次推送的地址,而不是来自创建线程的调用 – Drake

回答

1

VirtualProtect()调用不会在这种情况下,做任何事情的屏幕截图:它只是失败,因为它预计,第四个参数是一个有效的指针的存储区域它会接收到以前的访问保护标志(以便以后可以恢复)。所以,CPU拒绝执行这个页面,并在第一条指令中获得GPF。

您还需要使用PAGE_EXECUTE_READ作为标志,否则第一次堆操作(甚至读访问堆中的任何其他变量,碰巧碰到同一页)将生成GPF。或者,使用VirtualAlloc(),而不是在堆上分配。

请注意,我没有检查代码的其余部分,因此可能还有其他一些问题。另外请注意,这不是编写汇编的方式,除非你正在编写一个漏洞(与VirtualProtect()混淆是一个肯定的迹象)。这是为了希望我对于这个漏洞的假设是错误的。

+0

它不是一个漏洞利用,而是一个快捷方式,它可以让我更快地完成其他任务。也谢谢,我确实知道这是最后一个参数。 – Drake