Re: [問題] 列出程式執行時經過哪些address (debug …

看板C_and_CPP作者 (purpose)時間13年前 (2010/11/07 22:08), 編輯推噓11(11011)
留言22則, 12人參與, 最新討論串1/1
※ 引述《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
推!剛才看到這個主題就知道該交給 purpose 大了
11/07 22:10, 1F

11/07 22:11, , 2F
認真推 :)
11/07 22:11, 2F

11/07 22:24, , 3F
感謝purpose大!!!
11/07 22:24, 3F

11/07 23:13, , 4F
今天時間不多,打得較隨便。但大方向觀念與關鍵字應該沒錯
11/07 23:13, 4F

11/07 23:22, , 5F
現在才知道SEH是幹嘛的,那些函數有辦法自訂?
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
自己在C++寫一個例外處理函數,然後用 inline asm 比如
11/08 00:11, 9F

11/08 00:12, , 10F
push myhandle 再 mov dword ptr fs:[0], esp 就會讓自己
11/08 00:12, 10F

11/08 00:13, , 11F
寫的函數變成SEH那串裡面第一個例外處理函數
11/08 00:13, 11F

11/08 00:20, , 12F
剛推文講錯,有漏,看這篇吧 http://tinyurl.com/25vx8zl
11/08 00:20, 12F

11/08 00:20, , 13F
不 是 很 懂...XD
11/08 00:20, 13F

11/08 00:58, , 14F
剛有人問說安裝自己的handler失敗,編譯時會有C4733警告
11/08 00:58, 14F

11/08 00:59, , 15F
那是微軟新版的分配器會檢查SEH的鍊結串列裡面的函數是否
11/08 00:59, 15F

11/08 00:59, , 16F
從合法的方式安裝。這樣就行 cl se.cpp /link/SAFESEH:NO
11/08 00:59, 16F

11/08 03:23, , 17F
#1CpaLJIh (Programming) [ptt.cc] [情報] 深入研究 Win3
11/08 03:23, 17F

11/08 03:23, , 18F
2 結構化例外處理 (SEH)
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
文章代碼(AID): #1CrhBn5J (C_and_CPP)