逆向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程序-->熟悉流程-->找目標特征碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM