测试DLL劫持

我们的思路是写1个exe,2个dll
分别是
    testDLL劫持.exe
    a.dll
    hijack.dll

testDll劫持.exe 动态加载 a.dll,然后调用里面的Add()函数,我们将 a.dll 改名为b.dll 然后将 hijack.dll 改名为 a.dll,放在同一目录下,这样的话,testDll劫持.exe调用a.dll的时候就会调用我们写的dll了,然后当用到Add()函数的时候,我们再在hijack.dll(为了让程序加载,已经改名为a.dll) 中加载原来真正的a.dll (已经改名为b.dll),然后进行转发就可以了

下面附上源码和测试过程

//***********testDll劫持.exe*********************
//testDll劫持.cpp
#include 
#include 


typedef int(*PADD)(int a, int b);

int main()
{
	HMODULE hadll = LoadLibrary("a.dll");		
	if (hadll != NULL)//成功加载模块
	{
		printf("a.dll加载成功!\n");
		PADD _add = (PADD)GetProcAddress(hadll, "Add");
		if (_add != NULL)	//成功获取函数地址
		{
			printf("成功获取了Add函数的地址!\n");
			printf("相加的数字是 ---->%d\n", _add(3, 4));
		}
		FreeLibrary(hadll);
	}

	getchar();
	return 0;
}
//********************hijack.dll*************************

//hijack.h
#pragma once
extern "C" __declspec(dllexport) int Add(int a, int b);

//hijack.cpp
#include "stdafx.h"
#include "hijack.h"
typedef int(*PADD)(int a, int b);

int Add(int a, int b)
{
	HMODULE hDll = LoadLibrary("b.dll");
	if (hDll != NULL)
	{
		PADD _add = (PADD)GetProcAddress(hDll, "Add");
		if (_add != NULL)
		{
			printf("你被劫持了!\n");
			/*
			干自己想干的事情~~~~~~~~~~~~~~~~~~~~~~~~~
			*/
			return _add(a, b);
		}
		FreeLibrary(hDll);

	}
	return 0;
}
//*********************a.dll*****************************
//a.h
#pragma once
extern "C" __declspec(dllexport) int Add(int a, int b);

//a.cpp
#include "stdafx.h"
#include "a.h"

int Add(int a, int b)
{
	return a + b;
}

当没有劫持的时候,运行的结果是这样的
测试DLL劫持_第1张图片
测试DLL劫持_第2张图片
当劫持之后,结果是这样的
测试DLL劫持_第3张图片
测试DLL劫持_第4张图片

然后我们用火绒剑见识一下,看看动态链接库的加载过程
我们设置好过滤条件
测试DLL劫持_第5张图片
观察
测试DLL劫持_第6张图片
确实是先调用了我们自己的a.dll(hijack.dll),然后在转发的时候又调用了b.dll(原来真正的a.dll)

参考文章
《WindowsPE权威指南》

你可能感兴趣的:(PE)