我当前已被分配编写一段代码,用于确定是否将dll列入黑名单,如果是,则不应允许加载。谷歌浏览器具有此功能,因此我检查了谷歌Chrome的代码,并看到他们维护了一系列黑名单的dll,他们从中保护自己。我尝试了一些其他的东西,比如我试图更改阻止的dll的导入表,dll的名称和许多其他东西,然后尝试将其注入chrome,但不知何故chrome能够唯一地识别被注入的dll是黑名单dll和防止它发生。
有没有人对如何实现这一点有任何想法或指示?
谢谢, 迪帕克:)
答案 0 :(得分: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);
除了Chromium的方法之外,还有许多第三方应用程序可用于加强动态库的加载,例如: Arxan GuardIT。
.Net程序集您也可以strongly-signed使用私钥,然后应用程序将只加载由此密钥签名的dll签名。