我目前被分配写一段代码,将确定一个DLL是否被列入黑名单,如果是的话,它不应该被允许加载。 谷歌浏览器有这个function,所以我检查了谷歌浏览器的代码,并看到他们维护一系列黑名单的dll,他们从中保护自己。 我尝试了一些其他的东西,我试图改变被阻止的DLL的导入表,名称的DLL和许多其他的东西,然后试图注入铬,但不知何故铬能够唯一确定被注入的DLL是一个黑名单的DLL和防止它发生。
有没有人有任何想法或指针,如何可以实现?
谢谢,迪帕克:)
我会假设他们保持白名单,而不是一个黑名单,这就是为什么你修改程序集仍然不会导致DLL加载。
编辑:从你的评论,这其实并非如此! 它看起来像他们维护一个黑名单,并做一些神秘的NtMapViewOfSection 调用 ,以防止DLL加载(这让我感谢,我永远不必使用Windows API):
#if定义(_WIN64) //在当前进程中截取NtMapViewOfSection。 //不应该直接调用它。 这个功能提供了手段 //检测正在加载的dll,所以如果需要的话我们可以修补它们。 SANDBOX_INTERCEPT NTSTATUS WINAPI BlNtMapViewOfSection64( HANDLE部分,HANDLE进程,PVOID * base,ULONG_PTR zero_bits, SIZE_T commit_size,PLARGE_INTEGER偏移,PSIZE_T view_size, SECTION_INHERIT继承,ULONG allocation_type,ULONG保护); #万一
//用我们的补丁版本替换默认的NtMapViewOfSection。 #if定义(_WIN64) NTSTATUS ret = thunk-> Setup(:: GetmoduleeHandle(sandbox :: kNtdllName), 的reinterpret_cast(&__基址), “NtMapViewOfSection” 空值, &黑名单:: BlNtMapViewOfSection64, thunk_storage, 的sizeof(沙箱:: ThunkData) 空值);
除了Chromium的方法外,还有一些第三方应用程序可以加强动态库的加载,例如Arxan GuardIT 。
.Net程序集也可以使用私钥进行强力签名 ,然后应用程序将仅加载由此密钥签名的dll签名。