用windbg在内核模式下debugging时如何突破程序的入口点?

我想在内核模式下debugging一个程序,我想打破像ollydbg程序的入口点。 但是我不能用bp来分解它,因为程序没有启动,符号也不能加载。 我find了一些办法,但我觉得不太好。

1.在内核中打开CreateProcess函数。 但是我不知道哪个函数应该中断,我认为CreateProcess和程序的入口点之间有很长的路要走。

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

ollydbg的帮助下。 在用windbgdebugging的虚拟机中用ollydbgdebugging程序。 我不认为这是一个好主意。

4.使用sxe ld 。 它可以在Listing 3.29<<Advanced Windows Debugging>> 。 我试过了,但是我发现它只能在第一次使用。 rest后我不知道该怎么做。

5.用bu打破入门function。 但是我不知道我该怎么做。 例如,如何加载符号?

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

我认为用windbg在内核模式下进行debugging时,打破一个程序的入口点是一种常见的用法,我认为用强大的windbg必须有一个很好的方法来做到这一点。 什么是最好的办法呢?

顺便说一句,我想在内核模式下debugging一个程序,因为我想获得程序的令牌价值。 我发现windbg可以在用户模式下用!token来标识token,但是我不知道如何在用户模式下得到token的值。 看来我只能在内核模式下得到令牌的价值,对还是错?

Solutions Collecting From Web of "用windbg在内核模式下debugging时如何突破程序的入口点?"

您可以通过ntsd -d在目标中运行任何exe文件,从主机中运行的内核模式调试器进行调试

假设您在myhost内部运行虚拟机mytarget

在myhost中安装windbg
为myhost设置符号路径,即srv * x:\ xxxx * http:\ xxxxxxxxxxxx
在主机上创建一个内核连接(选择下面最好的是串口连接)

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

在mytarget安装windbg
打开共享文件夹z:\指向myhost中的symbolcache文件夹在mytarget中设置symbolpath指向共享文件夹run ntsd -d calc.exe

输入提示符将会在calc.exe的$ exentry中打破

只要输入提示符显示你正在使用KD就像一个本地的用户模式调试器,所以如果你设置一个bp calc!Winmain和问题G KD将打破calc.exe的Winmain

去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->令牌是唯一的要求,你不必运行任何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命令切换到内核模式调试。