我想在内核模式下调试程序,我希望打破程序的入口点,如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
识别令牌,但我不知道如何在用户模式下获取令牌的值。看来我只能在内核模式中获取令牌的值,对不对?
答案 0 :(得分:3)
你可以通过ntsd -d运行目标中的任何exe来从主机中运行的内核模式调试器调试它
假设您在 myhost 中运行虚拟机 mytarget
在myhost中安装windbg
设置myhost的符号路径viz srv * x:\ xxxx * http:\ xxxxxxxxxxxx
在主机中创建一个内核连接(选择下面最好的是串行连接)
在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
命令切换到内核模式调试。