MFC窗口和按钮事件-正向与逆向分析

Posted 向往生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC窗口和按钮事件-正向与逆向分析相关的知识,希望对你有一定的参考价值。

1.背景

    模态窗口和非模态窗口是子窗体的两种类型。模态窗口有时会作为一种授权手段,总在最前挡住主窗体,需要注册才能使用软件,另外,通过窗体的监控,我们会更了解MFC程序的exe结构,所以走一遍看看。

2.创建窗体MFC程序

2.1 创建主窗体

2.2 资源试图创建子窗体

2.3 产生对应的类(.h和.cpp文件)

 

2.4 添加按钮和消息提示框

在主窗体添加按钮,创建按钮事件处理函数

双击进入填写代码:

void CMyDialogDlg::OnBnClickedButton1()

	// 模态窗体
	Cdialogexe dlg1;//模态窗体直接调用domodal即可
	CString key;
	key.Format(TEXT("Hali hello-this is ModeWindows"));
	dlg1.DoModal();
	MessageBox(key);



void CMyDialogDlg::OnBnClickedButton2()

	//非模态窗体,需要在主函数创建全局变量
	CString key;
	key.Format(TEXT("Hali hello-this is ModeLessWindows"));
	dlgg.ShowWindow(SW_SHOWDEFAULT);
	MessageBox(key);

3.导入逆向分析

3.1 visual studio 2022反汇编窗口

在消息处理事件中设置一个断点,启动调试,正常操作,遇到断点就停下来。

 可以看到对应的汇编指令。

3.2 导入IDA

通过搜索关键字扎到代码位置

这个函数是没有说明它是按钮事件的处理函数的,即使在我有pdb文件的情况下,也是看不到的。

.text:00418D40
.text:00418D40 ; =============== S U B R O U T I N E =======================================
.text:00418D40
.text:00418D40 ; Attributes: bp-based frame
.text:00418D40
.text:00418D40 sub_418D40      proc near               ; CODE XREF: sub_41170D↑j
.text:00418D40
.text:00418D40 var_28          = byte ptr -28h
.text:00418D40 var_24          = byte ptr -24h
.text:00418D40 var_18          = dword ptr -18h
.text:00418D40 var_10          = dword ptr -10h
.text:00418D40 var_C           = dword ptr -0Ch
.text:00418D40 var_4           = dword ptr -4
.text:00418D40
.text:00418D40                 push    ebp
.text:00418D41                 mov     ebp, esp
.text:00418D43                 push    0FFFFFFFFh
.text:00418D45                 push    offset SEH_418D40
.text:00418D4A                 mov     eax, large fs:0

 所以只好寄望于从它的指针存放的位置来推断,它是消息事件处理函数,因为从函数指针往上翻,看到了这个:

 不过这个过程是不实用的,因为从自己制造的messagebox的字符串去找,真实的程序不一定有。后续可能在PE文件的课程里,会了解到C++的exe结构是如何的吧。

源码

void CMyDialogDlg::OnBnClickedButton2()


	CString key;
	key.Format(TEXT("Hali hello"));
	dlgg.ShowWindow(SW_SHOWDEFAULT);
	MessageBox(key);




反汇编代码

int __thiscall sub_418D40(CWnd *this)

  const wchar_t *v1; // eax
  char v3[12]; // [esp+D4h] [ebp-24h] BYREF
  CWnd *v4; // [esp+E0h] [ebp-18h]
  int v5; // [esp+F4h] [ebp-4h]

  v4 = this;
  __CheckForDebuggerJustMyCode(&unk_436038);
  ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>(v3);
  v5 = 0;
  ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format(v3, L"Hali hello");
  CWnd::ShowWindow((CWnd *)((char *)v4 + 216), 10);
  v1 = (const wchar_t *)ATL::CSimpleStringT<wchar_t,1>::operator wchar_t const *(v3);
  CWnd::MessageBoxW(v4, v1, 0, 0);
  v5 = -1;
  return ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::~CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>(v3);

3.3 导入X32dbg

搜索“Hali”也是一下就找到处理函数了,因为内存引用直接被它引到源码里了,所以速度更快。

以上是关于MFC窗口和按钮事件-正向与逆向分析的主要内容,如果未能解决你的问题,请参考以下文章

MFC窗口和按钮事件-正向与逆向分析

C++程序正向编译逆向反编译

C++程序正向编译Ghidra逆向反编译

逆向分析mfc程序

seo问题,啥叫正向匹配?啥叫逆向匹配?举例说明

逆向搜索法和爬山法的例子都有哪些