经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Windows » 查看文章
逆向MFC程序
来源:cnblogs  作者:leibso二狗  时间:2019/7/29 9:02:24  对本文有异议

@

1 MFC执行流程

1.1 环境支持

  • vs 2017
  • afxwin.h,afxcdialogex.h

1.2 分析

? 在 vs 调试窗口中 有一个“反汇编窗口”,同样也可以下断点,步过步入等。

则可以汇编层可以详细的 步过/步入 每一个 详细的步骤---得以知道详细的系统/库的API调用、获取栈回溯情况等等

1.3 实践探索

1.3.1 创建一个MFC程序

主要重写CWinApp::InitInstance() 和 自定义个一个对话框类(以实现一个简单界面)

注意: 对话框资源文件我没列出来,因为只有一个对话框和一个按钮点击

我的Demo如下:

  • 自定义程序入口
  1. //CMyWinApp.cpp
  2. #include "mywinapp.h"
  3. #include"wndDlg.h"
  4. myWinapp App;
  5. myWinapp::myWinapp(){}
  6. myWinapp::~myWinapp(){}
  7. BEGIN_MESSAGE_MAP(myWinapp,CWinApp)
  8. END_MESSAGE_MAP()
  9. BOOL myWinapp::InitInstance()
  10. {
  11. wndDlg * TWND = new wndDlg;
  12. m_pMainWnd = (CDialog*)TWND;
  13. TWND->DoModal();
  14. CWinApp::InitInstance();
  15. return 0;
  16. }
  • 自定义对话框
  1. // wndDlg.cpp: 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "wndDlg.h"
  5. #include "afxdialogex.h"
  6. #include"resource.h"
  7. // wndDlg 对话框
  8. IMPLEMENT_DYNAMIC(wndDlg, CDialogEx)
  9. wndDlg::wndDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG1, pParent){}
  10. wndDlg::~wndDlg(){}
  11. void wndDlg::DoDataExchange(CDataExchange* pDX)
  12. {
  13. CDialogEx::DoDataExchange(pDX);
  14. }
  15. BEGIN_MESSAGE_MAP(wndDlg, CDialogEx)
  16. ON_BN_CLICKED(IDC_BUTTON1, &wndDlg::OnBnClickedButton1)
  17. END_MESSAGE_MAP()
  18. // wndDlg 消息处理程序
  19. void wndDlg::OnBnClickedButton1()
  20. {
  21. MessageBox("hello Leibso-HUANGHAI/黄海");
  22. }

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())

那在刚才的反汇编窗口中找到关键汇编代码,行数越多越精确

注:关键代码 不能包含地址之类的这样可能会出问题,因为可能会有重定位之类数据不确定的问题

如图:

在这里插入图片描述

那:

这几条语句就可以作为我们的特征码

  1. mov eax,dword ptr [edx]
  2. mov esi,esp
  3. mov ecx,dword ptr [eax+58h]
  4. mov dword ptr [ebp-24h],ecx
  5. mov edi,esp
  6. mov ecx,dword ptr [ebp-24h]

2.2 使用调试工具(OD) 搜索特侦码

使用OD动态调试 搜索以下代码序列,就可以得到这个函数的地方了

如图:

在这里插入图片描述

之后就可以下断点 动态分析了

咐语

其他平台程序的逆向也可以使用这种方法:搭建平台-->写一个Demo程序-->熟悉流程-->找目标特征码

原文链接:http://www.cnblogs.com/leibso-cy/p/leibso.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号