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()函数。

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

目录
相关文章
|
28天前
|
C++
C/C++给文件加crc校验
C/C++给文件加crc校验
22 1
|
29天前
|
算法 Linux 程序员
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
|
2月前
|
存储 C++
基于C++的简易文件压缩与解压缩工具设计与实现
基于C++的简易文件压缩与解压缩工具设计与实现
16 3
|
监控 算法 编译器
C++通过libssh2库获取 SFTP指定文件的最后修改时间的方法
C++通过libssh2库获取 SFTP指定文件的最后修改时间的方法
30 0
|
2月前
|
安全 算法 程序员
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
45 0
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
69 5
|
2月前
|
存储 缓存 算法
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
92 4
|
2月前
|
Linux C++ iOS开发
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(二)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
263 2
|
2月前
|
Linux API C++
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(一)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
330 2
|
1天前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
10 3