程序加载DLL会有一个优先级顺序,其中,最先加载的是同一目录下的DLL,DLL劫持的原理是在程序的同目录下放一个自己写的DLL,让程序将我们伪造的DLL加载进去,然后在我们的DLL里调用真正DLL的函数。
借助 AheadLib 工具我们可以很方便的伪造DLL。比如,我们想劫持user32.dll,只需将user32.dll的路径填入,然后生成CPP代码。

看一下生成的代码,由于user32.dll里面函数很多,有1213个,所以代码非常长。

接下来,创建一个DLL项目,将代码放进去编译,设置项目编码为多字节字符集,关闭预编译选项,即生成了一个伪造的user32.dll。

我们可以在DllMain里添加想要的功能。

注意,如果我们的程序是32位,则要拿SysWOW64下的winspool.drv,并对Load函数代码做如下修改:
// 加载原始模块
inline BOOL WINAPI Load()
{
TCHAR tzPath[MAX_PATH];
TCHAR tzTemp[MAX_PATH * 2];
BOOL bIsWow64 = FALSE;
IsWow64Process((HANDLE)-1, &bIsWow64);
if (bIsWow64)
{
GetSystemWow64Directory(tzPath, MAX_PATH);
}
else
{
GetSystemDirectory(tzPath, MAX_PATH);
}
lstrcat(tzPath, TEXT("\\winspool.drv"));
m_hModule = LoadLibrary(tzPath);
if (m_hModule == NULL)
{
wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
}
return (m_hModule != NULL);
}
先判断当前进程32位还是64位,然后获取相应的目录。32位程序调用GetSystemDirectory,得到的是system32目录,那么HOOK就会失败。
本文介绍了DLL劫持的概念,利用 AheadLib 工具伪造DLL以实现程序加载时调用自定义功能。通过填写目标DLL路径生成CPP代码,创建DLL项目并编译,设置为多字节字符集,关闭预编译选项。在DllMain中添加自定义功能。针对32位程序,需注意判断进程类型并获取正确的目录,以避免HOOK失败。
5188





