

移植 lwip,在 windows 内核构建一个 TCPIP 协议栈
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
Recommend
-
37
YCSB 是一个非常出名的性能测试框架,我们可以非常方便的用它来对系统进行多维度的性能测试,本来我也准备使用它来对我们系统进行性能测试的,但在调研了一番之后,我决定直接用 Go 来完全移植一个。过年的时候就一直在干这件事情,于是就有了 go-ycsb。 为什么需...
-
33
给安卓手机上刷入Windows,是不少刷机玩家们乐于讨论和实践的一件事,最近知名开发者NTAuthority晒出了一系列安卓手机刷入Windows的杰作。3月31日消息,继此前在Pixel3XL手机上运行Windows10后,开发者NTAuthority今日又晒出了一张图片,显示其已经可以让一加6T运...
-
51
-
35
罗权、于长奇@代码安全实验室 漏洞概述 2019年6月18日,RedHat官网发布CVE编号为CVE-2019-11477的漏洞,此漏洞是一个底层...
-
29
很多人会混淆鸿蒙跟Linux的关系。 先举个例子,大家很熟悉的Windows里面含有内核,也含有UI系统,含有桌面程序,普通人可以直接使用Windows。 但是Linux仅仅是一个内核(它提供进程管理、文件系统等概念),必须在Linux之上安装各种APP,普通人才可以使用。基于Linux...
-
38
很多人会混淆鸿蒙跟Linux的关系。先举个例子,大家很熟悉的Windows里面含有内核,也含有UI系统,含有桌面程序,普通人可以直接使用Windows。
-
8
Introduction Since the beginning of my journey in computer security I have always been amazed and fascinated by true remote vulnerabilities. By true remotes, I mean bugs that are triggerable remotely without any use...
-
4
本文分享自华为云社区《移植案例与原理 - build lite编译构建过程...
-
7
一、iperf3工作原理iperf3主要的功能是测试基于特定路径的带宽,在客户端和服务器端建立连接(三次握手)后,客户端发送一定大小的数据报并记下发送的时间,或者客户端在一定的时间内发送数据并记下发送的总数据。带宽的大小等于发送的总数据除以...
-
11
想了解更多关于开源的内容,请访问:
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK