首页
社区
课程
招聘
关于INT 3的系统处理
发表于: 2012-10-24 19:47 4737

关于INT 3的系统处理

2012-10-24 19:47
4737
近期写了一个小程序,需要以调试方式启动另外一程序,并在其中写入一个INT 3指令,注入一个软件断点。并在调试事件的响应循环里对软件中断进行处理。代码片段如下:
case EXCEPTION_DEBUG_EVENT:
                                {
                                        switch(de.u.Exception.ExceptionRecord.ExceptionCode)
                                        {
                                        case EXCEPTION_BREAKPOINT:
                                                {
                                                        CONTEXT context;
                                                        context.ContextFlags = CONTEXT_ALL;
                                                        GetThreadContext(pi.hThread,&context);
在这里读出线程的上线文环境。发现读出的context.Eip的值为0XCC指令的个字节处。比如我把另一个进程地址为0X0068404E的字节改为0XCC,进入处理循环,即上面这段代码处时,context.Eip的值为0X0068404F.但我记得《软件调试》一书上讲过系统对INT 3指令做了特殊处理,具体在在83页.KiTrap03会自动对EIP的值减一。不知道这应该如何解释,多谢各位大神!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
INT3是一个软中断,其实可以理解其为异常。发生异常时EIP的值+N
[COLOR="Lime"]不管任何情况,每执行完一条指令eip立即指向下一条,执行完INT3后thread context结构中的EIP已经移下[/COLOR]
/*因此在调试循环中获取的EIP并非INT3所在地址*/

N的值为中断指令长度。(如:INT3 (0xCC 1Byte))

若处理成功,则当前EIP被保存,若处理不成功,则EIP-N重新指向INT3,取得再次处理的机会。直至异常被成功处理。
调试循环中若处理成功则EIP=0X0068404F,不成功则0X0068404E
其实自陷和异常还是有区别的,自陷一般用于系统调用,而异常则大部分是随机产生,并且发生异常后,EIP并不会转移至下一条指令,直到异常被完全处理才可以执行

(真正的中断处理方式与异常和自陷以及中止的处理方式不一样)。另外,我爱你。
2012-10-25 02:07
0
雪    币: 50
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呃...还是不太明白,那<软件调试>本书上说 的 在VC6调试器里断下后,EIP指向的是发生异常时EIP的值--N的值,即,0XCC处的地址又如何解释?
2012-10-25 08:32
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
你看一下EXPCEPTION_RECORD的ExceptionAddress字段,和CONTEXT的EIP字段是不一样的。
ExceptionAddress字段记录的是发生异常的地址,也就是EIP-1。
2012-10-25 09:47
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
印象中 context.ContextFlags = CONTEXT_ALL; 这样设置好像是不行的,这个All好像并不是包括了全部的选项。
2012-10-25 10:04
0
雪    币: 50
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
一句惊醒梦中人啊.....
另外你第一个回帖的 "我爱你"是啥意思..........
2012-10-26 23:15
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
就是,我爱你。
2012-11-9 04:47
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
再稍微补充一下,其实INT n指令也有区分的,INT 3  其实算作软异常(类型Trap),软中断是31个中断向量以后的是软中断(由设备调用的话就叫硬件中断,当然IDT里这部分也可以是陷阱门)。碧如,2000下INT 0x2E为_KiSystemService的vector。
软式调用中断和硬件产生的中断区别在于软中断与EFLAGS没有直接联系,IF位不影响软中断的处理。
而异常则可以被打断流程。
这么晚,我明天不用上班了,。
2012-11-9 04:50
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我是来围观那句“”我爱你“的。。。。。
2013-3-15 15:22
0
游客
登录 | 注册 方可回帖
返回
//