Re: [問題] 列出程式執行時經過哪些address (debug …
※ 引述《mike7788 (@@)》之銘言:
: 如果想要得到程式在執行時,某個時間區段經過哪些address,要怎麼做呢?
: 這個想法來自於cheat engine中的一個功能
: 那個功能可以監控在某個時間區段中
: 哪行程式(in code segment)存取過某個指定的位址(in data segment)
: 然後再將有存取到位址的程式顯示在清單上
: cheat engine有open source,是用delphi寫的
: 那個功能實做在Debugger.pas這個檔案中
: 但是不知道他是怎麼監控到每行程式的
: 讓程式在執行期間和debug模式之間來回切換?
: 還是讓程式自動單步執行呢?
: 我目前是用c在寫這個功能,不過對於程式在執行期間debug的觀念還沒弄清楚
: 想知道這部分是如何做的
: 感謝
Windows 程式,每行CPU指令依序執行,當假設 a.exe 第三行指令 mov dword ptr[eax],1
要寫入資料到記憶體時,發生 "違法記憶體存取" 的例外 (or 異常 or Exception)
作業系統會有個 Exception Dispatcher,會先檢查這個 a.exe 有沒有 debugger,這可以
透過 Windows API 函數 IsDebuggerPresent 去檢查 (其實就是跑到
每個行程對應的 PEB (Process Environment Block) 結構去查詢),如果有偵錯器存在。
那就會馬上傳送 "first chance" 給偵錯器,告訴他哪個地方發生了哪了例外,並詢問
此例外要如何被處理,偵錯器不管有沒有做過手腳,都要會報給 dispatcher 告知這個例
外是「處理完成 (handled)」或「沒處理 (unhandled)」。
如果沒處理,那就看該指令所在的 "stack frame" 裡,是否有安裝「結構化例外處理」
(SEH),其實就是用一個個連結串列,記載好幾個負責處理例外的函數位址,依序去問
每個例外處理函數,叫他們 return 說是否要處理這次這個例外。
不管怎樣這次如果大家還是都無法處理此例外,那就會發起 "second chance",給 a.exe
對應的 debugger 第二次機會去處理這個例外。
這是有差別的,debugger 可以決定 first chance 時只偷偷動手腳做一些處理,但是回傳
unhandled,等到 sencond chance 時才真正去處理該例外。
如果該例外太冷門,a.exe 還是不知道或無法解決掉,那就回傳 unhandled 給 OS。
這個時候因為大家都沒辦法處理,就會去 Windows 查一個名叫 AeDebug 的機碼值,
裡面記載了整個作業系統負責處理最終 exception 的 debugger,如果沒安裝 Visual
Studio,預設是丟給 Dr. Watson (drwtsn32.exe -i),他會把一些暫存器跟指令記錄
下來,然後問使用者要不要回報錯誤給微軟,然後把 a.exe 強行終止掉。
明白整個例外的發生過程後,假設你要監視 a.exe 有存取過哪些記憶體位址,首先須由
你的程式來 CreateProcess() 去啟動 a.exe,並且在參數 fdwCreate 裡面啟用
DEBUG_PROCESS 這個 flag。當使用 CreateProcess() 啟動成功後,下一行就要用
無窮迴圈不斷去呼叫 Windows API 函數 WaitForDebugEvent()
詳細教學看:
http://www.cnblogs.com/ahuo/archive/2007/01/08/614727.htm
重點在於你要替 a.exe 的每行指令下中斷點,你要找到他每行指令的起始記憶體位址
然後寫入 0xCC 並且記錄下原本的正確數值為何,以在稍後觸發中斷異常。
假設現在執行到 a.exe 的第 n 行指令了,因為你先前已經把該行指令的第一個位元組
改成 0xCC,所以 CPU 原本要執行第 n 行指令可以正常跑,現在就變成軟體中斷異常,
接著 OS 把 first chance 事件傳給你寫的 debugger。
此時你要從目前的暫存器內容跟指令內容去分析第n行指令的「原始指令內容」是要存取
哪個位址,將其記錄下來,再把原本的第n行指令還原回去,讓 EIP 還是決定下次要執行
的指令是 a.exe 的第 n 行,並且告知 Dispatcher 這個例外已經 handled 可以回去
重新跑 a.exe 了。
以此類推,第 n+1 行也是一樣的「0xCC中斷->記錄哪個位址被存取->還原原址令」
作者 purpose (purpose) 看板 Programming
標題 [情報] 深入研究 Win32 結構化例外處理 (SEH)
時間 Mon Nov 1 12:42:57 2010
───────────────────────────────────────
文章內容的完整網頁格式:
http://www.mediafire.com/?euzej6fo0djj6k8
http://www.megaupload.com/?d=FZAX3YZX
觀看方法:
解壓縮到任意目錄,假設「D:\」,執行「D:\20101101013730\index.html」。
如果有安裝 ScrapBook Plus (1.8.17.31),使用匯入功能,
匯入資料夾選擇 D:\ 即可匯入文章。
====
11/12 補充:
國外高手 Peter Van Eeckhoutte 寫了一系列的 Exploit 入門文章,其中有一篇
教導如何破解 Windows 的防護機制:Stack Cookies, SafeSeh, SEHOP, HW DEP and ASLR
文章名為:〈Exploit writing tutorial part 6 : Bypassing Stack Cookies,
SafeSeh, SEHOP, HW DEP and ASLR〉
網址:http://tinyurl.com/yz9m7m6
相當推薦這篇!
另外大陸人有中文翻譯,在看雪:
http://bbs.pediy.com/showthread.php?t=102719
大合集,包含上面那篇,改抓這吧:
http://bbs.pediy.com/showthread.php?t=123602
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.143.116
推
11/07 22:10, , 1F
11/07 22:10, 1F
推
11/07 22:11, , 2F
11/07 22:11, 2F
推
11/07 22:24, , 3F
11/07 22:24, 3F
→
11/07 23:13, , 4F
11/07 23:13, 4F
推
11/07 23:22, , 5F
11/07 23:22, 5F
推
11/07 23:23, , 6F
11/07 23:23, 6F
推
11/07 23:24, , 7F
11/07 23:24, 7F
推
11/07 23:41, , 8F
11/07 23:41, 8F
→
11/08 00:11, , 9F
11/08 00:11, 9F
→
11/08 00:12, , 10F
11/08 00:12, 10F
→
11/08 00:13, , 11F
11/08 00:13, 11F
→
11/08 00:20, , 12F
11/08 00:20, 12F
推
11/08 00:20, , 13F
11/08 00:20, 13F
→
11/08 00:58, , 14F
11/08 00:58, 14F
→
11/08 00:59, , 15F
11/08 00:59, 15F
→
11/08 00:59, , 16F
11/08 00:59, 16F
→
11/08 03:23, , 17F
11/08 03:23, 17F
→
11/08 03:23, , 18F
11/08 03:23, 18F
→
11/08 03:23, , 19F
11/08 03:23, 19F
推
11/08 09:37, , 20F
11/08 09:37, 20F
※ 編輯: purpose 來自: 124.8.140.76 (11/08 09:58)
※ 編輯: purpose 來自: 124.8.131.209 (11/12 17:13)
※ 編輯: purpose 來自: 124.8.131.209 (11/12 17:40)
推
11/15 18:37, , 21F
11/15 18:37, 21F
推
11/17 07:48, , 22F
11/17 07:48, 22F