逆向工程核心原理筆記(一)——Hello World-1

逆向工程核心原理筆記(一)——Hello World-1

Ollydbg調試器指令

指令 快捷鍵 含義
Go to ctrl + G 移動到指定地址,用來查看代碼或內存,運行時不可用
Execute till Cursor F4 執行到光標位置,也就是直接轉到要調試的地址
Set/Reset Break Point F2 設置或者取消斷點
Comment ; 添加註釋
Label : 添加標籤

Goto命令

如果要將光標定位到某處,可以執行Go to命令(ctrl + G)如果要將代碼定位到 40104F 可以使用這個命令

在這裏插入圖片描述

之後配合F4可以將程序運行到此處。

設置斷點

在調試代碼的時候可以使用F2設置BP(斷點)在設置斷點之後,當程序運行到斷點的時候,程序將會暫停

在這裏插入圖片描述

使用快捷鍵 ALT + B 可以調出斷點框,列出設置的所有斷點,雙擊這個位置就可以直接跳轉到相應的設置斷點的位置

在這裏插入圖片描述

添加註釋

使用 ‘;’ 可以在相應的地址添加註釋,並且添加後的註釋可以通過查找命令找到,這裏的命令必須在英文狀態下

在這裏插入圖片描述

在調試代碼的時候添加註釋可以讓調試過程變得較爲簡便,如果需要查找註釋,可以在界面右鍵顯示的菜單中選擇 search for -> User-defined comment 中查看所定義的註釋,雙擊註釋姐可以定位到相應位置:

在這裏插入圖片描述

添加標籤

可以通過標籤提供的功能在指定的地址添加特定的功能,通過 ‘:’ 符號添加標籤,即 shift + ;

在這裏插入圖片描述

添加標籤後,可以右鍵顯示的菜單界面選擇 search for -> User-defined label 查看添加的標籤

在這裏插入圖片描述

快速查找指定代碼

在逆向反編譯代碼的時候找到主函數是至關重要的,但是在反編譯代碼的時候 main() 函數並不直接位於可執行文件的 EP 位置上,首先出現的是開發工具自動生成的啓動函數,因此可能真正需要的主函數距離開始的位置很遠,因此,我們需要一些方法來快速的查找到主函數

1.代碼執行法

我們來看下面的代碼編譯出的程序(根據原書程序重新編寫的代碼)

源代碼如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<windows.h>
using namespace std;

int main() {
	MessageBox(NULL, L"Hello World", L"Lpy_Now", 0);
	return 0;
}

運行程序後輸出 MeaasgeBox:

在這裏插入圖片描述

接下來反編譯代碼,將代碼放到 OD 裏面運行,一直按 F8 跳過一些步驟,直到程序彈出這個MessageBox

在這裏插入圖片描述

程序到這一行 1111E2 這裏調用了函數 111000 說明這裏就是主函數,我們使用 ctrl + G 進入 111000 這個函數

在這裏插入圖片描述

這就是我們要找的主函數

在地址 111002 和 111007 這兩個地方分別有一條 PUSH 語句,這兩句分別將 Titlie = “Lpy_Now”, Text = “Hello World” 保存到棧中,並作爲參數傳遞給 MessageBox ,通過上面的方法也能成功的找到主函數。

2.字符串檢索法

OD在第一次載入待調試的程序的時候,都會經歷一個預分析的過程,在這個過程中會查看進程內存,程序中引用的字符串和調用的 API 都會被摘錄出來,並被整理到另外的一個列表中,查找字符串對天十程序很有用。

右鍵,在彈出的窗口中點擊 Search for -> All referenced text strings 可以看到如下窗口:

在這裏插入圖片描述

雙擊即可進入所對應的代碼行,

通過上面的方式也成功的找到了主函數

3.API 檢索法(1):在調用代碼中設置斷點

在 Windows 中,如果需要向顯示器顯示內容,需要使用 Win32 API 向 OS 請求顯示輸出,換言之,應用程序向顯示器的畫面輸出內容的時候,需要在程序的內部調用 Win32 API 當我們觀察一個程序的功能後,就可以大致得推測出程序運行時調用的 API ,如果能進一步查到調用的 Win32 API,就會爲我們得程序調試帶來很大的便利,上面的程序運行後會彈出一個消息窗口,那麼我們就可以推斷出這個程序運行時調用的是 user.MessageBoxW()API

在前面的描述中說過在 OD 對程序的預分析中不僅可以分析出程序使用的字符串,還能摘錄出程序運行時調用的 API 函數列表。如果我們只想查看程序代碼中調用了哪些 API 函數,我們可以直接使用 All intermodular calls 命令,即右鍵在出現的菜單中點擊 Search for -> All intermodual calls 點擊後

在這裏插入圖片描述

由於我們要找的是 MessageBox 這樣的指令,因此在第一行就是這個指令,雙擊這裏也可以找到主函數,因此觀察一個程序的行爲特徵,如果我們能事先推測出代碼使用的 API ,那麼上面同樣是一種不錯的找到主函數的方法。

4. API 檢索法(2):在 API 代碼中設置斷點

儘管在之前的介紹中有介紹 OD 可以爲可執行文件列出 API 函數調用列表,但是如果使用壓縮器/保護器對可執行文件進行壓縮或者保護之後,可執行文件的結構就會發生高邊,這時 OD 就無法列出 API 調用列表了(甚至會讓調試過程變得十分困難)

壓縮器(Run time Packer,運行時壓縮器):壓縮器是一個實用壓縮工具,能夠壓縮可執行文件的代碼,數據,資源等等,與普通的壓縮一樣,經過壓縮器壓縮後的文件本身就是一個可執行文件

保護器:保護器不僅具有壓縮功能,還添加了反調試,反模擬,反轉儲等功能,能夠有效保護進程,如果想仔細分析保護器,那麼分析者需要一些高級逆向分析知識

在這種情況下,DLL 代碼庫被加載到進程內存後,我麼你可以直接想 DLL 代碼庫添加斷點,API 是操作系用對用戶的應用程序提供的一系列函數,用於實現一些文件。簡言之,我們編寫的應用程序執行某種操作的時候,必須使用 OS 提供的 API 向 OS 提供請求,然後與被調用的 API 對應的系統 dll 文件就會被加載到應用程序的進程內存

在 OD 中我們可以先嚐試查看內存映射,在菜單欄中點擊 View -> Memory(或 alt + M) 打開內存映射窗口

在這裏插入圖片描述

我們可以看到 USER32 庫被加載到內存中,我們接下來右鍵的窗口中點擊 Search for -> Name in all modules 可以打開 All names 窗口,點擊 Name 欄目按名稱進行排序

在這裏插入圖片描述

在這裏搜索 MessageBoxW

在這裏插入圖片描述

在箭頭所指的地方,雙擊這個函數,就會顯示這裏的代碼,它在 USER32.dll 中實現。

在這裏插入圖片描述

觀察這裏的地址發現這裏與我們的可執行文件的地址完全不同,我們嘗試在這裏設置斷點(F2),之後繼續執行代碼(F9)

在這裏插入圖片描述

代碼執行到這裏就停了下來,在 1 處的箭頭寄存器窗口中的 ESP 的值爲 00EFF874 它是進程棧的地址,在 2 處的箭頭的棧窗口中可以看到更爲詳細的信息 ESP 地址的 00EFFBB8 處對應一個地址 00FE1014 ,也就是主函數調用完 MessageBox 函數後,程序執行流將返回到這個地址,我們按 ctrl + G 到達這裏

在這裏插入圖片描述

我們發現這段代碼的上面就是我們要找的主函數

B8 處對應一個地址 00FE1014 ,也就是主函數調用完 MessageBox 函數後,程序執行流將返回到這個地址,我們按 ctrl + G 到達這裏

我們發現這段代碼的上面就是我們要找的主函數

以上就是快速查找代碼的四種方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章