使用windbg在内核模式下调试时如何打破程序的入口点?

时间:2015-07-08 14:12:44

标签: windows debugging windbg

我想在内核模式下调试程序,我希望打破程序的入口点,如ollydbg。但我无法用bp打破它,因为程序无法启动且无法加载符号。我找到了一些方法来做到这一点,但我认为它不太好。

1.打破内核中的CreateProcess函数。但我不知道我应该打破哪个功能,我认为CreateProcess与程序的切入点之间有很长的路要走。

2.使用cc更改程序的入口点。但它需要其他工具,我应该更改字节更改的代码。我认为这很烦人。

3.在ollydbg的帮助下。在使用windbg调试的虚拟机中使用ollydbg调试程序。我不认为这是个好主意。

4.使用sxe ld。它可以在Listing 3.29的{​​{1}}上找到。我试过了,但我发现它只能在第一次使用。而且我不知道休息后我到底应该做些什么。

5.使用<<Advanced Windows Debugging>>打开输入功能。但我也不知道自己应该做些什么。例如,如何加载符号?

6.使用bu。我不知道做我说的是否正确。

我认为在使用.create的内核模式下进行调试时,打破程序的入口点是一种常见的用法,我认为必须有一个很好的方法来使用强大的{{{ 1}}。最好的方法是什么?

顺便说一下,我想在内核模式下调试一个程序,因为我想得到程序的令牌vaule。我发现windbg可以在用户模式下使用windbg识别令牌,但我不知道如何在用户模式下获取令牌的值。看来我只能在内核模式中获取令牌的值,对不对?

2 个答案:

答案 0 :(得分:3)

你可以通过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将使用输入提示

打破$ exentry of calc.exe

只要显示输入提示,就像使用本机用户模式调试器一样使用kd 所以,如果你设置一个bp calc!Winmain并发出g kd将在calc.exe winmain上打破

使用.breakin

进入kd会话 凌乱的东西,但一旦你习惯了(即记住文档)就会很好用

样本运行

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-&gt;令牌是你不必运行任何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"

答案 1 :(得分:2)

使用Windbg帮助文件中描述的方法来调试WinLogon。将您的用户模式应用替换为WinLogon:

Windbg |帮助|内容| Windows调试|调试技术|专业调试技术|调试WinLogon

IFEO将启动您的用户模式应用并附加ntsd.exe。在ntsd.exe中,您可以在bu $exentry然后g上设置图像条目的断点以继续。

在ntsd.exe进入用户模式进程的任何时候,您都可以发出.breakin命令切换到内核模式调试。