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

  • 相关阅读:
    将数组扁平化并去除其中重复数据,最终得到一个升序且不重复的数组
    vue 设计一个倒计时秒杀的组件
    es6之三个点(...)扩展运算符
    es6之解构赋值
    es6之字符串添加的东西
    ES6系列之变量声明let const
    js对数组进行删除
    python学习
    泛型
    随笔
  • 原文地址:https://www.cnblogs.com/leibso-cy/p/leibso.html
Copyright © 2011-2022 走看看