tianyun
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2004-01-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:787回复:0

请教关于int 3的使用

楼主#
更多 发布于:2003-07-11 16:48
我设想做一个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 的原有指令
游客

返回顶部