2016-03-19 80 views
-1

我想要做的是在我指定的模塊調用的nt中的所有函數上設置條件斷點。在模塊調用的所有函數上設置條件斷點? (WINDBG x64)

我這樣做的目標是每次調用X模塊調用x nt函數時調用callstack,從而能夠「映射出」obfoundedated代碼中發生了什麼。

打破入口點後,我在x nt函數上設置了一個斷點。恢復我的斷點之後被擊中,並調用堆棧看起來像

!NT功能

moduleIspecified!0x123的

....

我的想法在那時,我可以用這個來寫一個條件斷點的代碼,如下所示:「如果調用者是x模塊,並且模塊正在調用y模塊內的函數,那麼請記錄調用堆棧」。

值得注意的是,在x64內核模式下不支持watch和trace。 其值得一提的是,我決定採用這種方法,因爲我無法通過靜態分析來確定調用,並且通過逐步分析也不是可能的。

還有:會有更好的/理想的方法來實現這一目標嗎?

問候

回答

1

你不能這樣做,確切的說,但也有可能會考慮一些替代品。

首先 - 爲什麼不簡單地使用Sysinternals' Process Monitor或者Rohitab's API Monitor

如果你決定自己做,你面臨的第一個問題是內核調試器可以設置的斷點數有很小的限制(32是我記得的最後一個數)。此限制不是由主機WinDbg/kd引起的,而是由於目標計算機中的內核調試器組件造成的。你可以在WRK中看到這個。但即使可以,它也會非常緩慢。

你的第一個選擇是,但在syscall/sysenter例程(nt!KiFastCallEntrynt!KisystemCall64,或不管它是今天)斷點,並有把你的命令。正如我所說,這將是非常慢。如果你不相信我,那麼歡迎自己嘗試一下(即使沒有聰明的條件,只要在那裏放置任何命令,即使只是簡單的gc,也不要說.echo ...)。

我能想到的第二種方法是編寫一個驅動程序來掛鉤您感興趣的系統調用(或者例程syscall)。這爲您節省了主機和目標機器之間的往返程序。請注意,您仍然需要附加一個調試器來禁用KPP(PatchGuard)或使用32位機器。這可能比使用ProcMon,API Monitor或xperf/WPT更復雜。

我會建議使用簡單明瞭的東西(ProcMon/API監視器)之前去過於複雜的東西。

相關問題