首页
社区
课程
招聘
[讨论]怎样检测系统中的row socket?
发表于: 2011-4-13 16:58 6769

[讨论]怎样检测系统中的row socket?

2011-4-13 16:58
6769
据《rootkits: subvering the windows kernel》一书,有两种方法使用row socket进行远程通信。在R3层使用系统API,如socket(AF_INET, SOCK_RAW, IPPROTO_IP),可以创建row socket。 在R0可以直接使用NDIS接口,进行raw socket通信。这两种通信方式,tcpview之类的工具都没有办法检测出来。

在R3层创建的raw socket由于持有句柄,所以可以通过NtQuerySystemInformation把其句柄信息查找出来(procexp里就实现了),也可以通过内核里的一些其他句柄遍历方法查找出其句柄。但是这样能够得到的关于raw socket的信息只有句柄名称和进程ID,非常不全面。

由于工作需要查找出这两种raw socket, 遍搜网络两天,看了很多资料,都没有找到非常好的方案。极度郁闷。
TCP,UDP的信息可以分别从\device\tcp, \device\udp查出来,那么raw socket的信息可不可以从\device\rawip查出来呢?没有找到任何这方面的资料。
 

\device\ip与\device\rawip的区别又是什么,按理说,raw socket是直接操纵数据包的,应该是绕过TDI的,为啥还要有个\device\rawip呢? 我的理解是R3层的raw socket使用了IP协议,所以需要TDI层的这么个东西。
看了reactos的相关代码,没有看出头绪来。

tdifw里有使用filter监控rawip的行为,可以发查处raw socket的相关信息,但是这块没有深入研究,不到最后不想考虑通过挂钩反查的方案。

对于直接走NDIS的通信,目前没有找到任何检测的方案 悲剧啊

求这里的大牛过来给点意见, 不胜感激。

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很是不懂,跟着学习
2011-4-13 18:14
0
雪    币: 139
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
我测试了一下,XueTr检测raw socket就是查询哪些进程打开了\device\rawip句柄。
用NtCreateFile打开"\\Device\\RawIp"句柄,别的操作都不做,xuetr就显示进程有raw socket,其实是没有的。

另外一方面,当进程建立raw socket,但是没有收发数据包,此时进程没有持有\device\rawip句柄

s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)


xuetr也检测不出来,必须等到进程开始收发数据的时候才能检测。

socket建立后,进程会持有\device\afd句柄,但是\device\afd是做什么用的,网上相关资料很小,求指点。
2011-4-14 11:16
0
雪    币: 139
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
呼唤大牛~
2011-4-19 10:08
0
游客
登录 | 注册 方可回帖
返回
//