阅读:831回复:0
请教关于int 3的使用
我设想做一个I/O拦截器,就是可以拦截到PC上所有I/O端口操作;
如果用 X86 的Debug Registers来做的话,则只能一次监听四个端口(DR0~DR3) 所以我想在系统的硬件抽象层hal.dll的几个I/O函数的入口处设置int3断点(就像SOFTICE那样), 这样监听数目可以不受限制,但只能监听那些调用 READ_PORT_XXX 、WRITE_PORT_XXX的进程; 对于直接使用in/out指令的来说,就只能用上面的第一个办法了。 比如下面这段指令摘自 hal.dll 的 READ_PORT_UCHAR 函数 Exported fn(): READ_PORT_UCHAR - Ord:0054h :80016024 33C0 xor eax, eax :80016026 8B542404 mov edx, dword ptr [esp+04] :8001602A EC in al, dx :8001602B C20400 ret 0004 第一步用int3指令码来替换 :80016024 C0, 当READ_PORT_UCHAR 被调用的时候,执行int3中断。 第二步在中断处理返回前,需要把C0 替换回int3指令,并把堆栈中的程序计数器IP指向:80016024 这样当中断返回后,就可以从原来的函数入口处执行原来的指令了。但这样作把int3指令也给取消掉了 当下次 READ_PORT_UCHAR 被调用时就不会触发int3中断了 现在需要解决的问题是 在第二步中,怎么让 C0 暂时替换回 int3指令,这样当下次 READ_PORT_UCHAR 被调用时又可以先执行int3中断,而不是直接执行 READ_PORT_UCHAR 的原有指令 |
|