DLL劫持
March 15, 2021 C语言 访问: 64 次
DLL
开发环境:Microsoft Visual Studio Professional 2019
Windows 10
编写Dll文件
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <windows.h>
void msg() {
MessageBox(0, L"Dll-1 load succeed!", 0, 0);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)// 根据调用原因选择不不同的加载方式
{
case DLL_PROCESS_ATTACH:// DLL被某个程序加载
msg();
break;
case DLL_THREAD_ATTACH:// DLL被某个线程加载
case DLL_THREAD_DETACH:// DLL被某个线程卸载
case DLL_PROCESS_DETACH: //DLL被某个程序卸载
break;
}
return TRUE;
}
调用DLL
#include<stdio.h>
#include<Windows.h>
int main()
{
typedef void(*DLLFUNC)(void); // 定义一个函数类DLLFUNC
DLLFUNC GetDllfunc = NULL;
printf("hello world!");
HINSTANCE hinst = LoadLibrary(L"C:\\Users\\radish\\Desktop\\dll\\Dll1\\Debug\\Dll1.dll");
printf("done!");
return 0;
}c
DLL设置导出函数
在头文件中的framework.h
中添加:
extern "C" __declspec(dllexport) void msg(void);
然后重新生成解决方案
然后用PE tools
查看就可以看到msg
函数已经导出
调用DLL导出的函数
#include<stdio.h>
#include<Windows.h>
int main()
{
typedef void(*DLLFUNC)(void); // 定义一个函数类DLLFUNC
DLLFUNC GetDllfunc = NULL;
printf("hello world!");
HINSTANCE hinst = LoadLibrary(L".\\Dll1.dll");
GetDllfunc = (DLLFUNC)GetProcAddress(hinst, "msg");//获取函数地址
(*GetDllfunc)();//运行msg函数
printf("done!");
return 0;
}
运行会发现弹窗是执行两次的,一次是载入dll的时候自动执行,另一次是直接调用了msg函数
转发式劫持DLL
DLL1源码:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
void msg() {//将此函数设置为导出函数
MessageBox(0, L"good", 0, 0);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DLL2源码:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
// 头文件
#include <Windows.h>
// 导出函数,此处是这是导出函数转发到哪个函数
#pragma comment(linker, "/EXPORT:msg=Dll1Org.msg,@1")
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
MessageBox(NULL, L"hi,hacker, inserted function runing", L"hi", MB_OK);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
}
DLL2源码可由
AheadLib
生成
调用DLL源码:
#include<stdio.h>
#include<Windows.h>
int main()
{
typedef void(*DLLFUNC)(void); // 定义一个函数类DLLFUNC
DLLFUNC GetDllfunc = NULL;
printf("hello world!");
HINSTANCE hinst = LoadLibrary(L".\\Dll1.dll");
GetDllfunc = (DLLFUNC)GetProcAddress(hinst, "msg");//获取函数地址
(*GetDllfunc)();//运行msg函数
printf("done!");
return 0;
}
将以上三个项目生成的文件放到一个文件夹下
然后运行call.exe
,就会出现先弹窗hi,hacker, inserted function runing
,然后弹窗good