- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我绕过 LoadLibraryA,以阻止该函数被调用到我的应用程序中。它旨在阻止'dll注入(inject)'。如果您从未见过这些,请引用著名的 CDetour 库。
它hook了加载库函数甚至成功返回,也阻止了未知的dll被加载到内存中。有什么建议吗?
bool ( __stdcall* LoadLibraryA ) ( LPCSTR );
bool LoadLibraryADetoured( LPCSTR szMsg )
{
if( strcmp( szMsg, "MyAllowedDll.dll" ) )
return TRUE;
return FALSE;
}
INT APIENTRY DllMain( HMODULE hModule, DWORD dwReason, LPVOID Reserved )
{
switch( dwReason )
{
case DLL_PROCESS_ATTACH:
{
DWORD dwRetAddress = (DWORD)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "LoadLibraryA" );
ZChatInput = ( bool ( __stdcall* ) ( ) )LoadLibraryA( ( PBYTE )dwRetAddress, ( PBYTE )LoadLibraryADetoured );
DisableThreadLibraryCalls( hModule );
break;
}
case DLL_THREAD_ATTACH:
case DLL_PROCESS_DETACH:
DetourRemove( ( PBYTE )dwRetAddress, ( PBYTE )LoadLibraryADetoured );
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
最佳答案
根据 MSDN,您可以在 DllMain()
中安全地执行的操作有严格的限制。 LoadLibrary()
在那里肯定不安全。
来自 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx :
Because Kernel32.dll is guaranteed to be loaded in the process address space when the entry-point function is called, calling functions in Kernel32.dll does not result in the DLL being used before its initialization code has been executed. Therefore, the entry-point function can call functions in Kernel32.dll that do not load other DLLs. For example, DllMain can create synchronization objects such as critical sections and mutexes, and use TLS. Unfortunately, there is not a comprehensive list of safe functions in Kernel32.dll.
(大胆强调是我的)
关于c++ - 绕行 LoadLibraryA 时 appcrash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164591/
我正在尝试从另一个 dll 加载一个 dll(通过 LoadLibraryA)。这是问题所在: c:\**EXE_DIR**\myExe.exe // this exe loa
我正在为 Windows 编译一个程序。 我希望它检查系统中是否存在 foo.dll,如果不存在,则打印一条错误消息并退出。这样做安全吗: 将/DELAYLOAD foo.dll标志传递给链接器; 在
我绕过 LoadLibraryA,以阻止该函数被调用到我的应用程序中。它旨在阻止'dll注入(inject)'。如果您从未见过这些,请引用著名的 CDetour 库。 它hook了加载库函数甚至成功返
我编写了一些示例程序和 DLL 来学习 DLL 注入(inject)的概念。 我将DLL注入(inject)示例程序的注入(inject)代码如下(错误处理省略): std::wstring dll(
我正在尝试像这样加载一个 dll: dll_handle = LoadLibraryA(QString("%1\\module.dll") .arg(Q
DWORD dwLoadLibrary = (DWORD)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); 当我转到
我们正在尝试使用 LoadLibraryA 函数从 64 位 dll 中加载一个 dll 库。它返回 126 错误 - 找不到模块。给函数的 dll 文件路径是正确的,我们确信。 我们已经尝试了一个虚
我已经使用 VS2008 向导创建了一个 MFCApp。在我的应用程序的“InitInstance()”中,我正在调用“LoadLibraryA()”方法,因为我需要加载一些 dll 文件。但是一旦我
所以我有一个汇编代码块,它初始化一个程序,解析 kernel32,找到 GetProcAddress,然后找到 LoadLibarayA 来加载 User32.dll。它工作到 LoadLibrary
在 vc++ 中,我有一个包含两个项目的解决方案。项目 A 有一个 dllLoader.h 和 dllLoader.cpp 用 LoadLibrary 加载一个 dll 我需要调用它在项目 B 中的功
我是一名优秀的程序员,十分优秀!