Re: WinDBG下单步iret指令的问题

Windows内核调试

WinDBG下单步iret指令的问题


井底之蛙 2008-12-04, 00:12 上午
我想通过WinDBG在ring0下单步iret指令,来返回用户模式ring3,
我这里有两种奇怪的情况:
1. 找了个int 2A的,单步iret真的进入了ring0,但go之后就挂了,还有如果ring3下挂了调试器,情况就更怪了,不知道谁在int 2A之后加了个CC
2.(自己构造)任务门返回的那个iret,单步iret,马上就异常了,好像任务都没切换,但是如果go,就没有任何问题
搞了大半天越来越头晕,特来请教……
还有一问:
《在内核调试会话中设置用户态断点》
内核调试器不能捕获用户态中的异常,那它怎么能去调试用户态中的程序呢??

Re: WinDBG下单步iret指令的问题


井底之蛙 2008-12-04, 17:39 下午
忘说了,我是在VMware下调试的,
其实在第一种情况:只要一断到WinDBG,go……就把对应进程挂掉!
总感觉int xx里面不能随便下断,不然很容易要崩溃……

Re: WinDBG下单步iret指令的问题


井底之蛙 2008-12-07, 13:18 下午
明白了,单步iret指令时,windbg会从栈中找出压入的eip,然后在eip指向的内存下int3断点!!
由于call 任务门 CPU是不压栈的,所以栈中数据为0,单步iret指令时,windbg从栈中找出压入的eip=0,写int3断点,所以就异常了(这时iret还没执行,所以任务也没切换)

Re: WinDBG下单步iret指令的问题


格蠹老雷 2008-12-07, 14:49 下午
 better0332 wrote:
还有一问:
《在内核调试会话中设置用户态断点》
内核调试器不能捕获用户态中的异常,那它怎么能去调试用户态中的程序呢??

系统在分发用户态异常时会判断是否需要发给内核调试器(《软件调试》11.3.3,P287),如果需要,那么还是会发给内核调试器的。而且这是可以配置的。

配置有多种方法,比如启动参数中的/noumex,也可以使用WinDBG工具包中的kdbgctrl小程序:

C:\windbg>kdbgctrl
Usage: kdbgctrl <options>
Options:
  -c          - Check kernel debugger block-enable
  -ca         - Check kernel debugger auto-enable
  -cb         - Check kernel debugger enable block
  -cdb        - Check kernel DbgPrint buffer size
  -cu         - Check kernel debugger user exception handling
  -cx         - Check kernel debugger enable and exit with status
  -d          - Disable kernel debugger
  -da         - Disable kernel debugger auto-enable
  -db         - Disable kernel debugger block-enable
  -du         - Disable kernel debugger user exception handling
  -e          - Enable kernel debugger
  -ea         - Enable kernel debugger auto-enable
  -eb         - Enable kernel debugger block-enable
  -eu         - Enable kernel debugger user exception handling
  -sdb <size> - Set kernel DbgPrint buffer size
  -td <pid> <file> - Get a kernel triage dump

其中的eu开关就是于此有关的。

Re: WinDBG下单步iret指令的问题


井底之蛙 2008-12-07, 17:48 下午

noumex
Specifies that the kernel debugger does not break for user-mode exceptions. By default, the kernel debugger breaks for particular user-mode exceptions, such as STATUS_BREAKPOINT and STATUS_SINGLE_STEP. The /debug=noumex parameter is effective only when there is no user-mode debugger attached to the process.
看了WinDBG的help总算明白了……

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /fastdetect /debug=noumex /debugport=com1 /baudrate=115200

我这样配置的,但好像没起作用……晕

kdbgctrl就更奇怪了:

C:\>kdbgctrl -eu
Unable to set Kernel debugger user exception enable, NTSTATUS 0xC0000003
    {          }

Powered by Community Server Powered by CnForums.Net