zoukankan      html  css  js  c++  java
  • 逆向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程序-->熟悉流程-->找目标特征码

  • 相关阅读:
    tfs2012服务器搭建报表、门户、TFS权限设置
    遥望星空FTP文件同步工具(附源码)1.0 发布
    TortoiseGit连接gitlab,一直要求输入密码
    static、const、readonly与static readonly的区别与联系
    sql server对并发的处理乐观锁和悲观锁
    asp.net控件开发基础系列
    Sonne的健身日志(15)16周腹肌计划第四周感受
    上海新闻!
    Sonne的健身日志(9)16周腹肌计划第一周(2012.3.92012.3.15)
    Sonne的健身日志(5)
  • 原文地址:https://www.cnblogs.com/leibso-cy/p/leibso.html
Copyright © 2011-2022 走看看