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设置导出函数

-w375
在头文件中的framework.h中添加:

extern "C" __declspec(dllexport) void msg(void);

然后重新生成解决方案
-w517

然后用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;
}

将以上三个项目生成的文件放到一个文件夹下
-w745
然后运行call.exe,就会出现先弹窗hi,hacker, inserted function runing,然后弹窗good

添加新评论