当前位置: 首页 > news >正文

微信官方网站注册淄博市建设业协会网站

微信官方网站注册,淄博市建设业协会网站,网站服务器维护方案,泰安网站设计公司MFC程序开发所谓是非常简单#xff0c;但是对于我们逆向人员来说#xff0c;如果想要逆向MFC程序#xff0c;那么我们就必须了解它背后的机制#xff0c;这样我们才能够清晰地逆向出MFC程序#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制#xff1a;程序启动机…MFC程序开发所谓是非常简单但是对于我们逆向人员来说如果想要逆向MFC程序那么我们就必须了解它背后的机制这样我们才能够清晰地逆向出MFC程序今天这篇文章就来带领大家了解MFC的第一大机制程序启动机制 首先我们创建一个单文档架构程序我们来观察一下 这里我创建的项目名称为MFCApplication1 我们发现一共有三个类这里有一些是MFC自动为我们写好的类类名称通常为项目名称继承了MFC库中的一些类我们只看MFC库中的类我们发现大致三个类 CFrame类这个类是框架窗口类封装了框架窗口的操作 CWinApp类这个类是应用程序类封装了流程的操作 CDocument类这个类是文档类封装了数据的处理例如存储转换等 CView类这个类是视图类封装了视图窗口的操作 我们主要讲解的是CFrame类和CWinApp类 这里我创建好的项目我们先来看看部分源代码 CMFCApplication1.h // MFCApplication1.h: MFCApplication1 应用程序的主头文件 // #pragma once#ifndef __AFXWIN_H__#error include pch.h before including this file for PCH #endif#include resource.h // 主符号// CMFCApplication1App: // 有关此类的实现请参阅 MFCApplication1.cpp //class CMFCApplication1App : public CWinApp { public:CMFCApplication1App() noexcept;// 重写 public:virtual BOOL InitInstance();virtual int ExitInstance();// 实现afx_msg void OnAppAbout();DECLARE_MESSAGE_MAP() };extern CMFCApplication1App theApp; MianFrm.h // MainFrm.h: CMainFrame 类的接口 //#pragma onceclass CMainFrame : public CFrameWnd {protected: // 仅从序列化创建CMainFrame() noexcept;DECLARE_DYNCREATE(CMainFrame)// 特性 public:// 操作 public:// 重写 public:virtual BOOL PreCreateWindow(CREATESTRUCT cs);// 实现 public:virtual ~CMainFrame(); #ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext dc) const; #endifprotected: // 控件条嵌入成员CToolBar m_wndToolBar;CStatusBar m_wndStatusBar;// 生成的消息映射函数 protected:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);DECLARE_MESSAGE_MAP()}; 看完这部分源码之后我们来自己实现不用MFC自动帮我们实现的类来加深我们的理解 我们创建一个控制台应用修改项目属性 常规MFC的使用在静态库中使用MFC连接器-系统-子系统窗口 接下来我们删除掉main.cpp中的所有代码我们来自己仿照MFC写一个窗口 #include afxwin.hclass CMyFrameWnd:public CFrameWnd{ public: }class CMyApp:public CWinApp{ public:CMyApp(){};//必须要重写虚函数virtual BOOL InitInstance(){CMyFrameWnd* pFrame new CMyFrameWnd;pFrame-Create(NULL,LFirstMFC);m_pMainWnd pFrame;pFrame.ShouWindow(SW_SHOW);pFrame-UpdateWindow();return TRUE;} };CMyWinApp theApp;这里的CMyFrameWnd由于只是一个框架类我们不需要做任何操作只是继承MFC的框架类就可以了狗仔函数会调用CFrameWnd中写好的构造函数 接下来我们创建一个自己的应用程序类继承MFC的CWinApp类这里我们写一个空的构造函数当构造的时候就会调用父类的构造函数了 我们在自己的应用程序类中还必须重写虚函数InitInstance在这个函数中我们创建窗口显示窗口 最后我们还需要一个应用程序类全局变量theApp 当我们写好这些之后我们运行发现窗口已经神奇的创建好了 我们在创建Win32应用程序的时候需要做的几个步骤 定义窗口类创建窗口注册窗口刷新窗口显示窗口 但是在我们这样实现了MFC之后我们貌似少做了很多操作几行代码就完成了窗口的创建甚至我们连WinMain函数都没有看见那么MFC的程序启动机制到底是怎样的呢我们首先就来深究一下MFC的程序运行机制 我们知道在C中全局变量的构造是优先于main函数的那么我们少做的很多操作肯定就是在这里全局变量的构造函数中了 我们在我们自己的应用程序类的构造函数上下断点我们跟到CWinApp的构造函数中来看看 这里我就写伪代码了 我们应用程序类的父类CWinApp的构造函数 CWinApp::CWinApp(LPCTSTR lpszAppName){//首先判断lpszAppName是否为空做了一些操作我们没必要关注//AFX_MODULE_STATE这个结构体是MFC中的 程序模块状态信息结构体//这里是获取当前应用程序模块状态信息AFX_MODULE_STATE* pModuleState _AFX_CMDTARGET_GETSTATE();//这里是获取当前程序线程状态信息可以看出来当前程序状态信息是模块状态信息中的一个成员AFX_MODULE_THREAD_STATE* pThreadState pModuleState-m_thread;//这里是给线程信息的某个成员赋值给的是this指针也就是theApp的地址pThreadState-m_pCurrentWinThread this;//这里是给theApp的成员赋值我们自己的应用程序类没有写成员这里都是CWinApp中写好的我们只是继承过来了//获取当前应用程序线程句柄m_hThread ::GetCurrentThread();//获取当前应用程序线程IDm_nThreadID ::GetCurrentThreadId();//给当前应用程序模块状态信息的某个成员赋值//不难看出这里保存的是当前应用程序类的地址也就是theApp的地址pModuleState-m_pCurrentWinApp this;//之后就是一些给类中的其他成员赋初值很多都是NULL我们不再关注}但是跟完构造函数后我们也没有找到WinMain更没有找到注册窗口等操作 既然在应用程序类的构造中我们没有找到我们来看看接下来我们写的pFrame-Create(NULL, LFirstMFC);这一段代码但是这一段代码很明显是框架类的方法我们猜测很多操作就在这里完成 我们在这一段代码上下断点断下来之后我们F11跟进然后查看调用对战我们就发现了wWinMian和AfxWInMain由于我们写过win32程序我们知道底层就是wWinMain函数我们就跟到这个函数中来看 这里还是写伪代码 _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow) {//我们发现在wWinMain函数中做了转发而且根据名称来看是MFC的wWimMain函数我们跟进去看看//这里注意有些人到这里就不会往进去跟了我们在这行代码上下断点然后去掉之前的断点重新调试就能跟进去了return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow){//这里根据名称来看是获取当前应用程序线程信息我们跟进去看看CWinThread* pThread AfxGetThread(){//这里跟前面的应用程序类的构造函数中一样获取当前应用程序的模块状态信息AFX_MODULE_THREAD_STATE* pState AfxGetModuleThreadState();//取出得到的模块状态信息中的成员-当前线程CWinThread* pThread pState-m_pCurrentWinThread;//返回线程return pThread;}//这里根据名称来看是获取了当前应用程序的应用程序类的地址我们还是跟进去看看CWinApp* pApp AfxGetApp(){//这里afx开头的函数return afxCurrentWinApp{//这里可以肯定是返回了应用程序类地址return pResult _afxBaseModuleState.GetData();}}这里这两步跟完之后大家有没有发现这里实现了C的多态CWinThread是爷类指针指向派生类类对象CWinApp是父类的指针指向了派生类对象theApp是我们自己实现的应用程序类嘛//下一步执行了这个函数在源代码中是在if的条件中实现的这里直接拉出来了AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow){//根据名称这个是初始化的函数pApp-m_hInstance hInstance;hPrevInstance; // Obsolete.pApp-m_lpCmdLine lpCmdLine;pApp-m_nCmdShow nCmdShow;pApp-SetCurrentHandles();}程序启动初始化操作 虚函数我们可以重写貌似是关于文档的一些初始化操作pApp-InitApplication()//接下来这个函数也是在if条件中进行的这里直接拉出来pThread-InitInstance(){这是虚函数我们在我们自己的类中已经实现}} }代码跟到这里我们已经解决了很多前面我们提出来的问题WinMain函数等但是还有一个问题消息循环呢我们知道如果没有消息循环那么这个窗口根本运行不了那既然我们能够关闭窗口等操作那肯定是已经写好了消息循环我们来接着上面的代码来跟 上面的函数紧接着我们就看到了一行代码 这就是MFC的消息循环我们来跟进去看一下 pThread-Run(){//这里也相当于做了转发在转发之前有一些判断这里省略int CWinApp::Run(){//跟到这里之后我们就发现了消息循环for (;;)//死循环{//这里的PeekMessage是到消息列表中检查是否有消息while (bIdle !::PeekMessage((pState-m_msgCur), NULL, NULL, NULL, PM_NOREMOVE)){//这里是说如果没有消息的话就会进行空闲操作比如刷新窗口检查定时器等等if (!OnIdle(lIdleCount))bIdle FALSE;}//死循环里面还有一个do——while循环我们来看看do{//这里如果是WM_QUIT消息才会返回false才会进去退出程序if (!PumpMessage(){//在这个PumpMessage中发现了翻译消息派发消息if (pState-m_msgCur.message ! WM_KICKIDLE !AfxPreTranslateMessage((pState-m_msgCur))){::TranslateMessage((pState-m_msgCur));::DispatchMessage((pState-m_msgCur));}})return ExitInstance();if (IsIdleMessage((pState-m_msgCur))){bIdle TRUE;lIdleCount 0;}} while (::PeekMessage((pState-m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));}} } 至此我们的消息循环就跟踪完了这里再总结一下MFC的程序启动机制 首先是theApp也就是我们自己的窗口类CMyApp的构造也就是CWinApp的构造在构造函数中 将theApp的地址保存到了当前应用程序线程状态信息中将theApp的地址保存到了当前应用程序的模块状态信息中 然后进入了WinMain函数在WinMain函数中 利用全局函数AfxGetThread()获取到了theApp的地址利用theApp调用虚函数 InitApplication进行文档类的一些初始化操作利用theApp调用虚函数 InitInstance也就是我们重写的虚函数创建窗口利用theApp调用虚函数 Run 消息循环在消息循环中我们跟踪到了获取消息翻译消息派发消息等利用TheApp调用退出函数
http://www.yutouwan.com/news/307829/

相关文章:

  • 鹤壁河南网站建设乘风专业建站
  • 廊坊兼职网站建设电子商务网站建设预算
  • 旅游网站建设水平评价wordpress migrate.min.js是什么
  • 临沂建设工程招聘信息网站动漫制作专业有哪些学校
  • 谷歌网站排名柳州做网站制作的公司有哪些
  • 中国建设工程标准化协会网站装饰公司营销网站模板
  • 抚州网站推广寿光网站建设m0536
  • 搭建个网站需要多少钱做购物网站小图标
  • 如皋建设工程局网站wordpress 定时
  • 温州网站设计案例商丘网站建设aliapp
  • 桐乡住房和城乡规划建设局网站济源网站建设电话
  • 太原建站一条龙软件界面设计ui培训班
  • 珠海市网站建设制作设计平台福州网站建设工作室
  • 企业做网站可以带中国吗石家庄做网络科技公司
  • 自适应网站的图做多大 怎么切iis运行wordpress
  • 互站网深圳制作网站哪家好
  • 可视化编辑网站开发百度一下首页官网下载
  • 建设申请网站首页营销运营平台
  • 广州免费建站平台dede网站mip
  • 北京建网站报价怎么做网站的需求
  • 网上做网站的公司都是怎么做的网站开发的论文引言
  • 免费建站网站seo网站建设窗口框架
  • 宿州大型网站建设公司网站网站设计公司
  • 南和县建设局黄页网站网站开发 演讲
  • 网站做飘浮怎么做泽库县公司网站建设
  • 三水区网站建设门户网站的概念
  • 福建专业网站建设欢迎咨询吉林市百姓网免费发布信息网
  • 贵阳网站推广有几家网站教程制作
  • 做网站项目流程基于.NET的电子商务网站开发
  • 德州做网站公司电话齐河县城乡建设局官方网站