2016-02-28 134 views
1

美好的一天,我試圖以某種方式阻止「dll注入」進入我的程序。 這是我到目前爲止,但它崩潰我的.exe出於某種原因。 我正在加載此代碼,並將.dll附加到我的程序。C++ VirtualProtect PAGE_NOACCESS導致崩潰

聲明:

LPBYTE _LdrLoadDll = (LPBYTE)GetProcAddress(GetModuleHandle("ntdll.dll"), "LdrLoadDll"); 

功能:

void HookNoAccess(LPVOID Offset, int size) 
    { 
     HMODULE hand = GetModuleHandle("MYPROGRAM.exe"); 
     DWORD OldProtect; 
     VirtualProtect(Offset, size, PAGE_NOACCESS, &OldProtect); 
     VirtualProtect((LPVOID)((DWORD)hand + (DWORD)0x12d1), 6, PAGE_NOACCESS, &OldProtect); 
    } 

稱之爲:

HookNoAccess(_LdrLoadDll, 2); // tried any size... 

應該停止訪問,目前procccess,但爲什麼它崩潰...

有人可以幫我嗎?

+0

有權注入代碼的攻擊者也有權修復頁面訪問標誌。 –

回答

0

鑑於LdrLoadDll是一個未公開的函數,我不確定它是幹什麼用的,它是如何工作的,或者它在內部使用的地方,但是我懷疑如果你能夠完全阻塞它,因爲它可能是Windows本身用來將DLL加載到你的進程中的…

除此之外,VirtualProtect影響全部包含指定範圍的一個或多個字節的頁面。換句話說,它提供的保護粒度就是頁面的粒度。如果您不小心避免其他內存塊位於同一頁面上,則嘗試訪問它們時會崩潰。

最後,那第二次致電VirtualProtect的是極其嫌疑人。你將硬編碼作爲地址偏移量的價值是什麼?和上面提到的相同的問題:VirtualProtect提供的保護的粒度是頁面的。一個頁面是4k字節(一般來說),所以即使只指定了6個字節的大小,對於包含至少部分應用程序可執行代碼的整個4k頁面,您也可以設置爲PAGE_NOACCESS

真的,你只應該在你自己分配的內存塊上使用VirtualProtect或者VirtualAllocVirtualAllocEx。除此之外,更改內存塊的保護級別超出了你的控制範圍,只是在尋求麻煩。

+0

謝謝@Cody Gray,但我很困惑。我不能給你這段代碼的答案......我所知道的是,我需要以某種方式停止dll注入...我已經嘗試使用相同的方法從kernel32.dll中LoadLibrary,但它會崩潰。 。 –