@[toc] 1 MFC執行流程 1.1 環境支持 vs 2017 afxwin.h,afxcdialogex.h 1.2 分析 在 vs 調試視窗中 有一個“反彙編視窗”,同樣也可以下斷點,步過步入等。 則可以彙編層可以詳細的 步過/步入 每一個 詳細的步驟 得以知道詳細的系統/庫的API調用 ...
目錄
@
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程式-->熟悉流程-->找目標特征碼