我们的思路是写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 <stdio.h>
#include <windows.h>
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;
}
当没有劫持的时候,运行的结果是这样的
当劫持之后,结果是这样的
然后我们用火绒剑见识一下,看看动态链接库的加载过程
我们设置好过滤条件
观察
确实是先调用了我们自己的a.dll(hijack.dll),然后在转发的时候又调用了b.dll(原来真正的a.dll)
参考文章
《WindowsPE权威指南》