-
-
[原创]x86/x64处理器实现调试者的自我调试
-
发表于:
2018-11-30 15:08
4010
-
大家好我叫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);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-11-30 22:15
被dsjflw编辑
,原因: