首页
社区
课程
招聘
[求助] 调试器单步执行时会改变cpu寻址位数吗
发表于: 2022-12-21 11:44 8407

[求助] 调试器单步执行时会改变cpu寻址位数吗

2022-12-21 11:44
8407

分析样本时遇到了一个浮点指令 fxsave64 ,查阅资料发现是保存x87 fpu状态的指令。

如果单步F7执行到此处,这个指令保存的FPU状态里,其中FIP会缺少高32位。

但是如果不是单步执行,比如F4到这个指令的下一条指令,保存的FIP又不会缺失高32位

查了一下资料,只有REX.W=0,或CPU寻址模式非64位时才会发生FIP缺失高32位的情况。


这里的REX.W=1,是否代表调试器在单步执行时改变了CPU的寻址模式?
ps:不止x64dbg,windbg下也有同样的问题。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
有没有一种可能,浮点状态在发生异常进出内核的时候被破坏了(比如可能微软没有正确保存浮点状态之类的)
2022-12-21 12:03
2
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
应该是断点或者单步异常,导致FIP高32位不会被系统保存,跟REX.W没有关系
2022-12-22 06:55
0
雪    币: 4711
活跃值: (4224)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很可能是x64dbg问题 建议使用其他调试器 重新验证
2022-12-22 12:27
0
雪    币: 4711
活跃值: (4224)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你看到的这些 只不过是 x64dbg 用自己的变量 自己的窗口 输出的 可能x64dbg自身问题
2022-12-22 12:30
0
雪    币: 47
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
木志本柯 你看到的这些 只不过是 x64dbg 用自己的变量 自己的窗口 输出的 可能x64dbg自身问题
windbg也有同样的问题
2022-12-23 14:23
0
雪    币: 47
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
更新:
终于找到问题所在了,问题出在windows线程切换函数SwapContext,函数用来保存线程fpu环境的指令是fxsave而不是fxsave64,导致线程恢复环境后FIP少了高32位,并且恢复环境用的指令同样是非64位版本的fxrstor。
异常触发的执行流程大概这样:
KiDebugTrapOrFault->DbgkpSendApiMessage->DbgkpQueueMessage->KeSetEvent->KiExitDispatcher->KiSwapContext
2023-2-3 18:47
0
游客
登录 | 注册 方可回帖
返回
//