2016-04-06 81 views
2

我目前被分配寫一段代碼來確定一個dll是否被列入黑名單,如果是的話,它不應該被允許加載。谷歌瀏覽器具有這種功能,所以我查了谷歌瀏覽器的代碼,並看到他們維護一系列黑名單的dll,從中保護自己。我嘗試了一些其他的東西,比如我試圖改變被阻止的dll的導入表,dll的名稱以及其他許多東西,然後嘗試將它注入到chrome中,但不知何故chrome能夠唯一地識別出被注入的dll是一個黑名單的dll,防止它發生。如何使用Blackllist /通過唯一標識dll來阻止dll注入?

有沒有人有任何想法或指針,如何可以實現?

謝謝, 迪帕克:)

+1

可能的重複[防止DLL注入從DLL C++](http://stackoverflow.com/questions/9450372/prevent-dll-injection-from-an-dll-c) – RJFalconer

回答

2

我會認爲他們保持一個白名單,而不是黑名單,這就是爲什麼你修改組件仍沒有引起DLL加載。

編輯:從您的評論,這其實並非如此! 看起來他們保持一個黑名單,並做一些arcane invocation NtMapViewOfSection,以防止DLL加載(這讓我感激我從來沒有使用Windows API):

 
#if defined(_WIN64) 
// Interception of NtMapViewOfSection within the current process. 
// It should never be called directly. This function provides the means to 
// detect dlls being loaded, so we can patch them if needed. 
SANDBOX_INTERCEPT NTSTATUS WINAPI BlNtMapViewOfSection64(
    HANDLE section, HANDLE process, PVOID *base, ULONG_PTR zero_bits, 
    SIZE_T commit_size, PLARGE_INTEGER offset, PSIZE_T view_size, 
    SECTION_INHERIT inherit, ULONG allocation_type, ULONG protect); 
#endif 
 
// Replace the default NtMapViewOfSection with our patched version. 
#if defined(_WIN64) 
    NTSTATUS ret = thunk->Setup(::GetModuleHandle(sandbox::kNtdllName), 
           reinterpret_cast(&__ImageBase), 
           "NtMapViewOfSection", 
           NULL, 
           &blacklist::BlNtMapViewOfSection64, 
           thunk_storage, 
           sizeof(sandbox::ThunkData), 
           NULL); 

比鉻的做法其他還有一些第三方應用程序存在以加強動態庫的加載,例如Arxan GuardIT

.Net程序集也可以用私鑰加密strongly-signed,那麼應用程序將只加載由此密鑰簽名的dll簽名。

+0

沒有他們不維護白名單。我檢查了https://code.google.com/p/chromium/codesearch#chromium/src/chrome_elf/blacklist/blacklist.cc&l=24。他們可以以某種方式確定一個黑名單的DLL,即使修改後... –

+0

所以粗略看看你自己的鏈接顯示,這個神奇的是在這個NtMapViewOfSection Windows函數。我不是一個winapi開發者,所以不能評論爲什麼這個工作,但這就是他們正在做的。如果你想進一步挖掘,我已經添加了相關的代碼片段來回答。 – RJFalconer