逆向工程,調試Hello,World ! 程序(更新中)
逆向分析法
靜態分析法
是在不執行代碼文件的情形下,對代碼進行靜態分析的一種方法。并不執行代碼,而是觀察代碼文件的外部特征,獲取文件的類型,大小,PE頭信息,內部字符串,是否運行時解壓縮等。
動態分析法
是在程序文件的執行過程中對代碼進行動態分析的一種方法,它通過調試來分析代碼流,獲得內存的狀態等。
雖然代碼調試過程在代碼逆向分析過程中占據很大比重,但它只是代碼逆向分析的一個從屬概念
調試hello world 程序
代碼
#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR * argv[])
{
MessageBox(NULL,"Hello World!","張軒瑞",MB_OK);
return 0;
}
開始調試
用OllyDbg調試工具打開程序
左上 代碼窗口
- 默認用于顯示反匯編代碼,還用于顯示各種注釋、標簽,分析代碼時顯示循環、跳轉位置等信息。
右上 寄存器窗口
- 實時顯示CPU寄存器的值,可用于修改特定的寄存器。
左下 數據窗口
- 以Hex/ASCII/Unicode值的形式顯示進程的內存地址,也可在修改內存地址。
右下 棧窗口
- 實時顯示ESP寄存器指向的進程棧內存,并修改。
OllyDbg 基本指令 (適用于代碼窗口)
項目 | Value | 含義 |
---|---|---|
Restart | Ctrl+F2 | 重新開始調試 |
Step Into | F7 | 執行一句OP code (操作碼),若遇到調用命令(CALL),將進入函數代碼內部 |
Step Over | F8 | 執行一句OP code (操作碼),若遇到調用命令(CALL),僅執行函數自身,不跟隨進入 |
Execute till Return | Ctrl+F9 | 一直在函數代碼內部運行,直到遇到RETN命令,跳出函數 |
設置斷點的四種方法
1.goto 命令
執行Go to(Ctrl + G) 命令,打開一個“輸入跟蹤表達式”的對話框。
在文本框中輸入“地址”。
光標自動定位到該地址處,執行F4命令,讓調試流運到此處,然后從該處調試。
2.設置斷點
可以設置BP(Break Point,斷點) (快捷鍵F2)
設置斷點后,運行到斷點處就會暫停。
可以打開Breakpoints框(ATL+B)查看設置的斷點。
雙擊某個斷點會直接跳轉到相應位置。
3.注釋
按鍵盤上的“;”可以添加注釋
同時也可以查找到他。
4.標簽
我們也可以通過標簽提供的功能在指定地址
比如在00401BF0中設置標簽,main func
因為00401385處調用00401BF0的函數,所以就會顯示,main func
標簽和注釋一樣也可以檢索
快速查找指定代碼的四種方法
調試代碼時,main()函數并不直接位于可執行文件的EP位置上,出現在此的是開發工具生成的啟動函數。
(EP是windows可執行文件(EXE,DLL,SYS等)的代碼入口點,是執行應用程序時最先執行的代碼的起始位置,它依賴于CPU。)
1. 代碼執行法
逐條執行指令來查找需要查找的位置。代碼執行法僅使用于被調試的代碼量不大、且程序功能明確的情況。
2.字符串檢索法
直接查找字符串。
尋找所需要的字符串,然后雙擊。
3.在調試代碼中設置斷點
查找->所有模塊間的調用
查看調用了那些函數
4.在API代碼中設置斷點
打開“所有模塊中的名稱”并敲下MessageBox,光標會直接定位。
使用“打補丁”方式修改“hello world!”字符串
修改字符的兩種方法
1.直接修改緩沖區
我在搜索的時候,發現注釋hello world的地方更改沒有用。
找到主函數后,設置斷點。
然后按F4,進行調試。
在右下方站窗口找到ASCII碼“hello world”。
然后雙擊查看,進入數據窗口,去更改緩存區。
去更改,hello world 改成 hello rever
盡量不要用更長的字符串,覆蓋原字符串,這樣會使數據遭到破壞。
改完之后,去運行程序,之后就會彈出窗口。
我們發現以前的hello world 變成了 hello rever。
保存更改到可執行文件
上面的調試中,我們通過修改字符串緩沖區更改了程序顯示的消息內容,但是這種更改只是暫時的,我們終止調試的時候。程序中的原字符串沒有改變。如果想保存下來,就要把更改后的程序保存一個可執行文件。
- 在左下數據窗口中,選中更改后的字符串,點擊鼠標右鍵,在彈出的菜單中選擇“復制到可執行文件”,然后點擊“備份”——>“保存到數據文件”然后輸入文件名保存為exe文件。
當我們打開這個已經保存好的文件的時候,彈出的字符串變成了“hello rever”。