找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3856|回复: 0

使用VS2010以上版本的MFC编写OllyDbg插件

[复制链接]

307

主题

228

回帖

7345

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5595 个
贡献
253 次
宅之契约
0 份
在线时间
949 小时
注册时间
2014-1-25
发表于 2015-1-14 12:08:37 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
    前面已经说过,MFC早期版本的CString实现没有使用ATL,而plugin.h要求编译时加入/J命令,或定义_CHAR_UNSIGNED宏,而ATL要求则相反。因此这个问题在VC6中不存在,而在VS2010及以上版本存在,目前我就测试了这几个版本。如何解决这个矛盾呢?今天我研究出一种方法。
    #if宏在这里起了决定性作用,如果命令行定义/J则所有工程文件都默认定义_CHAR_UNSIGNED,那么我们退而求其次,只在必要处添加该定义,使用结束后取消定义,这样就不和ATL冲突了!!!下面是该宏用法:
#if !defined _CHAR_UNSIGNED
#define _CHAR_UNSIGNED
#define _ISCHARTYPEUNSIGNED  1
#else
#define  _ISCHARTYPEUNSIGNED 0
#endif

#if _ISCHARTYPEUNSIGNED == 1
#undef _CHAR_UNSIGNED
#endif

    我使用_ISCHARTYPEUNSIGNED 判断是否修改了_CHAR_UNSIGNED,如果原来未定义_CHAR_UNSIGNED,那么就在当前代码块定义该标志,块结束再改回去。如果原来定义过,则不用做任何操作。该代码要和MFC相关宏分开,因此


下面来测试,新建一个MFC的常规DLL,主文件中修改为如下形式:


  1. // MFCLibrary1.cpp : 定义 DLL 的初始化例程。
  2. //

  3. #include "stdafx.h"
  4. #include "MFCLibrary1.h"

  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #endif

  8. //
  9. //TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
  10. //                则从此 DLL 导出的任何调入
  11. //                MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
  12. //                该函数的最前面。
  13. //
  14. //                例如:
  15. //
  16. //                extern "C" BOOL PASCAL EXPORT ExportedFunction()
  17. //                {
  18. //                        AFX_MANAGE_STATE(AfxGetStaticModuleState());
  19. //                        // 此处为普通函数体
  20. //                }
  21. //
  22. //                此宏先于任何 MFC 调用
  23. //                出现在每个函数中十分重要。这意味着
  24. //                它必须作为函数中的第一个语句
  25. //                出现,甚至先于所有对象变量声明,
  26. //                这是因为它们的构造函数可能生成 MFC
  27. //                DLL 调用。
  28. //
  29. //                有关其他详细信息,
  30. //                请参阅 MFC 技术说明 33 和 58。
  31. //

  32. // CMFCLibrary1App

  33. BEGIN_MESSAGE_MAP(CMFCLibrary1App, CWinApp)
  34. END_MESSAGE_MAP()


  35. // CMFCLibrary1App 构造

  36. CMFCLibrary1App::CMFCLibrary1App()
  37. {
  38.         // TODO: 在此处添加构造代码,
  39.         // 将所有重要的初始化放置在 InitInstance 中
  40. }


  41. // 唯一的一个 CMFCLibrary1App 对象

  42. CMFCLibrary1App theApp;


  43. // CMFCLibrary1App 初始化

  44. BOOL CMFCLibrary1App::InitInstance()
  45. {
  46.         CWinApp::InitInstance();

  47.         return TRUE;
  48. }

  49. #if !defined _CHAR_UNSIGNED
  50. #define _CHAR_UNSIGNED
  51. #define _ISCHARTYPEUNSIGNED  1
  52. #else
  53. #define  _ISCHARTYPEUNSIGNED 0
  54. #endif

  55. #include <Windows.h>
  56. #include "Plugin.h"
  57. #include <stdio.h>
  58. #pragma comment(lib,"ollydbg.lib")

  59. HINSTANCE hInst;
  60. HWND hOllyWnd;
  61. t_module* MainModule;

  62. extc int  _export cdecl ODBG_Pluginmenu(int origin,char data[4096],void *item)
  63. {
  64.         return 1;
  65. }

  66. extc int  _export cdecl ODBG_Plugininit(int ollydbgversion,HWND hw, ulong *features)
  67. {
  68.         return 0;
  69. }

  70. extc int  _export cdecl ODBG_Plugindata(char shortname[32])
  71. {
  72.         strcat(shortname,"testMFC");
  73.         return 108;
  74. }

  75. #if _ISCHARTYPEUNSIGNED == 1
  76. #undef _CHAR_UNSIGNED
  77. #endif
复制代码



MFC扩展DLL例子:
  1. // dllmain.cpp : 定义 DLL 的初始化例程。
  2. //

  3. #include "stdafx.h"
  4. #include <afxwin.h>
  5. #include <afxdllx.h>

  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif

  9. static AFX_EXTENSION_MODULE MFCLibrary2DLL = { NULL, NULL };

  10. extern "C" int APIENTRY
  11. DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  12. {
  13.         // 如果使用 lpReserved,请将此移除
  14.         UNREFERENCED_PARAMETER(lpReserved);

  15.         if (dwReason == DLL_PROCESS_ATTACH)
  16.         {
  17.                 TRACE0("MFCLibrary2.DLL 正在初始化!\n");
  18.                
  19.                 // 扩展 DLL 一次性初始化
  20.                 if (!AfxInitExtensionModule(MFCLibrary2DLL, hInstance))
  21.                         return 0;

  22.                 // 将此 DLL 插入到资源链中
  23.                 // 注意: 如果此扩展 DLL 由
  24.                 //  MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
  25.                 //  而不是由 MFC 应用程序链接到,则需要
  26.                 //  将此行从 DllMain 中移除并将其放置在一个
  27.                 //  从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
  28.                 //  规则 DLL 然后应显式
  29.                 //  调用该函数以初始化此扩展 DLL。否则,
  30.                 //  CDynLinkLibrary 对象不会附加到
  31.                 //  规则 DLL 的资源链,并将导致严重的
  32.                 //  问题。

  33.                 new CDynLinkLibrary(MFCLibrary2DLL);

  34.         }
  35.         else if (dwReason == DLL_PROCESS_DETACH)
  36.         {
  37.                 TRACE0("MFCLibrary2.DLL 正在终止!\n");

  38.                 // 在调用析构函数之前终止该库
  39.                 AfxTermExtensionModule(MFCLibrary2DLL);
  40.         }
  41.         return 1;   // 确定
  42. }

  43. #if !defined _CHAR_UNSIGNED
  44. #define _CHAR_UNSIGNED
  45. #define _ISCHARTYPEUNSIGNED  1
  46. #else
  47. #define  _ISCHARTYPEUNSIGNED 0
  48. #endif

  49. #include <Windows.h>
  50. #include "Plugin.h"
  51. #include <stdio.h>
  52. #pragma comment(lib,"ollydbg.lib")

  53. HINSTANCE hInst;
  54. HWND hOllyWnd;
  55. t_module* MainModule;

  56. extc int  _export cdecl ODBG_Pluginmenu(int origin,char data[4096],void *item)
  57. {
  58.         return 1;
  59. }

  60. extc int  _export cdecl ODBG_Plugininit(int ollydbgversion,HWND hw, ulong *features)
  61. {
  62.         return 0;
  63. }

  64. extc int  _export cdecl ODBG_Plugindata(char shortname[32])
  65. {
  66.         strcat(shortname,"testMFC");
  67.         return 108;
  68. }

  69. #if _ISCHARTYPEUNSIGNED == 1
  70. #undef _CHAR_UNSIGNED
  71. #endif
复制代码
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-29 19:38 , Processed in 0.037676 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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