7

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

 3 years ago
source link: https://blog.csdn.net/orbit/article/details/89072274
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

移植 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK