簡體   English   中英

使用windbg在內核模式下調試時,如何在程序的入口點中斷?

[英]How to break on the entry point of a program when debug in kernel mode with windbg?

我想在內核模式下調試程序,並且想破壞該程序的入口點,例如ollydbg 但是我不能用bp破壞它,因為程序沒有啟動並且符號不能被加載。 我找到了一些方法來做,但是我認為不是很好。

1.中斷內核中的CreateProcess函數。 但是我不知道應該確切地中斷哪個功能,我認為CreateProcess和程序的入口之間還有很長的路要走。

2.使用cc更改程序的入口點。 但是它需要其他工具,我應該在字節變回原處更改代碼。 我覺得這很煩人。

3.借助ollydbg 在用windbg調試的虛擬機中用ollydbg調試程序。 我認為這不是一個好主意。

4.使用sxe ld 可以在<<Advanced Windows Debugging>> Listing 3.29中找到它。 我已經嘗試過,但發現它僅在第一次使用時有效。 而且我不知道休息后我該怎么辦。

5.使用bu中斷輸入功能。 但是我也不知道我該怎么做。 例如,如何加載符號?

6.使用.create 我不知道我說的話是否正確。

我認為使用windbg在內核模式下進行調試時,通常會中斷程序的入口,而使用強大的windbg則必須有一種好的方法。 最好的方法是什么?

順便說一下,我想在內核模式下調試程序,因為我想獲得程序的令牌值。 我發現在用戶模式下,windbg可以使用!token來識別令牌,但是我不知道如何在用戶模式下獲取令牌的值。 看來我只能在內核模式下獲得令牌的值,對還是錯?

您可以通過ntsd -d在目標中運行任何exe,以從主機中運行的內核模式調試器對其進行調試

假設您正在myhost中運行虛擬機mytarget

在myhost中安裝windbg
設置myhost viz srv * x:\\ xxxx * http:\\ xxxxxxxxxxxx的符號路徑
在主機中創建內核連接(選擇下面顯示的最好的是串行連接)

X:\\ xxxx \\ windbg.exe -k com:pipe,port = \\\\。\\ pipe \\ debugPipe,resets = 0,重新連接

在mytarget中安裝windbg
打開共享文件夾z:\\指向myhost中的symbolcache文件夾,在mytarget中設置symbolpath指向共享文件夾,運行ntsd -d calc.exe

輸入提示時,kd將在calc.exe的$ exentry斷開

只要顯示輸入提示,您就像本地用戶模式調試器一樣使用kd,因此,如果您設置bp calc!Winmain並發出g kd,將在calc.exe winmain上中斷

進入kd會話使用.breakin

雜亂無章的東西,但是一旦習慣了就可以很好地工作(即記住文檔)

樣品運行

kd> g   <-------------- kd session running in myhost

CommandLine: calc.exe 
Symbol search path is: srv*z:\
*http://msdl.microsoft.com/download/symbols

ntdll!DbgBreakPoint:
7c90120e cc              int     3

.sympath
NOTE: The symbol path for this ntsd is relative to where
ntsd.exe is running, not where kd.exe is running.
Symbol search path is: srv*z:\
*http://msdl.microsoft.com/download/symbols
Expanded Symbol search path is: srv*z:\
*http://msdl.microsoft.com/download/symbols

.reload /f calc.exe

lm m calc
start    end        module name
01000000 0101f000   calc       (pdb symbols)          z:\calc.pdb\3B7D84101\calc.pdb

0:000> version  <--------------------usermode session in kd via ntsd -d 
version
Windows XP Version 2600 (Service Pack 3) UP Free x86 compatible

Live user mode: <Local>

command line: 'ntsd -d calc.exe'  Debugger Process 0x3F8 

? $exentry;? calc!WinmainCrtstartup
Evaluate expression: 16852085 = 01012475
Evaluate expression: 16852085 = 01012475

關於您的原始請求,我不確定您有興趣找到什么令牌

如果獲取exe的EPROCESS-> Token是唯一的要求,則不必運行任何kd會話

您可以使用本地內核調試會話(使用kd -kl或通過sysinternals使用livekd)獲取myhost中所有正在運行的進程的令牌。

這是一個簡單的腳本,使用上述技術獲取所有正在運行的進程的sid

:\>cat sid.txt
!for_each_process "r $t0 =(@@c++(((nt!_eprocess *) @#Process )->Token.Object)) &
 @@(~7); r $t1 = @@c++(((nt!_token *) @$t0 )->UserAndGroups->Sid);!sid @$t1 1; ?
? (char *)((nt!_eprocess *) @#Process )->ImageFileName "

:\>kd -kl -c "$$>a< sid.txt;q"

結果

WARNING: Local kernel debugging requires booting with kernel
debugging support (/debug or bcdedit -debug on) to work optimally.

lkd> kd: Reading initial command '$$>a< sid.txt;q'
SID is: S-1-5-18 (Well Known Group: NT AUTHORITY\SYSTEM)
char * 0x8ac729a4
 "System"
SID is: S-1-5-18 (Well Known Group: NT AUTHORITY\SYSTEM)
char * 0x8a35729c
 "smss.exe"

SID is: S-1-5-20 (Well Known Group: NT AUTHORITY\NETWORK SERVICE)
char * 0x8a3619ac
 "svchost.exe"

SID is: S-1-5-19 (Well Known Group: NT AUTHORITY\LOCAL SERVICE)
char * 0x8a36ef14
 "svchost.exe"

SID is: S-1-5-21-602162358-1801674531-1417001333-1003 (User: XXXXXX\Admin)
char * 0x8a261b64
 "explorer.exe"

使用Windbg幫助文件中描述的方法調試WinLogon。 將您的用戶模式應用替換為WinLogon:

Windbg | 幫助| 內容| Windows調試| 調試技術| 專門的調試技術| 調試WinLogon

IFEO將啟動您的用戶模式應用程序並附加ntsd.exe。 在ntsd.exe中,可以使用bu $exentry然后使用g繼續在圖像輸入上設置一個斷點。

在ntsd.exe進入用戶模式進程的任何時候,您都可以發出.breakin命令以切換到內核模式調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM