IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> MFC窗口和按钮事件-正向与逆向分析 -> 正文阅读

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

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 12:06:52  更:2022-05-10 12:07:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 0:45:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码