逆向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");
}

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程序-->熟悉流程-->找目标特征码

首先关于 [评价可免费] 的严重声明: 一、评价=评论加评价(评星星); 二、评价必须是下载完了该资源后的评价,没下载就评论无效; 三、如果正确评价了,返还积分可能需要等等,系统需要反应下。呵呵 评论时记得要评分。然后会返回给你花费的分再加1分.理论上有十分就可以下载完所有的资源了。一般人我不告诉他。 MFC 程序逆向 – 消息篇(上) 作者:szdbg Email:szdbg@sina.com 前言: 记得前一段时间,我刚接触软件破解和逆向这一行时,对于一些软件不知从何处跟踪按钮消息,试了好多方法,就是断 不下来,在系统模块中经常转得晕头转向,而一无所获。 MFC 程序是一种常见类型的程序,我静下心来,潜心研究了一下MFC 消息流程。弄清原委之后,一切豁然开朗,发现跟 踪MFC 程序和消息处理原来是如此。。。,跟踪按钮事件处理也由此变得特别简单。 于是,我将这些研究整理成文,以备后忘。并希望大家有所帮助,失误之处,请高手指正。 的确, .Net之类的程序必定是大势所趋,不过,就目前来说,MFC程序在软件市场还是占有重要的一席之地,所以,了解它,对于逆向和破解此类程序还是很有必要的. MFC之所以显的复杂,就在于它隐藏了它的消息的处理机制,可以说, 程序员基本上不需要懂得它的消息处理过程,就可以写出一套满足应用的软件来.这有好有坏,好的是大大简化了程序员写程序的过程,坏的一方面是,给一般程序员留下了一个迷团: 我只知道这样做,而不知道为什么这样做.心里老是觉得不踏实.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值