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

《软件调试》答疑

帖子发起人: saviola   发起时间: 2011-07-05 11:10 上午   回复: 2

Print Search
帖子排序:    
   2011-07-05, 11:10 上午
saviola 离线,最后访问时间: 2016/6/2 11:22:08 saviola

发帖数前150位
注册: 2011-07-05
发 贴: 6
请教:78页KiTrap03中将程序指针寄存器减1
Reply Quote
请教一下那段带有dec ebx的汇编代码,是如何实现EIP减1的?
IP 地址: 已记录   报告
   2011-07-05, 11:16 上午
saviola 离线,最后访问时间: 2016/6/2 11:22:08 saviola

发帖数前150位
注册: 2011-07-05
发 贴: 6
Re: 请教:78页KiTrap03中将程序指针寄存器减1
Reply Quote
哦,我可能明白了,是把压在栈中的EIP值减了1,return时跳到原执行指令的位置。不知对不对?
IP 地址: 已记录   报告
   2011-07-05, 22:13 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请教:78页KiTrap03中将程序指针寄存器减1
Reply Quote
很好的问题,这个地方将EBX减1后,作为参数传递给CommonDispatchException。后者内部会分配一个EXPCEPTION_RECORD结构,然后将减1后的EIP值放到EXPCEPTION_RECORD的ExceptionAddress字段中,即如下代码:
nt!CommonDispatchException:
818537f0 83ec50 sub esp,50h ;; 在栈上分配 EXCEPTION_RECORD
818537f3 890424 mov dword ptr [esp],eax
818537f6 33c0 xor eax,eax
818537f8 89442404 mov dword ptr [esp+4],eax
818537fc 89442408 mov dword ptr [esp+8],eax
81853800 895c240c mov dword ptr [esp+0Ch],ebx ;; ExceptionAddress dt _EXCEPTION_RECORD
nt!_EXCEPTION_RECORD
+0x000 ExceptionCode : Int4B
+0x004 ExceptionFlags : Uint4B
+0x008 ExceptionRecord : Ptr32 _EXCEPTION_RECORD
+0x00c ExceptionAddress : Ptr32 Void
+0x010 NumberParameters : Uint4B
+0x014 ExceptionInformation : [15] Uint4B

这样修改后,ExceptionAddress 就指向了断点处本来指令的起始位置,这对于分析异常信息是很重要的。

其实还有一个地方调整EIP,就是在KiDispatchException函数中:

8182f7e9 8b03 mov eax,dword ptr [ebx] ;; ExceptionRecord.ExceptionCode
8182f7eb 3d03000080 cmp eax,80000003h ;; STATUS_BREAKPOINT
8182f7f0 0f84a9000000 je nt!KiDispatchException+0x130 (8182f89f)
...
8182f89f ff8dd0fdffff dec dword ptr [ebp-230h] ;; 将CONTEXT结构中的EIP减1

注意这里是将以局部变量形式存在的CONTEXT结构中的EIP字段减去1,没有直接修改KTRAP_FRAME,这是KiDispatchException函数的总体设计决定的,在这个函数开始会根据KTRAP_FRAME得到CONTEXT结构:
8182f7e4 e8a46e0100 call nt!KeContextFromKframes (8184668d)

在末尾再将CONTEXT结构中的信息复制会KTRAP_FRAME,这样处理后,保存在栈上的KTRAP_FRAME结构中的EIP便也变化了,也指向断点处本来指令的起始地址,此后,再执行iret指令异常返回后,CPU便从KTRAP_FRAME中恢复EIP,重新执行断点处的指令了
IP 地址: 已记录   报告
高端调试 » 图书 » 《软件调试》答疑 » Re: 请教:78页KiTrap03中将程序指针寄存器减1

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