逆向MFC程序
@
目录
1 MFC执行流程
1.1 环境支持
- vs 2017
- afxwin.h,afxcdialogex.h
1.2 分析
在 vs 调试窗口中 有一个“反汇编窗口”,同样也可以下断点,步过步入等。
则可以汇编层可以详细的 步过/步入 每一个 详细的步骤---得以知道详细的系统/库的API调用、获取栈回溯情况等等
1.3 实践探索
1.3.1 创建一个MFC程序
主要重写CWinApp::InitInstance() 和 自定义个一个对话框类(以实现一个简单界面)
注意: 对话框资源文件我没列出来,因为只有一个对话框和一个按钮点击
我的Demo如下:
- 自定义程序入口
//CMyWinApp.cpp
#include "mywinapp.h"
#include"wndDlg.h"
myWinapp App;
myWinapp::myWinapp(){}
myWinapp::~myWinapp(){}
BEGIN_MESSAGE_MAP(myWinapp,CWinApp)
END_MESSAGE_MAP()
BOOL myWinapp::InitInstance()
{
wndDlg * TWND = new wndDlg;
m_pMainWnd = (CDialog*)TWND;
TWND->DoModal();
CWinApp::InitInstance();
return 0;
}
- 自定义对话框
// wndDlg.cpp: 实现文件
//
#include "stdafx.h"
#include "wndDlg.h"
#include "afxdialogex.h"
#include"resource.h"
// wndDlg 对话框
IMPLEMENT_DYNAMIC(wndDlg, CDialogEx)
wndDlg::wndDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG1, pParent){}
wndDlg::~wndDlg(){}
void wndDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(wndDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &wndDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// wndDlg 消息处理程序
void wndDlg::OnBnClickedButton1()
{
MessageBox("hello Leibso-HUANGHAI/黄海");
}
1.3.2 下关键断点并调试
比如这儿 我想探索关键函数 InitInstance()的位置
1.关键断点

注意: DoModal()是模态对话框,当你断这儿的时候F10,只有当退出的时候才会步过
2.调出反汇编窗口

3.查看调用堆栈窗口

解析: 很清晰的看出MFC程序的调用顺序是WinMain()-->AfxWinMain()-->InitInstance()
结束了吗?
并没有。。
1.4 转向MFC库源文件中观测
- 继续上面的步骤在反汇编窗口键入F10
- 直到走出这个InitInstance()
- 我们会发现来到了一片绿洲-- 库代码
- 鼠标中键往上滑动发现当前的源文件 路径+名
- 这就是我们的 MFC库源文件之一

注意: 这里的路径有可能不是你正确的路径(因为可能重复卸载安装了VS的缘故)
解决:使用文件搜索工具 (我这里使用的是everything)-- 搜索处此名为winmain.cpp

这个标记的就是了
然后用VS打开这个文件,你会发现你的断点就在上面清晰的源代码就出来了

2 逆向
我们看了源代码后可以发现如此复杂的想从入口函数一步一步往后找有点浪费精力
所以--使用特征码
2.1 特征码的选择(比如我这里还是想找到InitInstance())
那在刚才的反汇编窗口中找到关键汇编代码,行数越多越精确
注:关键代码 不能包含地址之类的这样可能会出问题,因为可能会有重定位之类数据不确定的问题
如图:

那:
这几条语句就可以作为我们的特征码
mov eax,dword ptr [edx]
mov esi,esp
mov ecx,dword ptr [eax+58h]
mov dword ptr [ebp-24h],ecx
mov edi,esp
mov ecx,dword ptr [ebp-24h]
2.2 使用调试工具(OD) 搜索特侦码
使用OD动态调试 搜索以下代码序列,就可以得到这个函数的地方了
如图:

之后就可以下断点 动态分析了
咐语
其他平台程序的逆向也可以使用这种方法:搭建平台-->写一个Demo程序-->熟悉流程-->找目标特征码
逆向MFC程序的更多相关文章
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(03)
1.3.2 MFC如何使用应用程序对象 MFC程序没有main函数,没有WinMain函数,到底是什么启动了程序的运行? 一个MFC提供的源代码中(Winmain.cpp)包含了一个AfxWinMai ...
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(01)
#include <afxwin.h> class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; cl ...
- MFC程序执行顺序 .
1.创建Application object对象theApp 程序一开始生产一个(且只有一个)Application object对象theApp,也即一个CWinApp对象,这个全局对象一产生,便执 ...
- vs2010的“应用程序向导”新建MFC程序报错“当前页面的脚本发送错误”
原创文章,欢迎阅读,禁止转载. 问题现象不知道从什么时候开始,我的vs2010不能新建MFC程序了,报错如图:... 解决方法根据提示排查,发现是应用程序向导的相关html被损坏了.从同事电脑上把 ...
- MFC程序中使用调试宏ASSERT()、ASSERT_VALID()、VERIFY()和TRACE()的区别
其实这篇文章说的很明白了:http://dev.gameres.com/Program/Other/DebugMacro.htm 结论如下: 1.ASSERT()测试它的参数,若参数为0,则中断执行并 ...
- 孙鑫MFC学习笔记3:MFC程序运行过程
1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...
- [MFC] 如何更改MFC程序图标
方法一: >_<:找一张ICO图标,替换programname/res/programname.ico文件,就可以啦,这时候你运行后得到的图标可能还是原来MFC的默认图标,这时候你只要把工 ...
- VS 2008 创建MFC程序对话框的步骤
用过不少编程语言,可是刚开始学的时候最容易忘记一些简单的流程或者生疏了.那么这里就说说VS 2008 创建MFC程序对话框的步骤.我主要是android开发方面的.平时使用jni调用不少c++代码.所 ...
- cmake编译dcmtk,并利用vs2010 进行开发mfc 程序
这几天要处理 医学图像数据,经同学推荐 采用 dcmtk 关于 编译 dcmtk 是可参考如下blog 1. http://blog.csdn.net/okaimee/article/details/ ...
随机推荐
- WebFlux 集成 Thymeleaf 、 Mongodb 实践 - Spring Boot(六)
这是泥瓦匠的第105篇原创 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-5-thymeleaf ...
- Scala 学习之路(三)—— 流程控制语句
一.条件表达式if Scala中的if/else语法结构与Java中的一样,唯一不同的是,Scala中的if表达式是有返回值的. object ScalaApp extends App { val x ...
- java泛型的作用及其基本概念
一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...
- Python开发【第五篇】: 内置模块
内容概要 二分查找.冒泡 random time os sys pickle json shelve re 1.二分查找和冒泡排序 01. 二分查找 二分查找也称折半查找(Binary Search) ...
- python 基本数据类型之列表
#列表是可变类型,可以增删改查#字符串不可变类型,不能修改,只能生成新的值. #1.追加 # user_list = ['李泉','刘一','刘康','豆豆','小龙'] # user_list.ap ...
- CentOS7搭建LNMP环境
以前写的过时了,重新发一篇新的. 安装PHP 下载官网:https://www.php.net/downloads.php 为了方便,我存了现成的 百度网盘:https://pan.baidu.com ...
- HDU 6207:Apple(Java高精度)
题目链接 题意 给出三个圆上的点,和一个目标的点,问目标点是否在这三个点构成的圆外面. 思路 许久没见过的Java高精度,不要加package!!! import java.math.BigDecim ...
- SPOJ INTSUB - Interesting Subset(数学)
http://www.spoj.com/problems/INTSUB/en/ 题意:给定一个集合,该集合由1,2,3....2n组成,n是一个整数.问该集合中有趣子集的数目,答案mod1e9+7. ...
- Codeforces 730A:Toda 2(multiset模拟)
http://codeforces.com/problemset/problem/730/A 题意:有n个人打天梯,想让这n个人的分数相同,每场比赛必须有2-5个人参赛,参赛的人会降低一分,问一个合理 ...
- python中的 == 和 is 的区别
== 比较的是两边的值 is 比较的是两边的内存地址 通过 id()获取内存地址 小数据池:我们使用过的值存储在小数据池中,供其他数据使用. 小数据池仅限于 数字 和 字符串: 数字的小数池范围 ...