dll劫持

首先构建一个正常的dll 创建动态链接库

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <stdio.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: puts("init");
    case DLL_THREAD_ATTACH: break;
    case DLL_THREAD_DETACH:break;
    case DLL_PROCESS_DETACH:break;
        break;
    }
    return TRUE;
}
void test1()
{
    puts("test1");
}

void test2()
{
    puts("test2");
}

写2个函数做测试 编写def 文件

LIBRARY
 EXPORTS
    test2
    test1

让后生成 复制 dll和lib 文件到调用文件位置

 接着编写调用这个dll 文件

#pragma comment(lib,"Dll1.lib")
void test1();
void test2();

int main()
{

    test1();
    test2();

    system("pause");
}

可以成功运行 后,编写一个dll  劫持刚刚那个dll 功能 先把他dll 改成old.dll  b编一个新的dll1.dll 替换它

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <stdio.h>

void test();
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: puts("int new"); break;
    case DLL_THREAD_ATTACH: break;
    case DLL_THREAD_DETACH:break;
    case DLL_PROCESS_DETACH:break;
        break;
    }
    return TRUE;
}
typedef void (*fun)();
//函数转发
#pragma comment(linker,"/export:test2=old.test2")
void test()
{
    HMODULE hModule=LoadLibrary(L"old.dll");
    //获取导出函数地址
    fun pfn = (fun)GetProcAddress(hModule, "test1");
    printf("%p", pfn);
    if (pfn!=NULL)
    {
        puts("success");
        pfn();
    }
    //卸载
    FreeLibrary(hModule);
}

def 编写

 接着在运行exe 看到成功劫持原先函数 

如果中间有什么问题 可以在 dll 项目添加调试断点

 

 填写 调用方的exe 地址  就可以f5直接调试运行了

从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
原文地址:https://www.cnblogs.com/feizianquan/p/15115132.html