实验七——DLL劫持病毒的分析和清除

【实验名称】 DLL劫持病毒的分析和清除
【实验目的】

掌握DLL劫持的原理
了解DLL劫持攻击的防御办法
【实验原理】
Windows2000之后的系统,将强制PE加载器首先在应用程序所在目录中搜索要加载的DLL,如果搜索不到才搜索其他目录。PE加载搜索DLL路径顺序由注册表中的键值决定,注册表路径如下:HKLM\System\CurrentControlSet\Control\Session Manager,中的SafeDllSearchMode键。
SafeDllSearchMode=1,搜索顺序为
1)应用程序所在目录
2)系统目录,GetSystemDirectory获取
3)16位系统目录
4)Windows目录,用GetWindowsDirectory获取
5)运行程序的当前目录
6)Path环境变量
SafeDllSearchMode=0,搜索顺序为
1)应用程序所在目录
2)运行程序的当前目录
3)系统目录,GetSystemDirectory获取
4)16位系统目录
5)Windows目录,用GetWindowsDirectory获取
6)Path环境变量

【实验内容】
回答问题
1)VC 6.0中,如何编写及调用Dll文件。
2)按照实验步骤,并思考如下问题。
【实验步骤】
一、观察DLL文件的加载路径

(1)使用VC6.0 新建一个简单的动态链接库工程LpkDll
在这里插入图片描述

新建LpkDll.cpp:

#include <Windows.h>
#include <tchar.h>
HANDLE g_hModule = NULL;
extern "C" __declspec(dllexport) void Test()
{
    
    
	TCHAR tcModulePath[MAX_PATH] = {
    
    0};
	GetModuleFileName((HMODULE)g_hModule,tcModulePath,MAX_PATH);
	MessageBox(0,tcModulePath,_T("LpkDLL的加载路径"),0);
}

BOOL APIENTRY DLLMain(HANDLE hModule,DWORD ul_resaon_for_call,LPVOID lpReserved)
{
    
    
	g_hModule = hModule;
	return TRUE;
}

在这里插入图片描述

编译连接后会生成LpkDll.dll 和 LpkDll.lib:
在这里插入图片描述

(2) 新建一个控制台工程LoadDll
在这里插入图片描述

新建LpkDll.cpp:

//#include "stdafx.h"
#pragma comment(lib,"LpkDll.lib")
extern "C" void Test();

int main(int argc, char* argv[])
{
    
    
	Test();
	return 0;
}

在这里插入图片描述

修改控制台工程LoadDll的配置:“工程”->“配置”->“链接选项卡”->“对象/库模块”中添加“LpkDll.lib”
在这里插入图片描述

此外,将LpkDll.lib放在LoadDll文件夹中。
在这里插入图片描述

扫描二维码关注公众号,回复: 11957161 查看本文章

(3)在D盘中新建test文件夹,将LoadDll.exe 和LpkDll.dll 放在文件夹D:\test中。运行“LoadDll.exe”,观察程序弹出窗口显示的LpkDll的加载路径D:\test\LoadDll.dll。使用IceSword查看LoadDll.exe调用LpkDll.dll的路径是D:\test\LpkDll.dll
IceSword->进程->单击鼠标右键
在这里插入图片描述

(4)将LpkDll.dll放在系统文件夹C:\windows\system32中,同时删除D:\test中 的LpkDll.dll 文件。运行“LoadDll.exe”,观察程序弹出窗口显示的LpkDll的加载路径C:\WINDOWS\system32\LpkDll.dll。使用IceSword查看LoadDll.exe调用LpkDll.dll的路径是C:\WINDOWS\system32\LpkDll.dll
在这里插入图片描述

(5)LpkDll.dll复制到D:\test中,使得LoadDll.exe所在的文件夹D:\test和系统文件夹C:\windows\system32,同时包含LpkDll.dll。运行“LoadDll.exe”,观察程序弹出窗口显示的LpkDll的加载路径D:\test\LoadDll.dll。使用IceSword查看LoadDll.exe调用LpkDll.dll的路径是D:\test\LoadDll.dll
在这里插入图片描述

问题1:你可以得出实验平台使用的windows 2003 server系统在加载DLL文件时,对路径的搜索顺序是怎样的?

a. 应用程序所在目录; b. 当前目录。GetCurrentDirectory返回的目录; c. 系统目录。
GetSystemDirectory 返回的目录,通常是系统盘\Windows\System32; d.
16位系统目录。该项只是为了向前兼容的处理,可以不考虑; e. Windows目录。 GetWindowsDirectory
返回的目录,通常是系统盘 \Windows ; f. 环境变量PATH中所有目录。

二、了解DLL劫持原理
(1)再次新建一个动态链接库工程LpkDll,定义一个函数指针保存原始LpkDll导出函数的地址。编译得到新的LpkDll.dll
在这里插入图片描述

(2)在C:\windows\system32保存原始LpkDll.dll,将新的LpkDll.dll及LoadDll.exe放在D:\test文件夹中。运行“LoadDll.exe”,使用IceSword查看LoadDll.exe调用LpkDll.dll的路径是D:\test\LoadDll.dll和C:\WINDOWS\system32\LpkDll.dll
在这里插入图片描述

问题2:请解释为什么LoadDll.exe会调用这个路径的LpkDll.dll?

答:因为新建的LpkDll.dll的程序中仍包含着一个函数指针保存原
始LpkDII导出函数的地址,所以LoadDll.exe先找到当前目录下的D:\test\LoadDll.dll,再由D:\test\LoadDll.dll调用C:\WINDOWS\system32\LpkDll.dll,即先调用新的放在D:\test文件夹中的LpkDll.dll,再调用原始的LpkDll.dll文件的路径。

三、DLL劫持攻击的防御
(1)在注册表HKLM\System\CurrentControlSet\Control\Session Manager\KnowDlls 中, 新建字符串项“lpkdll”,该数据项的值记为:“lpkdll.dll” 。重启电脑
在这里插入图片描述

(2)在C:\windows\system32保存原始LpkDll.dll,将新的 LpkDll.dll及LoadDll.exe放在D:\test文件夹中。运行“LoadDll.exe”, 使用IceSword查看LoadDll.exe调用LpkDll.dll的路径是 C:\WINDOWS\system32\LpkDll.dll
在这里插入图片描述

问题3:请总结预防DLL劫持攻击的方法。

在注册表中更改dll文件的加载顺序,让exe文件优先加载C:\WINDOWS\system32\下的dll文件,从而防止被与exe程序同文件夹下的dll劫持,防止exe文件运行同文件夹下同名的dll恶意文件。

1)《课8-实验步骤.doc》中出现三段代码的功能分别是什么?

第一段:创建一个动态链接库工程,并弹窗显示该工程的加载路径。
第二段:创建一个控制台,并连接之前编译的静态数据连接库LpkDll.lib,使得运行“LoadDll.exe”时可以调用编译好的动态链接库的LpkDll.lib。
第三段:创建一个动态链接库工程:将之前编译好的动态链接库LpkDll.dll文件的导出函数的地址保存在一个指针中。再将这个动态链接库编译得到新的同名的LpkDll.dll文件,当程序调用这个dll文件时,会再调用原来的LpkDll.dll文件。

2)你可以得出实验平台使用的windows 2003 server系统在加载DLL文件时,对路径的搜索顺序是怎样的?

a. 应用程序所在目录; b. 当前目录。GetCurrentDirectory返回的目录; c. 系统目录。
GetSystemDirectory 返回的目录,通常是系统盘\Windows\System32; d.
16位系统目录。该项只是为了向前兼容的处理,可以不考虑; e. Windows目录。 GetWindowsDirectory
返回的目录,通常是系统盘 \Windows ; f. 环境变量PATH中所有目录。

3)请解释为什么LoadDll.exe会调用这个路径的LpkDll.dll?

答:因为新建的LpkDll.dll的程序中仍包含着一个函数指针保存原
始LpkDII导出函数的地址,所以LoadDll.exe先找到当前目录下的D:\test\LoadDll.dll,再由D:\test\LoadDll.dll调用C:\WINDOWS\system32\LpkDll.dll,即先调用新的放在D:\test文件夹中的LpkDll.dll,再调用原始的LpkDll.dll文件的路径。

4)请总结预防DLL劫持攻击的方法。

在注册表中更改dll文件的加载顺序,让exe文件优先加载C:\WINDOWS\system32\下的dll文件,从而防止被与exe程序同文件夹下的dll劫持,防止exe文件运行同文件夹下同名的dll恶意文件。

猜你喜欢

转载自blog.csdn.net/Onlyone_1314/article/details/108818379
今日推荐