飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3844|回复: 7

[C/C++] 内存加载模块 -- 飘云测试通过

  [复制链接]
  • TA的每日心情
    难过
    2024-4-22 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2014-2-5 00:46:14 | 显示全部楼层 |阅读模式

    模块代码过长,详见附件~~  测试很稳定,支持win7  64bit    我已经封装了几个函数方便使用,见测试代码
    测试代码:

    1. //MyDll.h

    2. extern "C"
    3. {
    4.         __declspec(dllexport) int AddFun(int a, int b);
    5.         __declspec(dllexport) void GotoPYG(char *url);
    6. }

    7. //MyDll.cpp
    8. #include <windows.h>
    9. #include "MyDll.h"

    10. int AddFun(int a, int b)
    11. {
    12.         return a + b;
    13. }

    14. void GotoPYG(char *url)
    15. {
    16.         ShellExecute(NULL,"open", url, "", "", SW_SHOW );
    17. }
    复制代码

    1. /************************************************************************/
    2. /* 函数名称: GetMemoryDllPointer                                        */
    3. /* 函数功能: 获取内存DLL指针                                            */
    4. /* 函数参数: WORD wResID---资源ID  char *szFileType -- 资源类型         */
    5. /* 函数返回: 内存DLL指针位置                                            */
    6. /* 函数封装: 飘云/P.Y.G -- WWW.CHINAPYG.COM                             */
    7. /************************************************************************/
    8. LPVOID GetMemoryDllPointer(WORD wResID, char *szFileType)
    9. {   
    10.     // 先取出资源文件  
    11.     HRSRC hRsrc =  FindResource(NULL, MAKEINTRESOURCE(wResID), szFileType);  
    12.         if (!hRsrc)
    13.                 return NULL;
    14.         
    15.     DWORD dwSize = SizeofResource(NULL, hRsrc);
    16.         if (!dwSize)
    17.                 return NULL;
    18.         
    19.         HGLOBAL hG = LoadResource(NULL, hRsrc);  
    20.         if (!hG)
    21.                 return NULL;
    22.         
    23.         //FreeResource(hG);
    24.         // 加载DLL到内存
    25.         return MemoryLoadLibrary(hG);
    26. }

    27. /************************************************************************/
    28. /* 函数名称: GetMemoryDllFunPointer                                     */
    29. /* 函数功能: 获取内存DLL某导出函数指针                                  */
    30. /* 函数参数: LPVOID lpMemoryDll -- 内存DLL指针 char *szFunName -- 函数名*/
    31. /* 函数返回: 内存DLL导出函数指针                                        */
    32. /* 函数封装: 飘云/P.Y.G -- WWW.CHINAPYG.COM                             */
    33. /************************************************************************/
    34. LPVOID GetMemoryDllFunPointer(LPVOID lpMemoryDll, char *szFunName)
    35. {   
    36.         return MemoryGetProcAddress(lpMemoryDll, szFunName);
    37. }

    38. /************************************************************************/
    39. /* 函数名称: FreeMemoryDll                                              */
    40. /* 函数功能: 释放内存DLL                                                */
    41. /* 函数参数: LPVOID lpMemoryDll -- 内存DLL指针                          */
    42. /* 函数返回: 无                                                         */
    43. /* 函数封装: 飘云/P.Y.G -- WWW.CHINAPYG.COM                             */
    44. /************************************************************************/
    45. VOID FreeMemoryDll(LPVOID lpMemoryDll)
    46. {   
    47.         MemoryFreeLibrary(lpMemoryDll);
    48. }


    49. // DLL导出函数原型
    50. typedef int (*AddProc)(int, int);
    51. typedef void (*GotoPYGProc)(char*);

    52. VOID TestIt()
    53. {
    54.         char str[256] = {0};
    55.         
    56.         HMEMORYMODULE lpMemoryDll = (HMEMORYMODULE)GetMemoryDllPointer((WORD)MYDLL, "DLL");

    57.         if(!lpMemoryDll)
    58.                 return;

    59.         // 类型转换
    60.         AddProc AddFun = (AddProc)GetMemoryDllFunPointer(lpMemoryDll, "AddFun");
    61.         GotoPYGProc GotoPYG = (GotoPYGProc)GetMemoryDllFunPointer(lpMemoryDll, "GotoPYG");
    62.         
    63.         // 调用DLL导出函数
    64.         sprintf(str,"调用内存DLL导出函数: AddFun(10,20) = %d",AddFun(10, 20));
    65.         GotoPYG("www.chinapyg.com");
    66.         
    67.         ::MessageBox(NULL, str, "提示", MB_OK);

    68.         FreeMemoryDll(lpMemoryDll);
    69. }

    70. void CTestDlg::OnTest()
    71. {
    72.         // TODO: Add your control notification handler code here
    73.         TestIt();
    74. }

    复制代码




    Bin.rar

    6.25 KB, 下载次数: 28, 下载积分: 飘云币 -2 枚

    MemoryModule.rar

    7.55 KB, 下载次数: 31, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-3-7 15:25
  • 签到天数: 442 天

    [LV.9]以坛为家II

    发表于 2014-2-5 17:47:48 | 显示全部楼层
    这个是一定要学习的。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-1-1 12:12
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2014-2-6 11:03:38 | 显示全部楼层
    这是不是传说中的ReLoadAndRun大法?
    建议下次把bin源码也附件打包了,省的自己去新建工程,文件,复制代码等等.
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1488 天

    [LV.10]以坛为家III

    发表于 2014-2-6 16:26:31 | 显示全部楼层
    好东西,学习
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2022-5-9 06:36
  • 签到天数: 1294 天

    [LV.10]以坛为家III

    发表于 2014-2-21 07:11:45 | 显示全部楼层
    非常感谢楼主,我一直想研究这个
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2022-5-9 06:36
  • 签到天数: 1294 天

    [LV.10]以坛为家III

    发表于 2014-2-21 12:36:42 | 显示全部楼层
    有个问题哎……
    HANDLE hFile = CreateFile(L"c:\\windows\\syswow64\\user32.dll",...);
    HANDLE hMap = CreateFileMapping(hFile,0,PAGE_READONLY,...);
    LPVOID buffer = MapViewOfFile(...);
    HMEMORYMODULE hDll = MemoryLoadLibrary(buffer);   //这里调用DLLMAIN会失败,请问为何呢?我单步调试看不出原因。。

    点评

    把DLL放到资源里面去  详情 回复 发表于 2014-2-21 17:06
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-4-22 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

     楼主| 发表于 2014-2-21 17:06:49 | 显示全部楼层
    yusheng 发表于 2014-2-21 12:36
    有个问题哎……
    HANDLE hFile = CreateFile(L"c:\\windows\\syswow64\\user32.dll",...);
    HANDLE hMap =  ...

    把DLL放到资源里面去
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2022-5-9 06:36
  • 签到天数: 1294 天

    [LV.10]以坛为家III

    发表于 2014-2-23 17:45:08 | 显示全部楼层
    飘云 发表于 2014-2-21 17:06
    把DLL放到资源里面去

    依然无效。
    而且从资源读取内容和从硬盘读取内容不应该是一样的么?我测试系统的一些DLL
    除了kernel32.dll可以正常内存载入以外,都无法载入。
    系统是win7 x64
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表