首页
社区
课程
招聘
[讨论]国产杀毒软件中的KiFastCallEntry
发表于: 2013-6-30 16:59 16798

[讨论]国产杀毒软件中的KiFastCallEntry

2013-6-30 16:59
16798
int 2e和sysenter开头不同,后面都会走入KiFastCallEntry里某处,在这后面inlinehook,就能截获到所有的系统调用。
但是,为了提升系统调用的效率,intel甚至在cpu中添加了指令,操作系统才从int 2e转变为sysenter。

观国产杀毒软件对KiFastCallEntry的hook,一般是:

pushf
pusha

call   A(从自己的hook表中查到对应系统调用的函数并替换本次调用地址)

popa
popf

此处的push和pop,加上A所占用的操作,岂不是让int 2e -> sysenter节省的时间、一招回到解放前?

那么,如果把hook KiFastCallEntry变成SSDT hook,首先是安全性上的提升,替换一个指针。然后能节省掉push和pop和A调用的时间。

缺点是:SSDT路人皆知,绕过很容易。可是,绕过KiFastCallEntry的hook很难么?
缺点2:会被一些人喷,只不过是SSDT。还有说hook来hook去有意思么的。有句话叫,第一个说XX的是天才,第二个说XX的是庸才,第三个说XX的是蠢材。还来说“hook来hook去有意思么”的人,属于第四种,其他。

本文主要是讨论hook KiFastCallEntry对系统造成的效率问题,请大家来讨论讨论,有没有更好的方式。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 952
活跃值: (1826)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这几句指令不会存在效率问题 int 2e和sysenter效率差别关键在于中断的原理
2013-6-30 17:48
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
int 2e和sysenter效率 没差别.话说0E会不会比sysenter更频繁点呢!!!
2013-6-30 17:57
0
雪    币: 284
活跃值: (3624)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
4
网上随便搜一下,以及一些已经出版的书籍里都有说int 2e sysenter的效率区别,你说它们效率无区别,赤果果的质疑intel的sysenter实为ED?能说说原因吗?
2013-6-30 18:23
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
的确没什么太多的差别……和一个nop 和两个nop一样……
而且你只要对系统的调用过滤 必定会影响到系统效率
这个没办法
2013-6-30 19:14
0
雪    币: 284
活跃值: (3624)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
6
自己构造一份SSDT,在下面的inc指令处hook,mov edi, MySSDT,然后转回来,也比上面那个效率高吧?

nt!KiFastCallEntry+0xcf:
8054264f 64ff0538060000  inc     dword ptr fs:[638h]
80542656 8bf2            mov     esi,edx
80542658 8b5f0c          mov     ebx,dword ptr [edi+0Ch]
8054265b 33c9            xor     ecx,ecx
8054265d 8a0c18          mov     cl,byte ptr [eax+ebx]
80542660 8b3f            mov     edi,dword ptr [edi]
80542662 8b1c87          mov     ebx,dword ptr [edi+eax*4]
80542665 2be1            sub     esp,ecx
2013-6-30 21:17
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
int 2eh 和 sysenter 效率怎么会没区别呢,区别大多了。

int 指令,需要在内存的 IDT 读取 门描述符,进行检查,再从 GDT 里读取 code 描述符,再检查。
int 指令也要进行权限检查,
int 指令也要进行压入操作。

sysenter 指令这些工作都不需要
汗~~ 什么叫做“没什么区别”, 倒底什么才叫做有区别?
2013-6-30 21:52
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
int 指令还要从 TSS 读取 SS 与 ESP
sysenter 直接设置

汗~ 这也能说没区别
2013-6-30 21:54
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
引用之前那位仁兄的话,就是一个NOP跟两个NOP的区别,这有多大区别呢?谁叫现在的电脑都那么牛逼.
2013-7-1 06:52
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
现在电脑牛B了,这点区别还不够塞牙缝...

还有那个什么分页内存,现在电脑都8G内存了,搞什么分页内存嘛,直接不分页不就简单省事.

纯属个人意见
2013-7-1 07:04
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
把 int 2eh 与 sysenter 之间的区别,比喻成一个nop 与两个 nop 之间的区别
不是电脑牛B,是你们太牛B了。
1个 nop 与 100个 nop 之间都没什么区别,区别只是在fetch 指令或者 decode 之间的区别
现在的U强劲,那是相对于以前的U作比较,但也不能改变指令之间存在的区别。
2013-7-1 08:06
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
测试了一下:
int 指令大概需要 1790 个 TSC
一条32位的 div 指令也就大概 430 个 TSC
sysenter 指令仅大概需要 170 个 TSC

int 指令比一条32位 div 指令还要慢上 4 倍多, sysenter 指令比 int 指令快 10 倍还多,比 div 指令快 2 倍多

这个区别不是一般的巨大呀!
2013-7-1 09:06
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
连 div 都忍不了,还能忍受 int 与 sysenter 之间的 "效率差不多“
2013-7-1 09:08
0
雪    币: 284
活跃值: (3624)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
14
在乎int 2e与sysenter的人,和不在乎的,需要互相容忍一下,和谐第一。

int 2e与sysenter都不在乎,那也不会在乎KiFastCallEntry 里那种 inlinehook 了,LZ的帖子白发了。。
2013-7-1 13:12
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
对 所谓硬件的升级对外挂就是天灾
2013-7-1 13:49
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
16
真是神论啊……不分页如何实现系统对应用程序的接口一致性?不分页如何管理内存?
2013-7-18 01:43
0
雪    币: 602
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
现在软件都不管效率的,做表面文章的更多一些,我碰到过不少不怎么懂电脑的用户机器里面同时开着3个甚至更多一些的杀软,挺好的机器慢的像牛一样(蜗牛啊),难道杀软会不知道同时运行多个是啥效果吗?
2013-7-18 04:00
0
游客
登录 | 注册 方可回帖
返回
//