逆向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/ ...
随机推荐
- pip升级到18.0版本过程中报错解决方法
我这台电脑是windows10系统,一般在cmd命令行界面下执行pip的升级命令:pip install –upgrade pip 安装的时候,会有拒绝访问报错:这个时候应该是权限的问题,于是在win ...
- Flutter学习笔记(2)--Dart语言简介
Dart简介: Dart诞生于2011年10月10日,Dart是一种"结构化的web编程"语言,Dart虽然是谷歌开发的计算机编程语言,但后来被ECMA认定位标准,这门语言用于We ...
- 【转】解决Nginx php-fpm配置有误引起的502错误
转自:https://www.centos.bz/2017/07/nginx-php-fpm-502-error/ 在Ubuntu+Nginx+PHP环境下部署好以后,访问网站报错502,在后台ngi ...
- uint16,uint32是什么?
记得之前在刷笔试题的时候就看见过这个问题,发现当时上网百度后又忘了. 最近在看CryEngine3引擎代码的时候又晕了,趁现在赶紧记下来~ 在查看CE3的代码时我发现了这个变量,TFlowNodeId ...
- vue 开发webapp 手机返回键 退出问题
vue 开发webapp 手机返回键 退出问题 mui进行手机物理键的监听 首先安装 vue-awesome-mui npm i vue-awesome-mui 在main.js注册 在index.h ...
- maven的下载与安装,卸载替换eclipse自带的maven
首先呢,博主在这里给大家一个建议,最好不要用eclipse自带的maven.因为这家伙总会出现一些这样那样的错误,比如常见的jar包下载不全或者是install打包报错等等. 博主用了一段时间,还是觉 ...
- HTML和CSS 基本要点必看
今天的课程名称叫HTML和CSS HTML:它是标记语言,全称为超文本标记语言,它不是编译语言.(说白了就是标签) CSS:它是给标签添加样式的,全称为层叠样式表. 想了解这些必须得知道两个东西 一是 ...
- HTTP&HTTPS
主要参考文档:<图解HTTP> HTTP简介 什么是HTTP? HTTP:(HyperText Transfer Protocol),超文本传输协议,是一个基于请求和响应,无状态的,应用层 ...
- K8s集群部署(三)------ Node节点部署
之前的docker和etcd已经部署好了,现在node节点要部署二个服务:kubelet.kube-proxy. 部署kubelet(Master 节点操作) 1.二进制包准备 [root@k8s-m ...
- ffmpeg+nginx将rtsp转为rtmp
一.安装ffmpeg 1.http://ffmpeg.org/download.html下载地址,选择合适的操作系统版本下载,因为我的操作系统是centos7,所以下面的安装都是命令都是针对cento ...