查看文章 |
ring0不调api徒手设置硬件断点[转帖]
2009-08-04 16:06
ring0不调api徒手设置硬件断点 by flyingkisser 09.2.12 时间比较有限,捡关键的说说 1.如何写dr0,dr7,一般用NtSetContextThread, 为了不调API,这个问题就成了如何定位到指定线程的context,办法是: 先由tid拿到ethread kthread.InitialStack-29ch就是,如果这个地址无效,就使用ethread->TrapFrame 这时拿到的地址指向结构KTRAP_FRAME,修改它对应的drx就行了。 为什么是_KTHREAD.InitialStack-29ch,自己逆向一下PspGetSetContextSpecialApc就知道了。 xp下是29ch,其它系统没试过 2.设置kthread->DebugActive为1,如果不设置,线程切换时不会把trapframe里的drx写回到线程context中去。 这个问题搞了我很久。 3.硬件断点断下时,1号中断ISR接管控制,这时,你下的断点处的指令并没有执行,你得在恢复所有环境准备返回时, 自己去模拟断点处的指令执行,然后修改返回地址,指向断点的下一条指令处,最后再iretd。所以,选择硬件执行断点时, 最后不要选择像push,pop,jmp,je这样难以模拟的指令。这个问题也困扰了我好几天。 okey,这个方法有点淫荡,至少不用改别人的代码段就可以在你想停下的地方接管控制,也不用调用什么API就可以实现。 检测起来呢,有点麻烦,但不是很难,至少不怕别人hook什么SetContextThread了。 |
最近读者:
