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; } |
打印结果:
分类:
Windows核心编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?