Windows 有 IsDebuggerPresent API 可以讓程式知道自己是不是正在被 debug.
其實這個 API 就是去 PEB 裡面讀取 BeingDebugged 欄位.
程式也可以自己取得 PEB 位址, 然後讀取 BeingDebugged 欄位, 而不呼叫 API.
免得很容易就被人 bypass.
除了 BeingDebugged 欄位外, PEB 還有 NtGlobalFlag 欄位可以檢查是否被 debug.
GetStartupInfo API 也可以用來 anti debug, 因為被 Ollydbg lunch 的程式
StartupInfo 裡面的 dwFlags 會跟被 explorer lunch 起來的不一樣.
Reference:
http://www.codeproject.com/Articles/29469/Introduction-Into-Windows-Anti-Debugging
2014年7月7日 星期一
2014年6月25日 星期三
Debug 程式好用的指令 EB FE
0xEBFE 是一個短跳指令, 作用是跳到這個指令原本的位址
可以看做是單一指令的 infinite loop
有時候想 attach debugger 到某個程式時可以先把 EP 改成 EBFE
等程式在這邊 loop 時再 attach 上去就好了
可以看做是單一指令的 infinite loop
有時候想 attach debugger 到某個程式時可以先把 EP 改成 EBFE
等程式在這邊 loop 時再 attach 上去就好了
2014年6月16日 星期一
Debug custom exception filter set by SetUnhandledExceptionFilter
SetUnhandledExceptionFilter 可以讓程式設定自定義的頂層 exception filter
用來處理程式中未被處理的 exception
之前想要 debug 這種 custom exception filter, 但用 debugger 開啟程式後卻怎麼也跑不到
查了後才發現這是 MS 的設計
MSDN 上的描述:
A pointer to a top-level exception filter function that will be called whenever the UnhandledExceptionFilter function gets control, and the process is not being debugged. A value of NULL for this parameter specifies default handling within UnhandledExceptionFilter.
不過為什麼要有這麼奇怪的設計? 真的讓人猜不透
如果只有執行檔沒有 source code 時要怎麼 debug?
幸好網路上早有了怎麼 bypass 的方法,
UnhandledExceptionFilter 是呼叫 NtQueryInformationProcess 檢查程式是否正在被 debug 的
所以只要改掉 NtQueryInformationProcess 回傳的值就好了
Reference:
http://evilcodecave.wordpress.com/2008/07/24/setunhandledexception-filter-anti-debug-trick/
用來處理程式中未被處理的 exception
之前想要 debug 這種 custom exception filter, 但用 debugger 開啟程式後卻怎麼也跑不到
查了後才發現這是 MS 的設計
MSDN 上的描述:
A pointer to a top-level exception filter function that will be called whenever the UnhandledExceptionFilter function gets control, and the process is not being debugged. A value of NULL for this parameter specifies default handling within UnhandledExceptionFilter.
不過為什麼要有這麼奇怪的設計? 真的讓人猜不透
如果只有執行檔沒有 source code 時要怎麼 debug?
幸好網路上早有了怎麼 bypass 的方法,
UnhandledExceptionFilter 是呼叫 NtQueryInformationProcess 檢查程式是否正在被 debug 的
所以只要改掉 NtQueryInformationProcess 回傳的值就好了
Reference:
http://evilcodecave.wordpress.com/2008/07/24/setunhandledexception-filter-anti-debug-trick/
2013年11月24日 星期日
硬件中斷點, 軟件中斷點, 內存中斷點的分別
硬件中斷點: CPU 中會有一些特殊暫存器是用來做中斷用的, 通過設定這些硬體中斷佔存器的中斷 方式就是硬體中斷 軟件中斷點: 把記憶體中想要中斷的的指令的第一個 byte 改成 0xCC (int 3), 則 CPU 執行到這個指令時會產生中斷 debugger 此時再把原本的指令寫回記憶體, 這種方式叫軟件中斷點 內存中斷點: 把想要下斷點的記憶體頁面屬性改變 如果是內存寫斷點 改為 RE, 可讀, 可執行 如果是內存存取斷點 改為 NO ACCESS, 不可存取
WinDBG 一些指令筆記
uf
反組譯函式
ex:
uf kernel32!LoadLibraryW
u
反組譯某個位址
ex:
u 0x400000
!PEB
dump 出 PEB 內容
!TEB
dunp 出 TEB 內容
dt _PEB
印出 PEB 結構
bp
設定中斷點
ex:
bp kernel32!LoadLibraryW
當程式碼在 debug 中被修改, 函式位址有可能會改變, 但是用 bp 下的中斷點不會隨著更新
bu
設定中斷點
ex:
bu kernel32!LoadLibraryW
當 debug 過程中函式位址改變, 用 bu 下的中斷點也會隨著更新
反組譯函式
ex:
uf kernel32!LoadLibraryW
u
反組譯某個位址
ex:
u 0x400000
!PEB
dump 出 PEB 內容
!TEB
dunp 出 TEB 內容
dt _PEB
印出 PEB 結構
bp
設定中斷點
ex:
bp kernel32!LoadLibraryW
當程式碼在 debug 中被修改, 函式位址有可能會改變, 但是用 bp 下的中斷點不會隨著更新
bu
設定中斷點
ex:
bu kernel32!LoadLibraryW
當 debug 過程中函式位址改變, 用 bu 下的中斷點也會隨著更新
訂閱:
文章 (Atom)