@
目录

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程序的更多相关文章

  1. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(03)

    1.3.2 MFC如何使用应用程序对象 MFC程序没有main函数,没有WinMain函数,到底是什么启动了程序的运行? 一个MFC提供的源代码中(Winmain.cpp)包含了一个AfxWinMai ...

  2. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(01)

    #include <afxwin.h> class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; cl ...

  3. MFC程序执行顺序 .

    1.创建Application object对象theApp 程序一开始生产一个(且只有一个)Application object对象theApp,也即一个CWinApp对象,这个全局对象一产生,便执 ...

  4. vs2010的“应用程序向导”新建MFC程序报错“当前页面的脚本发送错误”

    原创文章,欢迎阅读,禁止转载. 问题现象不知道从什么时候开始,我的vs2010不能新建MFC程序了,报错如图:... 解决方法根据提示排查,发现是应用程序向导的相关html被损坏了.从同事电脑上把   ...

  5. MFC程序中使用调试宏ASSERT()、ASSERT_VALID()、VERIFY()和TRACE()的区别

    其实这篇文章说的很明白了:http://dev.gameres.com/Program/Other/DebugMacro.htm 结论如下: 1.ASSERT()测试它的参数,若参数为0,则中断执行并 ...

  6. 孙鑫MFC学习笔记3:MFC程序运行过程

    1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...

  7. [MFC] 如何更改MFC程序图标

    方法一: >_<:找一张ICO图标,替换programname/res/programname.ico文件,就可以啦,这时候你运行后得到的图标可能还是原来MFC的默认图标,这时候你只要把工 ...

  8. VS 2008 创建MFC程序对话框的步骤

    用过不少编程语言,可是刚开始学的时候最容易忘记一些简单的流程或者生疏了.那么这里就说说VS 2008 创建MFC程序对话框的步骤.我主要是android开发方面的.平时使用jni调用不少c++代码.所 ...

  9. cmake编译dcmtk,并利用vs2010 进行开发mfc 程序

    这几天要处理 医学图像数据,经同学推荐 采用 dcmtk 关于 编译 dcmtk 是可参考如下blog 1. http://blog.csdn.net/okaimee/article/details/ ...

随机推荐

  1. HTML连载16-颜色控制属性2&标签选择器

    一.颜色控制属性(上接连载15) (4)十六进制 在前端开发中通过十六进制来表示颜色,其实本质就是RGB,十六进制中是通过每两位表示一个颜色. 例如:#FFEE00,其中FF代表的是R,EE代表的G, ...

  2. 玩转Java多线程(Lock.Condition的正确使用姿势)

    转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...

  3. java方法中Collection集合的基本使用与方法

    集合类的由来,对象用于封闭特有数据,对象多了需要存储,如果对象的个数不确定就使用集合容器进行存储. 集合特点:1.用于存储对象的容器.2.集合的长度是可变的.3.集合中不可以存储基本数据类型值. 集合 ...

  4. Python基础(七) 闭包与装饰器

    闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...

  5. Redis相关面试题

    Reids:单线程+io多路复用机制 Redis与Memcached的区别: 一.memcached值是简单字符串,redis支持hash.set.list等复杂数据类型 二.redis可持久化数据, ...

  6. 进程以及进程通信(IPC)类型

    这里用我有限的知识来解释同时参考了一些其他博主的子类,希望能给与一部分入门的朋友一个清晰的理解,有问题之处还请指出 首先简单谈一下什么是进程? 答:进程是装入内存运行的程序段,是许多的系统对象拥有权的 ...

  7. git push 时 failed to push some refs 的解决方案

    我们在利用 GIt 上传代码的时候,往往会遇到这样一个问题,导致我们的代码没有办法正常上传到仓库中 造成这个问题的原因其实很简单,就是因为远程仓库和本地库不一致. 基于这样的一个问题,解决办法自然也就 ...

  8. 【Linux杂记】screen命令

    screen命令: 解决的问题:有些进程启动后,一旦断开ssh容易断掉,所以新建一个screen(可以理解成窗口)并行运行 守护进程的方式:linux守护进程的方式实现开机启动某些特定的程序 屏幕命令 ...

  9. Appcan 日期控件

    某个页面的onclick事件 <div id="topSendDate" class="ub ub-f1" onclick="appcan.wi ...

  10. HTML end~

    一.浏览器的兼容问题(关于浏览器的兼容问题 有很多大佬已经解释的很清楚了 这个得自己百度去多花点时间去了解 这里咱们只说一下前面的漏点) 浏览器兼容性问题又被称为网页兼容性或网站兼容性问题,指网页在各 ...