2011-07-05 53 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