Win32编程之函数转发注入DLL(十五)

一、创建目标DLL文件

DLL名称:targetdll.dll

头文件(targetdll.h):

1
2
3
4
#pragma once
 
__declspec(dllexport) void __stdcall hello();
__declspec(dllexport) int __stdcall add(int a, int b);

源文件(targetdll.cpp)  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include "targetdll.h"
 
void __stdcall hello() {
    printf("\n--------------------------\n");
    printf("\n-----------hello-------------\n");
    printf("\n------------------------\n");
}
 
int __stdcall add(int a, int b) {
    printf("\n------------------------\n");
    printf("\n-----------add-------------%d\n", a + b);
    printf("\n------------------------\n");
 
    return (a + b);
}

 二、DLL文件的调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <Windows.h>
#include <stdio.h>
#include "targetdll.h"
 
typedef int (*ADD_FUNC)(int a, int b);
 
int main() {
    HMODULE hModule = LoadLibrary(TEXT("targetdll.dll"));
    if (hModule == NULL) {
        printf("dll加载失败\n");
 
        return 0;
    }
 
    FARPROC pFn = GetProcAddress(hModule, "hello");
    pFn();
 
    ADD_FUNC pAdd = (ADD_FUNC)GetProcAddress(hModule, "add");
    pAdd(10, 20);
 
    FreeLibrary(hModule);
 
    system("pause");
          
    return 1;
}

输出结果:  

三、创建替换DLL文件

DLL名称:replacedll.dll

转发指令:#pragma comment(linker, "/export:导出名称=被转发的dll名称.被转发的函数名称")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <Windows.h>
#include "replacedll.h"
 
#pragma comment(linker, "/export:hello=targetdll_old.hello")<br>#pragma comment(linker, "/export:add=targetdll_old.add")
 
BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        OutputDebugString(TEXT("Load replacedll"));
        break;
    case DLL_THREAD_ATTACH:break;
    case DLL_THREAD_DETACH:break;
    case DLL_PROCESS_DETACH:
        OutputDebugString(TEXT("UnLoad replacedll"));
        break;
    }
    return TRUE;
}

 将目标文件targetdll.dll改为targetdll_old.dll;然后将替换文件replacedll.dll改成目标文件targetdll.dll,然后调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <Windows.h>
#include <stdio.h>
#include "targetdll.h"
 
typedef int (*ADD_FUNC)(int a, int b);
 
int main() {
    HMODULE hModule = LoadLibrary(TEXT("targetdll.dll"));
    if (hModule == NULL) {
        printf("dll加载失败\n");
 
        return 0;
    }
 
    FARPROC pFn = GetProcAddress(hModule, "hello");
    pFn();
 
    ADD_FUNC pAdd = (ADD_FUNC)GetProcAddress(hModule, "add");
    pAdd(10, 20);
 
    FreeLibrary(hModule);
 
    system("pause");
 
    return 1;
}

打印结果:

 

posted @   TechNomad  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示