使用AheadLib生成DLL劫持代码

程序加载DLL会有一个优先级顺序,其中,最先加载的是同一目录下的DLL,DLL劫持的原理是在程序的同目录下放一个自己写的DLL,让程序将我们伪造的DLL加载进去,然后在我们的DLL里调用真正DLL的函数。

借助 AheadLib 工具我们可以很方便的伪造DLL。比如,我们想劫持user32.dll,只需将user32.dll的路径填入,然后生成CPP代码。

使用AheadLib生成DLL劫持代码_第1张图片
看一下生成的代码,由于user32.dll里面函数很多,有1213个,所以代码非常长。
使用AheadLib生成DLL劫持代码_第2张图片

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

使用AheadLib生成DLL劫持代码_第3张图片
我们可以在DllMain里添加想要的功能。

使用AheadLib生成DLL劫持代码_第4张图片
注意,如果我们的程序是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就会失败。

你可能感兴趣的:(WINDOWS逆向,Windows)