首页
社区
课程
招聘
[原创]x86/x64处理器实现调试者的自我调试
发表于: 2018-11-30 15:08 4009

[原创]x86/x64处理器实现调试者的自我调试

2018-11-30 15:08
4009
大家好我叫cc3,前几天遇见一个搞笑者,他跟一小白炫技说x86/x64处理器根本无法调试int 3和int 1中断里的代码。
我友情的提示他不要误导小白.............几天过去了,突然我发现我成为世人的笑柄,好吧............

大家都知道系统调试机制主要依赖int 1和int 3两个中断实现的,很多人之所以认为无法调试--调试代码的原因是因为调试代码里如果发生调试事件将会在次陷入调试代码最后形成死循环。
在这里我强调一点抱有这种观点的人在逻辑层面上是错的。
正确的观点是:中断调试代码中发生调试事件如果无法处理将会陷入死循环.
有了这一个观点我们就可以在在处理调试事件上做文章
大家先看下成果:

其实代码实现起来很简单,很多人认为做不到是因为其"逻辑"上出了问题导致做不到其实并不是真的做不到。

case DEBUG_EXCEPTION:
EventInject(TRAP_DEBUG,0);
if (qwSgin==0)
{
rsp=AsmVmRead(GUEST_RSP);
rsp-=0x30;
*(QWORD *)(rsp     )=AsmVmRead(GUEST_RIP);
*(QWORD *)(rsp+0x8 )=AsmVmRead(GUEST_CS_SELECTOR);
*(QWORD *)(rsp+0x10)=AsmVmRead(GUEST_RFLAGS);
*(QWORD *)(rsp+0x18)=AsmVmRead(GUEST_RSP);
*(QWORD *)(rsp+0x20)=AsmVmRead(GUEST_SS_SELECTOR);
*(QWORD *)(rsp+0x28)=0x0fff000100000001;
GuestRegs->rsp=rsp;
qwSgin=1;
AsmVmWrite(GUEST_RIP,qwKiBreakpointTrapAddr );
}
break;
case DEBUG_EXCEPTION:
EventInject(TRAP_DEBUG,0);
if (qwSgin==0)
{
rsp=AsmVmRead(GUEST_RSP);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-11-30 22:15 被dsjflw编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (4)
雪    币: 8873
活跃值: (5096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs
2
学习了,mark一下,谢谢楼主提供
2018-11-30 18:35
1
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
3
rsp=AsmVmRead(GUEST_RSP);
rsp-=0x30;
*(QWORD *)(rsp     )=AsmVmRead(GUEST_RIP);
*(QWORD *)(rsp+0x8 )=AsmVmRead(GUEST_CS_SELECTOR);
*(QWORD *)(rsp+0x10)=AsmVmRead(GUEST_RFLAGS);
*(QWORD *)(rsp+0x18)=AsmVmRead(GUEST_RSP);
*(QWORD *)(rsp+0x20)=AsmVmRead(GUEST_SS_SELECTOR);
*(QWORD *)(rsp+0x28)=0x0fff000100000001;
GuestRegs->rsp=rsp;

这就是所谓的自造中断?这也太秀了⑧
先不说host能不能往rsp地址能不能写东西以及rsp写炸了咋办
vmx本身就有中断注入功能为啥不用呢
如果只是为了重定向中断,我觉得中断注入和shadow idt都比这种方法稳定一万倍
最后于 2018-11-30 18:56 被hzqst编辑 ,原因:
2018-11-30 18:53
1
雪    币: 26588
活跃值: (63242)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
4
感谢分享!
2018-11-30 19:47
0
雪    币: 4922
活跃值: (2345)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2018-12-1 14:59
0
游客
登录 | 注册 方可回帖
返回
//