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”也是一下就找到处理函数了,因为内存引用直接被它引到源码里了,所以速度更快。
|