c++ - 挂钩 LoadLibrary,如何检索有关正在加载的文件名的信息?
问题描述
我正在学习挂钩,并决定尝试挂钩 Win32 API 函数LoadLibraryA
,以查看是否有东西通过CreateRemoteThread
and注入 DLL LoadLibrary
。我正在连接我自己想要保护的控制台应用程序。
我能够检测到我的应用程序的进程空间内的某些东西正在调用LoadLibrary
,但是我如何找到有关已加载内容的更多信息?例如,我可以获取 DLL 路径和名称吗?
定义 LoadLibrary 的原型:
typedef HMODULE(__stdcall* LoadLibraryType) (LPCSTR fileName);
实例化 LoadLibraryType:
static LoadLibraryType loadlib;
拦截呼叫的功能:
HMODULE __stdcall LoadLibraryHook(LPCSTR fileName) {
printf("\nLoadLibraryA has been called !!!\n");
return loadlib(fileName);
}
InitializeLoadLibraryCheck()
将从主函数调用。
void InitializeLoadLibraryCheck()
{
HMODULE moduleHandle = LoadLibraryA("kernel32.dll");
LoadLibraryType realFuncAddy = (LoadLibraryType)GetProcAddress(moduleHandle, "LoadLibraryA");
loadlib = (LoadLibraryType)(CUtils::DetourFunc((PBYTE) realFuncAddy, (PBYTE) LoadLibraryHook, 5));
DWORD dwOld = 0;
BOOL bProtectRet = VirtualProtect(loadlib, 5, PAGE_EXECUTE_READWRITE, &dwOld);
}
编辑:忘记添加绕行功能:
PVOID CUtils::DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)malloc(len + 5);
DWORD dwback;
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
memcpy(jmp, src, len);
jmp += len;
jmp[0] = 0xE9;
//relative address from trampoline to orig function + 5
*(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src + 1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
//address to trampoline
return (jmp - len);
}
解决方案
如何找到有关已加载内容的更多信息?例如,我可以获取 DLL 路径和名称吗?
只需使用fileName
给定的参数。这是正在加载的 DLL 的路径,例如:
HMODULE __stdcall LoadLibraryHook(LPCSTR fileName) {
printf("\nLoadLibraryA has been called !!!\nfileName: %s\n", fileName);
return loadlib(fileName);
}
推荐阅读
- vue.js - 如何在共享主机上部署 nuxt.js 项目?
- python - 在 QQuickView 源代码中重新加载 qml
- java - 如何从字符串为唯一索引数据库列创建哈希?
- java - 我想从 firestore 检索当前登录的用户数据,但它在我想显示我的数据的地方显示为空白
- facebook - 自动发布到 Facebook 群组,来自 Graph API 的错误
- java - Java静态初始化器引用子类:避免类加载死锁
- assembly - 从 C 调用 x86 程序集中的 NASM 浮点数
- java - 列表的含义
> 附近地点列表 - java - Webview 改变高度大小
- saml - 本地 ADFS 的替代方案