跳到主要內容

OllyDbg教學(二) -- Hello, World!解析

這次我們的目標是透過觀察Hello World程式,來了解使用OllyDbg的一般流程。

原始程式代碼如下:

編譯指令: gcc -o main.exe main.c

原始碼 main.c:
編譯後產生的main.exe,直接用OllyDbg載入即可。

首先我們預期從第一條指令開始就是我們寫的main函式的內容,因此我們就一路F8看看到底是如何,讓人驚訝的是,你會看到一堆跟main毫不相關的指令 !

其實gcc對入口點(entry point)的選擇順位是這樣的:
1.linker的 -e選項
2.連結腳本的 ENTRY 命令
3.若有定義 _start 符號,使用 _start符號值
4.若存在 .text 區段,使用 .text區段第一個位元組的位址
5.使用 0

根本沒有一個將main定義為入口! 那程式的入口在何處? 查了一下文件,mingw下的入口點通常為叫做 mainCRTStartup 的函式,因此我就翻出了 mingw 的源碼,經過翻找後,終於在 crtexe.c找到了 mainCRTStartup 的定義,跟反組譯碼對照,果然沒錯。有興趣的話可以自記trace一下:

crtexe.c

mainCRTStartup會初始化 c runtime library,使我們能夠在main中使用 crt 所提供的函式。在初始化完成後, mainCRTStartup會呼叫 main 函式,並且在 main 返回之後,呼叫 exit() 結束程式。

因此我們從頭開始,試著一步一步執行,看看 main在什麼地方。
我們先略過 crt 初始化的部分不談,我們很快地可以發現,程式在這裡停了下來:
    0x004013D9 CALL 0x00401610

因此我們在這裡按F2下斷,重新執行程式,並跟進這個call,果然就是我們寫的 main函式:
0x00404064就是字串的位址,我們接下來試著將Hello World訊息改為 "Hacked!"。
首先用滑鼠點一下下方的記憶體窗口,之後按下 Ctrl + g,輸入字串的位址後按enter,我們可以發現記憶體的內容就是我們要找的字串:


接著我們將整個字串反白,按下 Ctrl + e 編輯字串,將在串改為 "Hacked!,並在後面加上一個zero byte做結尾,完成後案F9執行,就可以看到剛剛修改後的訊息了:


若想要將對執行檔的修改保存起來,可以在記憶體視窗中按右鍵->Edit->Copy all modifications to Executable,之後會跳出一個視窗,在那個視窗按右鍵->Save File,就可以將修改存檔,或是寫到一個新的執行檔。

留言

這個網誌中的熱門文章

muv漢化補丁修復

muv的漢化補丁對Win10會有相容性問題,這自從補丁發佈到現在,漢化組都沒有修正的意思,這問題也折騰我好一陣子了,最後決定還是自己debug比較實際。 其實解決方法意外的簡單,不過追蹤的過程挺有趣的,也讓我學到了一個hook的實作方法。 在win10下啟動漢化補丁會出現下面這個對話框:

BGI引擎概論

BGI全名 Buriko General Interpreter,別名Ethornell,為Buriko公司所開發的遊戲引擎。 較著名的例子有: Lump of Sugar全系列 SMEE近期新作 AUGUST近期新作 HOOKSOFT近期新作 由於沒有公開SDK,網路上幾乎沒有正式的相關內部資訊。 若要做漢化,這篇是很好的入門: Galgame 汉化破解初级教程:以 BGI 为例,从解包到测试

OllyDbg教學(一) -- 基本操作

這篇簡單介紹一下OllyDbg的用法,還有一些使用上的技巧,這邊假設讀者對程式的執行已經有一定的了解。 OllyDbg 1 主頁 OllyDbg 2 主頁 要用OllyDbg來debug一個程式有兩種方法,第一種是直接以OllyDbg啟動程式,另一種則是先啟動程式,在用OllyDbg附加到執行中的程式。一般用第一種方法就可以成功,第二種方法通常用於一些需要特殊啟動環境的程式。