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内核调试

帖子发起人: wrong   发起时间: 2011-03-10 16:54 下午   回复: 6

Print Search
帖子排序:    
   2011-03-10, 16:54 下午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
KiTrap03的逻辑
Reply Quote
软件调试第4章中,介绍KiTrap03对于x86的int 3指令会做特殊的处理,会将IP值减1,在第18章中讲调试服务的时候,说int 2d会跳转到KiTrap03,并列举了DebugService2的代码。
...
cd2d int 2d
cc int 3
...

没明白后面为什么要加一条int 3,按照第4章中的逻辑,eip会指在int 2d指令的中间啊。和后面加不加int 3有什么关系。
IP 地址: 已记录   报告
   2011-03-11, 10:08 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: KiTrap03的逻辑
Reply Quote
读的很仔细,思考的也很深入
再前进一点点就想通了啊:-)
对的,执行INT 2D后,IP会指向下一条指令,如果这时进入INT 3的逻辑就会出现你说的eip指向cd2d这个指令的中间部分。下面的INT 3指令正是为了避免这个问题而故意放在那的,有了这条指令后,KiDebugService中会把IP先加一:
inc dword ptr [ebp+68h]
让IP指向这个看似无用的INT 3指令的后面,伪造出于与断点异常一样的现场,然后再复用INT 3的逻辑
这样做了之后,KiTrap03中再减一就指向INT 3指令了,而后交给调试引擎(调试器),后者处理好这个服务后,会递增EIP,跳过INT 3指令,然后再异常返回...
非常的精妙...


IP 地址: 已记录   报告
   2011-03-22, 17:02 下午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
Embarrassed [:$] Re: KiTrap03的逻辑
Reply Quote
我晕了,看得越多越胡涂,仔细想了想,我的理解是这样,如果这个int 3是在调试器中设置的,调试器收到异常并且恢复执行后,会将这个int 3恢复成原来的指令并且从这个指令处开始执行。

如果这个int 3本身是程序里面的,调试器捕捉到后直接恢复执行就会直接跳过这条指令。不知道这样的理解对不对?这些动作是调试器完成的嘛?

但是,如果调试器不存在,int 2d重用KiTrap03进入了异常分发KiDispatchException,并且没有异常处理,程序不会Crash嘛?
IP 地址: 已记录   报告
   2011-03-22, 21:14 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: KiTrap03的逻辑
Reply Quote
这个INT 3是写在源代码里的,不是调试器设置的
内核函数会保证这个动作的,建议看一下有关内核函数的汇编代码

IP 地址: 已记录   报告
   2011-03-24, 11:02 上午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
Re: KiTrap03的逻辑
Reply Quote
张老师,代码看了,比较复杂。
当int 3指令出现在代码中,CPU执行这条指令后,会跳转到KiTrap03,然后进入异常分发,异常处理后会中断返回。int 2d重用KiTrap03是否是重用的异常分发之后的步骤?
IP 地址: 已记录   报告
   2011-03-24, 12:55 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: KiTrap03的逻辑
Reply Quote
当然是重用KiDispatchException之前的代码啊,KiTrap2d在做些预处理后便跳转到KiTrap03中了,之后由KiDispatchException统一分发...
这样的异常不会分发给用户代码,当有调试器时会分发给调试器,没有调试器的时候,会分发给KdpStub,KdpStub中会调整Eip...
IP 地址: 已记录   报告
   2011-03-24, 17:41 下午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
Re: KiTrap03的逻辑
Reply Quote
现在有点明白了,原来一直担心跳到KiTrap03后,异常分发,如果没有调试器,因为是内核中未处理的异常,系统会蓝屏。
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: KiTrap03的逻辑

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