中间层过滤驱动和封包的16进制处理

上篇文章和大家聊了聊自己在做刚接触驱动开发时一些经验,最近我接触到了网络驱动,简直一发不可收拾,原因很简单,对于一些硬件驱动来说,及时你搞明白了他的框架,成功搞了一个并且让他跑了起来,在你没有很透彻地研究之前,你能做的可能只是禁用USB或者做一些内核钩子来禁用键盘鼠标等等。

然而网络驱动则不然,从各式各样的抓包工具就可以看出,很多人对数据从PC终端到网络再到另一个PC终端这个过程是非常好奇的,想象一下你在自己的驱动里截取了各种各样的数据包,并成功解析出来是一个多么大快人心的事情,当然这其中涉及到了加密的东西,我们先大可不必去管这些,因为很多数据并没有加密,比如你的贴吧,再比如你的网络请求(在笔者做这些实验的时候,百度的搜索也是可以被简单解析出来的,当笔者的实验块完成时,百度全站加密。。。)都是可以通过简单的解析看到的。

好了废话少说,我们先来介绍一下网络驱动。

下面的图可能会让大家更好的理解数据在网络中传递的过程。


在远古时代,许多网络Sniffer(嗅探器)都是用分层LSP(分层意义服务商)来做的,还有浏览器劫持也可用LSP来做,这里就不做过多解释了,感兴趣的可以自己看看,因为不够底层,用LSP做的做的东西可以很容易被清除,360就可以很容易的做到,但由于稳定性等原因,许多公司依然有这种应用,必须迅雷的迅游就有LSP加载,显然这不是我们这些搞底层开发的人想看到的。

NDIS 是 Network Driver Interface Specification(网络驱动接口标准)的缩写,它为网络驱动抽象了网络硬件,指定了分层网络驱动间的标准接口,因此,它为上层驱动(如网络传输)抽象了管理硬件的下层驱动。 NDIS 也维护了网络驱动的状态信息和参数,这包括到函数的指针,句柄等。

NDIS支持 3种类型的驱动-微端口( Miniport)驱动、中间层( Intermediate)驱动和协议( Protocol)驱动.
1)微端口( Miniport)驱动就是常说的网卡驱动,它负责管理网卡,包括通过网卡发送和接收数据,它也为上层驱动提供接口。微端口驱动一般由硬件开发商提供.

2)中间层(Intermediate)驱动,通常位于微端口驱动和传输协议驱动之间,是基于链
路层和网络层之间的驱动由于中间层驱动在驱动层次中的中间层位置,因此它必须与其上层的协议驱动和下层的
微端口驱动通信,最终导出如下两种类型的函数:

1、协议驱动入口点在其下方, NDIS调用它导出的 ProtocolXxx函数传达来自下层微
端口驱动的请求。对于下层微端口驱动来说,中间层驱动看起来就是一个协议驱动。
2
、微端口驱动入口点在其上方, NDIS调用它导出的 MiniportXxx函数传递来自一个
或者多个上层协议驱动的请求。对于上层协议驱动来说,中间层驱动看起来就是一
个微端口驱动。
虽然中间层驱动也导出 MiniportXxx函数,但它并不真正地管理物理网卡,而是导出一个或者多个虚拟适配器,上层协议可以绑定到上面。对于协议驱动来说,中间层导出的虚拟适配器看起来像一个物理网卡,当它向这个虚拟适配器发送封包或者请求时,中间层驱动将这些封包和请求传播到下层微端口驱动。当下层微端口驱动向上指示接收封包或者状态时,中间层驱动向上将这些封包、状态传播到绑定在虚拟适配器上的协议驱动。中间层驱动的主要用途之一就是过滤封包,其优点是能够截获所有的网络数据包(如果是以太网那就是以太帧)。

3)协议( Protocol)驱动,即网络协议,它位于 NDIS 体系的最高层,经常用作实现传输协议堆栈(如 TCP/IP IPX/SPX堆栈)的传输驱动中的最底层驱动。


(参见《Windows通信与程序设计》 第十章 第一小节)

Windows WDK提供了两个著名的中间层驱动例子:Passthru和Mux.开发人员可以在Passthru的基础上进行开发。

就笔者本身而言,笔者是用Passthru作为模型来进行的开发。

关于NDIS驱动的框架和安装,它和普通的驱动模型还是有一定去别的,在看雪论坛里有篇很好的帖子,大家可以去看看,我把链接贴出来

http://bbs.pediy.com/showthread.php?t=151300

关于怎么把数据截取并且输出到应用层,需要大篇幅来讲,这里就先让大家对NDIS驱动和网络数据的传输有个大概的了解,过阵子我会单独写一篇关于分析数据包和驱动层和应用层内存共享(为了驱动主动输出)的文章。

接下来,我要介绍一点关于16进制数据的解析,大家可以用抓包工具自己抓一点然后自己转转看看,会很提升兴趣的。下面代码会多一点,亲测有效

大家应该都知道,在内存中传递的时候2进制是机器最喜欢的,但是2进制实在太难读了,已有的抓包工具基本都是把数据简单转成了16进制就放了出来,因为中间涉及到加密算法还有各种协议头的去除,这里有篇帖子http://blog.sina.com.cn/s/blog_49a2d5a90100gdlx.html,大家数好各协议头位数,去除以后就可以进行转码了。关于封包的具体结构所以大家需要自己把协议头去掉,然后用下面的16进制转字符串的方法,就可以看到我们可读的东西了。

PUCHAR pPacketContent = NULL;
			char* tcsPrintBuf = (char*)m_pShareMem;
			if (m_pShareMem != NULL)
			{


				char hex[2048*3 ];
				strcpy_s(hex, (char*)m_pShareMem);
				char str2[2048];
				int i = 0;
				while (hex[i]||i<2048)
				{
					str2[i >> 1] = (a2x(hex[i]) << 4) | a2x(hex[i + 1]);
					i += 2;
				}
				str2[i >> 2] = '\0';
char a2x(char ch)
{
	switch (ch)
	{
	case '1':
		return 1;
	case '2':
		return 2;
	case '3':
		return 3;
	case '4':
		return 4;
	case '5':
		return 5;
	case '6':
		return 6;
	case '7':
		return 7;
	case '8':
		return 8;
	case '9':
		return 9;
	case 'A':
	case 'a':
		return 10;
	case 'B':
	case 'b':
		return 11;
	case 'C':
	case 'c':
		return 12;
	case 'D':
	case 'd':
		return 13;
	case 'E':
	case 'e':
		return 14;
	case 'F':
	case 'f':
		return 15;
	default:
		break;;
	}

	return 0;
}


50 4f 53 54 202f 66 2f 63 6f 6d 6d 69 74 2f 70 6f 73 74 2f 61 64 64 20 48 54 54 50 2f 31 2e31  0d 0a 48 6f 73 74 3a 20 74 69 65 62 61 2e 62 61 69 64 75 2e 63 6f 6d  0d  0a43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65  0d  0a43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 35 35 32  0d  0a4f 72 69 67 69 6e 3a 20 68 74 74 70 3a 2f 2f 74 69 65 62 61 2e 62 61 69 64 752e 63 6f 6d  0d  0a 58 2d 52 65 71 75 65 73 74 65 64 2d 57 6974 68 3a 20 58 4d 4c 48 74 74 70 52 65 71 75 65 73 74  0d  0a55 73 65 72 2d 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 2e 30 20 28 5769 6e 64 6f 77 73 20 4e 54 20 36 2e 31 29 20 41 70 70 6c 65 57 65 62 4b 69 742f 35 33 37 2e 31 20 28 4b 48 54 4d 4c 2c 20 6c 69 6b 65 20 47 65 63 6b 6f 2920 43 68 72 6f 6d 65 2f 32 31 2e 30 2e 31 31 38 30 2e 38 39 20 53 61 66 61 7269 2f 35 33 37 2e 31  0d  0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 2061 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 77 77 2d 66 6f 72 6d 2d 75 72 6c65 6e 63 6f 64 65 64 3b 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38  0d  0a41 63 63 65 70 74 3a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 73 6f 6e 2c 2074 65 78 74 2f 6a 61 76 61 73 63 72 69 70 74 2c 20 2a 2f 2a 3b 20 71 3d 30 2e30 31  0d 0a 52 65 66 65 72 65 72 3a 20 68 74 74 70 3a 2f 2f 74 69 65 62 61 2e 6261 69 64 75 2e 63 6f 6d 2f 70 2f 33 37 31 34 39 30 38 37 38 33 3f 70 69 64 3d36 37 33 31 36 33

 

 

POST/f/commit/post/add HTTP/1.1

Host:tieba.baidu.com

Connection:keep-alive

Content-Length:552

Origin:http://tieba.baidu.com

X-Requested-With:XMLHttpRequest

User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko)Chrome/21.0.1180.89 Safari/537.1

Content-Type:application/x-www-form-urlencoded; charset=UTF-8

Accept:application/json, text/javascript, */*; q=0.01

Referer: http://tieba.baidu.com/p/3714908783?pid=673163

大家看到了吗,这就是通过对数据包简单的解析看到的结果,别的不说,起码网址浏览记录我们已经可以监控了,百度贴吧的也是可以的







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值