移植 lwip,在 windows 内核构建一个 TCPIP 协议栈

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/orbit/article/details/89072274

移植 lwip,在 windows 内核构建一个 TCPIP 协议栈

亲,当你点开看这篇文章,就说明你知道我想要干什么事情,或者说,你知道在 Windows 的内核种绕开它的网络协议,再独立构建一个网络协议栈的意义。如果你要问我有 windows 系统的网络协议栈不用,移植 lwip 有什么意义,那么你可以关闭链接走人了,因为这篇文章不适合你,它不是讲 lwip 移植原理的。

经常关注我的博客的朋友们可能还记得,大概十年前我写过一篇关于防火墙的文章,里面简单提到了在 Windows 内核构建 TCP/IP 协议栈绕过防火墙的概念的可行性。当时经过研究,确实是可行的。我将 lwip 移植到了Windows 内核,以内核驱动的形式在 NDIS 层构建了一个独立于 Windows 的网络协议栈。lwip(Lightweight TCP/IP stack) 是一套轻量级的 TCP/IP 协议栈,不过演化到今日,它已经不“轻”了,围绕 lwip 已经构建了一整套的以太网网络协议。当时是基于 Windows XP平台做的一个演示概念,使用 NDIS Hook,移植的 lwip 版本是 1.2 。因为 lwip 提供了一套与巴克利 socket 接口几乎 90% 兼容的 socket API,所以当时几乎不费吹灰之力就在内核中构建了一个 http 协议的客户端,使得驱动能够在内核中从指定的 URL 地址(写在注册表中)下载一个文件,如果是可执行文件,甚至还可以用 stackoverflow 上介绍的方法在内核中启动这个可执行文件。当时测试的主流防火墙软件,都感知不到这些网络访问,可以说成功地绕过了防火墙。

在这里插入图片描述

这个东西做完之后,这个演示原型已经烂在我的硬盘上十几年了,最近突然发现 lwip 已经更新到 2.1.2 版本了,支持了包括 IPV6 在内的更多协议。我看说明文件,在 contrib 部分甚至还有一个 http server 的完整实现,我的天啊,如果在内核构建一个能绕开所有防火墙的 http server,简直不敢想象。如果利用 lwip 提供的 socket API,将 3Proxy 也移植到内核中,我的天啊,更是不敢想啊。

那么到底行不行呢?不试试怎么知道?趁着最近有点时间,我决定搞一下。不过真的要搞起来,困难还是很多的,首先,从 Windows vista 开始,NDIS 已经升级到了 6.x 版本,基于 5.x 的体系已经过时了,同时 64 位的 PG 不允许 Hook NDIS层,这些都是需要修改的地方。不过好在 MS 还是为防火墙软件的开发人员留了条口子,那就是 NDIS Filter。不用 Hook,只用合法的 NDIS Filter 能否实现这个功能呢?我心里还是没底的。另外,lwip 2.x 版本的体系结构和 1.2 的差异还是很大的,这个移植的工作量有多大心里也没底。

整理了一下,大概要做以下几件事情:

  • 以 DDK 中的 NDIS Filter 实例代码为基础,删除不需要的内容,构建一个空的 NDIS Filter 框架。
  • 将 lwip 1.3.2 移植到内核。为什么不选择最新的 2.1.2 版本?因为看起来移植的工作量比较大,1.3.2 的代码结构与 1.2 的差异比较小,并且已经开始支持 IPV6 ,基本上我们需要的功能都有了,为了减少移植的工作量和难度,我选择 1.3.2 版本。根据 1.2 的移植经验,这个移植应该不难。这部分移植的主要工作是将 lwip 的收发帧接口适配到 NDIS 的体系中,同时处理好定时器线程的处理,内核线程毕竟比用户态线程有更多的约束。还有,当系统中有多个网卡的时候,以及一块网卡有多个 IP 接口的时候,也是需要 lwip 做一些适配修改的。
  • 将 lwip 演示程序中的 http server 移植到内核,通过对 137 端口的复用,尝试开启一个内核中的 http server。这个东西如果成功了,应该能够通过浏览器访问:http://127.0.0.1:137 ,并看到演示的页面。
  • 最后,终极目标是尝试将 3Proxy 移植到内核,配合 lwip 实现一个代理服务器的功能。这个如果成功了,就可以在内核神不知鬼不觉地开启一个代理服务,3Proxy 可是支持多种代理协议的啊。这一步的工作难度还是比较大的,毕竟 lwip 的socket API接口与真的巴克利 socket 接口还是不一样的,我考虑做一个适配层,但是如果 3Proxy 用了太多 lwip 不支持的功能,那么这个适配层就比较难做,有可能导致移植失败。

根据我掌握的知识,前三步还是比较容易做到的,关键是看我有没有时间,要知道,我的懒惰症还是很严重的。上次是因为要测试一下防火墙,所以有了点动力,这次难道还测防火墙?不管怎么样,先从 NDIS Filter 开始吧。

我有一个 lwip

面朝内核,支持Proxy

从今天起,关心 NDIS Filter 和 3Proxy

展开阅读全文

没有更多推荐了,返回首页