首页
社区
课程
招聘
[原创]对模拟int3的探索
发表于: 2014-1-11 18:14 12341

[原创]对模拟int3的探索

2014-1-11 18:14
12341
//得到内核中的KiTrap03函数地址
gNewKiTrap03Addr=GetOriginalProcAddr(L"KiTrap03");
    
//定位内核中DbgBreakPointWithStatus函数地址
ulNewFunAddr=GetOriginalProcAddr(L"DbgBreakPointWithStatus");

//让DbgBreakPointWithStatus函数转向到MY函数中
ReplaceProcAddr((ULONG)MyDbgBreakPointWithStatus, ulNewFunAddr);
//MY DbgBreakPointWithStatus函数
void __declspec(naked) MyDbgBreakPointWithStatus()
  /*++
  
  Routine Description:
  此函数用于替换函数DbgBreakPointWithStatus, 模拟其中的int3指令,让其不经过中断表

  --*/
{  
  //反汇编DbgBreakPointWithStatus如下:
  //83ecf0cc 8b442404        mov     eax,dword ptr [esp+4]
  //83ecf0d0 cc              int     3
  //83ecf0d1 c20400          ret     4
  //把int3 直接替换为跳转到 jmp KiTrap03
  __asm
  {
    mov     eax,dword ptr [esp+4]
    
    //跳向KiTrap03函数
    jmp gNewKiTrap03Addr

    ret 4
  }
}
//MY DbgBreakPointWithStatus函数
void __declspec(naked) MyDbgBreakPointWithStatus()
{  
  __asm
  {
    mov     eax,dword ptr [esp+4]

    //志寄存器入栈
    pushf

    //CS入栈
    push cs

//EIP入栈
    push offset _ret1
  
    //跳向KiTrap03函数
    jmp gNewKiTrap03Addr

_ret1:
    ret 4  
}
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (19)
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错 可以绕过IDT了
2014-1-11 18:35
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
LZ不要异想天开了
不过VT虚拟化指令监控可以拦截任何指令,包括int 3
2014-1-11 18:41
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
另外,LZ的代码纯粹是Ring0层的int 3而不是Ring3层的
所以ss和cs不需要push
2014-1-11 19:16
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错,算是绕过了int3
2014-1-11 21:15
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
LZ的思路不错。。。。。赞一个
2014-1-11 23:07
0
雪    币: 95
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主写得很详细,非常不错的思路
2014-1-11 23:17
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
吓死我了,我还以为是ring3的int3
2014-1-12 15:45
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
iret指令本身就有恢复堆栈的功能吧。不知道Add Esp在这里起到什么作用。
2014-1-12 16:05
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
是不是因为声明的函数是纯汇编的?编译器没有生成那些调整堆栈的代码 要自己来调整吧
2014-1-12 16:13
0
雪    币: 92
活跃值: (70)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
这个问题我也很纳闷,但是如果不加这句指令,栈有错乱,所以加上只是为了让程序正确,至于在KiTrap03例程中,是什么地方把这个几个字节拿去了就不知道了,
2014-1-12 16:33
0
雪    币: 92
活跃值: (70)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
SS可以忽略,但是去掉 push CS 程序段下来后会出错,环境有问题,
2014-1-12 16:35
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
_declspec( naked ) void interrupt3( void )
{
        __asm{
                //iretd //return

                cmp [DebuggedProcessID],0 //there's currently no debugging gong on so quit
                je Original

                PUSHAD        //32               
                push ds //4
                push es //4
                push gs //4
                push fs //4

                mov ax,0x23
                mov ds,ax
                mov es,ax
                mov gs,ax
                mov ax,0x30
                mov fs,ax

                mov eax,esp
                add eax,48
                push eax //the location of the original stack
                PUSH 3 //int 3 identifier
            CALL GeneralHandler //call my regular int handler
                cmp eax,1 //if 1 then do no handle the original handler
                je Exit
                pop fs
                pop gs
                pop es
                pop ds
                POPAD
Original:
            JMP [Int3Address]

Exit:
                pop fs       
                pop gs
                pop es
                pop ds
                POPAD               
                IRETD
        };

}
2014-1-12 16:46
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
那要改CPU的MicroCode,即微码
据说指令译码器这东西,不过太底层了,几乎没有这方面的资料
2014-1-13 00:07
0
雪    币: 110
活跃值: (308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark.
2014-1-13 00:57
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
16
以前就看到某人说自己能hook MicroCode,当时吓尿了
2014-1-13 09:17
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
MicroCode从BIOS加载到CPU,要hook也得从BIOS下手
系统引导阶段不是那么容易控制的,看看国外论坛应该有,再对照CPU手册
2014-1-13 14:07
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark.
2014-1-16 08:35
0
雪    币: 549
活跃值: (531)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
楼主把pushf换成pushfd,就不用push esp 也不用add esp,2了。
2014-2-24 17:52
0
雪    币: 249
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
只能膜拜。。。
2014-3-4 10:41
0
游客
登录 | 注册 方可回帖
返回
//