C++ --- Dll文件的生成与调用(二)之动态库注入技术

简介: C++ --- Dll文件的生成与调用(二)之动态库注入技术

这里的操作是在C++ --- Dll文件的生成与调用(一)的基础上进行修改和拓展的

1、添加动态库入口函数的方式生成Dll文件,这个需要Windows的支持

DemoDll.h文件

1. #pragma once
2. #include<Windows.h>     // 引用Windows库
3. 
4. #ifdef DemoDll
5. #define DemoDll_API __declspec(dllexport)      // 导出
6. #else
7. #define DemoDll_API __declspec(dllimport)      // 导入
8. #endif // DemoDll
9. 
10. /*
11. \ brief     动态链接库(DLL)的可选入口点
12. \ param     hinstDLL    DLL模块的句柄,该值是DLL的基地址
13. \ param     fdwReason   指示为什么调用DLL入口点函数的原因码
14. \ param     lpvReserved  如果fdwReason是DLL_PROCESS_ATTACH,lpvReserved是NULL动态载荷和非NULL的静态载荷
15. */
16. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
17. {
18. /*
19. DLL入口点:
20. 进程加载DLL             (DLL_PROCESS_ATTACH)
21. 当前进程创建一个新线程   (DLL_THREAD_ATTACH)
22. 线程正常退出            (DLL_THREAD_DETACH)
23. 进程卸载DLL             (DLL_PROCESS_DETACH)
24. */
25. switch (fdwReason)
26.     {
27.        // 进程加载DLL
28.       case DLL_PROCESS_ATTACH:
29.           MessageBoxW(NULL, TEXT("Hello word"), TEXT("Title"), NULL);
30.           break;
31.        // 当前进程创建一个新线程
32.       case DLL_THREAD_ATTACH:
33.           break;
34.        // 线程正常退出   
35.       case DLL_THREAD_DETACH:      
36.           break;
37.        // 进程卸载DLL   
38.       case DLL_PROCESS_DETACH:     
39.           break;
40.     }
41.   return TRUE;
42. }
43. 
44. #ifdef __cplusplus
45. extern "C" {
46. #endif // __cplusplus
47. 
48.   /*
49.   \ brief  在这里编写 函数模块
50.   */
51. 
52.   int DemoDll_API add(int a, int b);
53. 
54. #ifdef __cplusplus
55. }
56. #endif // __cplusplus

编译、生成动态库,并将.lib、.dll和.h文件拷贝到项目中

同时将.h文件和.lib文件加入到项目中(其实.lib添不添加无所谓)

2、新建一个项目,使用dll文件

main.cpp文件

1. #include<iostream>
2. #include<Windows.h>    // 引用Windows库
3. using namespace std; 
4. /*
5. \ brief    定义一个函数指针别名
6. */
7. typedef int (*ADD)(int, int);
8. 
9. int main(int argc, char* argv[])
10. { 
11.   // 使用LoadLibraryW()函数将 DemoDll库导入到项目中
12.   HMODULE hModule  = LoadLibraryW(TEXT("DemoDll.dll"));
13.   if (hModule == NULL) {
14.     return 0;
15.   }
16.   // 使用 GetProcAddress()函数 导出 add()函数的地址,赋值给 add指针变量中
17.   ADD add = (ADD)GetProcAddress(hModule, "add");
18.   if (add == NULL) {
19.     return 0;
20.   }
21.   // 执行结果
22.   cout << " 4 + 6 = " << add(4, 6) << endl;
23.   // 释放动态库
24.   FreeLibrary(hModule);
25. }

运行可以看到

 

那么我们可以得出结论,当使用LoadLibraryW()函数 动态加载动态库的时候,会调用DllMain()函数。

这就是远线程的动态库的注入技术了,具体怎么用的还没弄清楚,后续弄清楚了再更。。。。

相关文章
|
2月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
51 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
1月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
19 0
Linux c/c++文件的基本操作
|
5月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
47 0
|
1月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
70 0
|
2月前
|
Linux API C++
超级好用的C++实用库之文件目录操作
超级好用的C++实用库之文件目录操作
32 0
|
2月前
|
Linux API C++
超级好用的C++实用库之动态库加载器
超级好用的C++实用库之动态库加载器
27 0
|
3月前
|
人工智能 Anolis
聚焦C++20 最新标准!技术 Workshop 精彩亮点一览 | 2024 龙蜥大会
多场技术 Workshop、多位领域专家亲自授课,分享独家洞察与宝贵经验。
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
20 0