这里的操作是在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()函数。
这就是远线程的动态库的注入技术了,具体怎么用的还没弄清楚,后续弄清楚了再更。。。。