Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: 井底之蛙   发起时间: 2008-12-04 00:12 上午   回复: 4

Print Search
帖子排序:    
   2008-12-04, 00:12 上午
better0332 离线,最后访问时间: 2009/6/29 13:20:47 井底之蛙

发帖数前75位
注册: 2008-12-03
发 贴: 15
Dog [&] WinDBG下单步iret指令的问题
Reply Quote
我想通过WinDBG在ring0下单步iret指令,来返回用户模式ring3,
我这里有两种奇怪的情况:
1. 找了个int 2A的,单步iret真的进入了ring0,但go之后就挂了,还有如果ring3下挂了调试器,情况就更怪了,不知道谁在int 2A之后加了个CC
2.(自己构造)任务门返回的那个iret,单步iret,马上就异常了,好像任务都没切换,但是如果go,就没有任何问题
搞了大半天越来越头晕,特来请教……
还有一问:
内核调试器不能捕获用户态中的异常,那它怎么能去调试用户态中的程序呢??

IP 地址: 已记录   报告
   2008-12-04, 17:39 下午
better0332 离线,最后访问时间: 2009/6/29 13:20:47 井底之蛙

发帖数前75位
注册: 2008-12-03
发 贴: 15
Re: WinDBG下单步iret指令的问题
Reply Quote
忘说了,我是在VMware下调试的,
其实在第一种情况:只要一断到WinDBG,go……就把对应进程挂掉!
总感觉int xx里面不能随便下断,不然很容易要崩溃……
IP 地址: 已记录   报告
   2008-12-07, 13:18 下午
better0332 离线,最后访问时间: 2009/6/29 13:20:47 井底之蛙

发帖数前75位
注册: 2008-12-03
发 贴: 15
Re: WinDBG下单步iret指令的问题
Reply Quote
明白了,单步iret指令时,windbg会从栈中找出压入的eip,然后在eip指向的内存下int3断点!!
由于call 任务门 CPU是不压栈的,所以栈中数据为0,单步iret指令时,windbg从栈中找出压入的eip=0,写int3断点,所以就异常了(这时iret还没执行,所以任务也没切换)
IP 地址: 已记录   报告
   2008-12-07, 14:49 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: WinDBG下单步iret指令的问题
Reply Quote
 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开关就是于此有关的。


IP 地址: 已记录   报告
   2008-12-07, 17:48 下午
better0332 离线,最后访问时间: 2009/6/29 13:20:47 井底之蛙

发帖数前75位
注册: 2008-12-03
发 贴: 15
Re: WinDBG下单步iret指令的问题
Reply Quote

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
    {          }


IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: WinDBG下单步iret指令的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.