浅析MFC逆向(Basic MFC Reversing)

您所在的位置:网站首页 软件逆向分析什么意思呀 浅析MFC逆向(Basic MFC Reversing)

浅析MFC逆向(Basic MFC Reversing)

2024-07-14 09:38:09| 来源: 网络整理| 查看: 265

最近在看MFC逆向方面的资料,找了些国外的资料,第一次翻译东西,文章没有翻译难度,但这篇文章对我个人很有帮助,而分享才是最重要的,所以发了出来,希望对初识MFC逆向的朋友有所帮助。 目录 1 MFC逆向指导 1.1 相关工具 1.2 序言: 什么是MFC? 1.3 简介 1.4 实验 1.4.1 MFC 主过程 1.4.2 获取 MESSAGE_MAP 1.4.2.1 IDC 脚本 1.4.3 利用 WM_COMMAND 1.5 最后说明 相关工具 IDA Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTI Crackme  前言:什么是MFC? 微软基础类库(也称为微软基础类 或 MFC)用C++类包装了部分Windows API,并包含了一个应用程序框架。类被定义为很多用句柄来管理的窗口对象,另外还有预定义窗口和各种通用控件。 介绍 使用MFC进行软件开发需要导入MFC80U.dll(MFC80U 是笔者写本文为止最近的一个版本的dll),视编译类型而定,可以使一个静态库或者共享DLL。 我将分析一个导入了这个dll并拥有调试信息的软件,这样会使我们的工作更容易一些。 一旦你通过这种方式而理解了MFC,你就可以通过在IDA中添加MFC和VisualC的签名来分析用MFC开发软件。  实验 这是windows下的一段标准的C源代码:

代码: LRESULT CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {         switch(uMsg)         {         case WM_COMMAND:                 switch(LOWORD(wParam))                 {                 case IDC_ABOUT:                         DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)MainDialogProc, 0);                         break;                                                  // ...                 }         } } 相反,这是一段MFC下的源代码:  代码: class CAboutDlg : public CDialog { public:         CAboutDlg(); // Dialog Data         enum { IDD = IDD_ABOUTBOX }; protected:         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support // Implementation protected:         DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)  //CAboutDlg::IDD is dialog ID           { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) {         CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //Dialog Message Map: is like DialogProc END_MESSAGE_MAP() // App command to run the dialog void CProvaRevApp::OnAppAbout()  {         CAboutDlg aboutDlg;          aboutDlg.DoModal(); } 你可以猜到MFC软件的反汇编是更难理解的。 MFC Main 这是目标程序的主要反汇编:  代码: .text:00401CBB                 public start .text:00401CBB                 call    ___security_init_cookie .text:00401CC0                 jmp     ___tmainCRTStartup .text:004019FB ___tmainCRTStartup proc near            ; CODE XREF: start+5j .text:004019FB .text:004019FB                 push    5Ch .text:004019FD                 push    offset unk_403DD8 .text:00401A02                 call    __SEH_prolog4 ;... other initialization code .text:00401B3E                 push    ecx             ; nShowCmd .text:00401B3F                 push    eax             ; lpCmdLine .text:00401B40                 push    ebx             ; hPrevInstance .text:00401B41                 push    400000h         ; hInstance .text:00401B46                 call    _wWinMain@16    ; wWinMain(x,x,x,x) ; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) _wWinMain@16 proc near         jmp     ?AfxWinMain@@YGHPAUHINSTANCE__@@0PA_WH@Z ; AfxWinMain(HINSTANCE__ *,HINSTANCE__ *,wchar_t *,int) _wWinMain@16 endp 如你所见WinMain调用了AfxWinMain。 如果你安装了VisualStudio你可以看下MFC的源代码,在这篇文章中我只会讲解我们要用到的函数。  代码: [ int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,         _In_ LPTSTR lpCmdLine, int nCmdShow) {         ASSERT(hPrevInstance == NULL);         int nReturnCode = -1;         CWinThread* pThread = AfxGetThread();         CWinApp* pApp = AfxGetApp();         // AFX internal initialization         if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))                 goto InitFailure;         // App global initializations (rare)         if (pApp != NULL && !pApp->InitApplication())                 goto InitFailure;         // Perform specific initializations         if (!pThread->InitInstance())         {                 if (pThread->m_pMainWnd != NULL)                 {                         TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");                         pThread->m_pMainWnd->DestroyWindow();                 }                 nReturnCode = pThread->ExitInstance();                 goto InitFailure;         }         nReturnCode = pThread->Run(); InitFailure:         AfxWinTerm();         return nReturnCode; } 这是AfxWinMain函数的反汇编:  代码: .text:7831D2D2                 public AfxWinMain .text:7831D2D2 AfxWinMain      proc near .text:7831D2D2                 push    ebx .text:7831D2D3                 push    esi .text:7831D2D4                 push    edi .text:7831D2D5                 or      ebx, 0FFFFFFFFh .text:7831D2D8                 call    AfxGetModuleThreadState .text:7831D2DD                 mov     esi, [eax+4] ;pThread .text:7831D2E0                 call    AfxGetModuleState .text:7831D2E5                 push    [esp+0Ch+arg_C] .text:7831D2E9                 mov     edi, [eax+4]  ;pApp .text:7831D2EC                 push    [esp+10h+arg_8] .text:7831D2F0                 push    [esp+14h+arg_4] .text:7831D2F4                 push    [esp+18h+arg_0] .text:7831D2F8                 call    AfxWinInit .text:7831D2FD                 test    eax, eax .text:7831D2FF                 jz      short loc_7831D33D .text:7831D301                 test    edi, edi      .text:7831D303                 jz      short loc_7831D313 .text:7831D305                 mov     eax, [edi]  .text:7831D307                 mov     ecx, edi .text:7831D309                 call    dword ptr [eax+98h]  .text:7831D30F                 test    eax, eax .text:7831D311                 jz      short loc_7831D33D .text:7831D313 .text:7831D313 loc_7831D313:  .text:7831D313                 mov     eax, [esi] .text:7831D315                 mov     ecx, esi .text:7831D317                 call    dword ptr [eax+58h]  .text:7831D31A                 test    eax, eax .text:7831D31C                 jnz     short loc_7831D334 .text:7831D31E                 cmp     [esi+20h], eax .text:7831D321                 jz      short loc_7831D32B .text:7831D323                 mov     ecx, [esi+20h] .text:7831D326                 mov     eax, [ecx] .text:7831D328                 call    dword ptr [eax+68h] .text:7831D32B .text:7831D32B loc_7831D32B: .text:7831D32B                 mov     eax, [esi] .text:7831D32D                 mov     ecx, esi .text:7831D32F                 call    dword ptr [eax+70h]  .text:7831D332                 jmp     short loc_7831D33B .text:7831D334 .text:7831D334 loc_7831D334:  .text:7831D334                 mov     eax, [esi] .text:7831D336                 mov     ecx, esi .text:7831D338                 call    dword ptr [eax+5Ch] .text:7831D33B .text:7831D33B loc_7831D33B:   .text:7831D33B                 mov     ebx, eax .text:7831D33D .text:7831D33D loc_7831D33D:  .text:7831D33D                 call    AfxWinTerm .text:7831D342                 pop     edi .text:7831D343                 pop     esi .text:7831D344                 mov     eax, ebx .text:7831D346                 pop     ebx .text:7831D347                 retn    10h .text:7831D347 AfxWinMain      endp 在上面的代码中有一些调用如call [eax + XXh]:事实上对AfxGetApp(和AfxGetThread)的调用将返回一个指向结构的指针,这个结构记录了所有MFC框架所使用的函数的偏移。 EDI(pApp) 的值为40349C VA,指向的位置是CwinApp中保存的虚函数表。  代码: .rdata:0040349C off_40349C      dd offset ?GetRuntimeClass@CWinApp@@UBEPAUCRuntimeClass@@XZ ;CWinApp::GetRuntimeClass(void) .rdata:004034A0                 dd offset sub_401010 .rdata:004034A4                 dd offset nullsub_1 .rdata:004034A8                 dd offset nullsub_2 .rdata:004034AC                 dd offset nullsub_1 .rdata:004034B0                 dd offset ?OnCmdMsg@CCmdTarget@@UAEHIHPAXPAUAFX_CMDHANDLERINFO@@@Z ; CCmdTarget::OnCmdMsg(uint,int,void *,AFX_CMDHANDLERINFO *) .rdata:004034B4                 dd offset ?OnFinalRelease@CCmdTarget@@UAEXXZ ; CCmdTarget::OnFinalRelease(void) .rdata:004034B8                 dd offset ?IsInvokeAllowed@CCmdTarget@@UAEHJ@Z ; CCmdTarget::IsInvokeAllowed(long) .rdata:004034BC                 dd offset ?GetDispatchIID@CCmdTarget@@UAEHPAU_GUID@@@Z ; CCmdTarget::GetDispatchIID(_GUID *) .rdata:004034C0                 dd offset ?GetTypeInfoCount@CCmdTarget@@UAEIXZ ; CCmdTarget::GetTypeInfoCount(void) .rdata:004034C4                 dd offset ?GetTypeLibCache@CCmdTarget@@UAEPAVCTypeLibCache@@XZ ; CCmdTarget::GetTypeLibCache(void) .rdata:004034C8                 dd offset ?GetTypeLib@CCmdTarget@@UAEJKPAPAUITypeLib@@@Z ; CCmdTarget::GetTypeLib(ulong,ITypeLib * *) .rdata:004034CC                 dd offset sub_401000 ;....................................................... 现在您应该会有个疑问,MFC在哪里得到的地址?让我们快来看一下它的引用… 代码: .text:004023B0 sub_4023B0      proc near               .text:004023B0                 push    0 .text:004023B2                 mov     ecx, offset dword_405498 .text:004023B7                 call    ??0CWinApp@@QAE@PB_W@Z ; CWinApp::CWinApp(wchar_t const *) .text:004023BC                 push    offset sub_4023F0 ; void (__cdecl *)() .text:004023C1                 mov     dword_405498, offset off_40349C ;


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭