当前位置:   article > 正文

自己做一个的网络防火墙(一):技术简介及编译环境的安装_如何编写防火墙程序

如何编写防火墙程序


一、LSP是什么(Layered Service Providers,分层服务提供者)

简单来说,LSP是微软公司提供的位于Windows环境下的编程接口,其目的提供第三方用户进行网络数据包的HOOK的标准接口。LSP是位于RING3层的一个HOOK框架,另外需要注意的是从Windows8、Windows Server 2012 开始,这个框架已经不再被微软所推荐,取而代之的是另外一个框架——Windows Filtering Platform,WPF,这也是网游加速器的第三种技术,之所以暂时不研究这个技术是因为从从MSDN及其其他网站上看WPF这个框架似乎是需要使用内核编程的相关知识,似乎不太好去动它。

二、文章背景

大家知道,在国内由于存在无望长城,在玩一些国外游戏的时候(特别是烂橘子、Xbox)等一些游戏的时候,如果不接专线,一般都需要使用各种网游加速器。网游加速器可以使用如下形式进行加速:

  • 更改数据包的路由;
  • 使用类似于Net的方式修改端IP地址来起到更改包路由的作用;

无论使用哪一种方法,网游加速器的客户端需要解决一个根本的问题:如何将一个独立的进程的网络通信包的路由进行更改?这个问题我之前进行了很多思考,我自认为有如下几种解决方式:

  • 入侵游戏进程并HOOK对应的通信函数,这种方式理论上可行,但是实际上直接修改游戏进程的内存和外挂的实现方式极其相似,很容易导致账号的误封;另外直接修改程序内存很容易导致不稳定,还有一个原因就是进行如此敏感的操作,必然需要用户进行手动操作,而在现行的加速器中并没有看到对应的提示;
  • 修改网络路由表;
  • 通过Windows提供的编程接口来进行处理,如浏览器代理可通过设置http_proxyhttps_proxy环境变量来设置代理

以上的方式都是自己的一些猜想,通过网络上查看了一些资料,文章的出处留在了本文的最后,非常感谢这些大牛提供的帮助。我看到的几篇文章有不同的地方,但是发现现行的网游加速器一般都采用几重技术来保证加速器的正常运行,这些技术一般包括:

  1. LSP技术;
  2. HOOK技术;
  3. WFP技术;
  4. VPN技术;

另外还有通过创建虚拟网卡来实现的,但是无论哪一篇文章,都提到了LSP作为实现加速的首选。因此我就准备研究一下这个技术到底是什么玩意。另外网络上似乎并没有从零开始的教程,所以自己也准备好好写一下。

三、程序编译

我个人认为学习一个新的技术的首要前提是将程序先跑起来,所以这次系列文章的第一步是先将环境搭起来。

3.1 系统环境

首先列一下我成功编译了的环境:

  • Windows版本号:Windows Feature Experience Pack 120.2212.3530.0,Win10
  • Visual Studio的系统信息为:
Microsoft Visual Studio Community 2019
版本 16.8.2
VisualStudio.16.Release/16.8.2+30717.126
Microsoft .NET Framework
版本 4.8.04084

已安装的版本: Community

Visual C++ 2019   00435-60000-00000-AA083
Microsoft Visual C++ 2019

ASP.NET and Web Tools 2019   16.8.553.28003
ASP.NET and Web Tools 2019

C# 工具   3.8.0-5.20567.16+53c5d7d3cf13d88978744a32a27c5f8350a8400a
IDE 中使用的 C# 组件。可能使用其他版本的编译器,具体取决于你的项目类型和设置。

Debugging Tools for Windows   10.0.19030.1000
Integrates the Windows Debugger functionality (http://go.microsoft.com/fwlink/?linkid=223405) in Visual Studio.

IntelliCode 扩展   1.0
IntelliCode Visual Studio 扩展详细信息

Microsoft JVM Debugger   1.0
Provides support for connecting the Visual Studio debugger to JDWP compatible Java Virtual Machines

Microsoft MI-Based Debugger   1.0
Provides support for connecting Visual Studio to MI compatible debuggers

Microsoft Visual C++ 向导   1.0
Microsoft Visual C++ 向导

Microsoft Visual Studio VC 软件包   1.0
Microsoft Visual Studio VC 软件包

MySQL for Visual Studio   1.2.9
Data design and management tools for MySQL. Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.

NuGet 包管理器   5.8.0
Visual Studio 中的 NuGet 包管理器。有关 NuGet 的详细信息,请访问 https://docs.nuget.org/

ProjectServicesPackage Extension   1.0
ProjectServicesPackage Visual Studio Extension Detailed Info

Test Adapter for Boost.Test   1.0
Enables Visual Studio's testing tools with unit tests written for Boost.Test.  The use terms and Third Party Notices are available in the extension installation directory.

Visual Basic 工具   3.8.0-5.20567.16+53c5d7d3cf13d88978744a32a27c5f8350a8400a
IDE 中使用的 Visual Basic 组件。可能使用其他版本的编译器,具体取决于你的项目类型和设置。

Visual Studio Code 调试适配器主机包   1.0
用于在 Visual Studio 中托管 Visual Studio Code 调试适配器的互操作层

Visual Studio Tools for CMake   1.0
Visual Studio Tools for CMake

Windows Driver Kit   10.0.19030.1000
Headers, libraries, and tools needed to develop, debug, and test Windows drivers (msdn.microsoft.com/en-us/windows/hardware/gg487428.aspx)

适用于 Google Test 的测试适配器   1.0
启用带有针对 Google Test 编写的单元测试的 Visual Studio 测试工具。扩展安装目录中提供了使用条款和第三方通知。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

3.2 编译过程

整个程序由两部分组成,一个程序是通过Windows的微软接口来安装自己分层协议,另外一个程序是一个动态库,动态库里面实现了自己的分层协议。这个部分主要记录一下编译环境的配置,主要是DLL动态库的配置。其中的代码都是通过网络上收集来的,在我的环境中需要对代码做出一定的修改,具体体现在头文件处。另外具体的出处依然在附录中。我自己配置好的项目放在Github上,传送门

3.2.1 安装程序的编译

这个程序直接使用普通的命令行程序就可以了,需要注意的是有几个点:

  • lspInject这个函数中有一个局部变量dllpath,路径需要指向接下来编译的DLL路径。
  • 需要连接两个动态库ws2_32Rpcrt4,其中第二个库是用于生成GUID的。
  • 在包含Windows.h头文件前需要宏定义一个标志以排除Windows.h中的一些结构体,否则编译时会造成重复定义。

源码的话详见Github中的Layered_Service_Providers_Install_Uninstall项目。对于安装程序用到的概念会在第三篇文章中讲解。

3.2.2 DLL文件的编译

关于这个Demo,准备实现的效果为:对于连接端口为443或者80的应用程序,弹出一个弹窗来证明自己(另外对于Firefox和QQ效果都不是很理想,不知道为什么)
由于之前很少做过DLL库的编译过程,这次编译过程踩了比较多的坑。所以新手项的记录一下整个的编译过程,关于在Visual Studio下的编译DLL的系统体系,我在后面可能会写一篇系列文章。
首先需要创建一个DLL动态库的项目(题外话,实际上创建不同项目的实质是Visual Studio会选择不同的默认链接库,默认头文件)
在这里插入图片描述创建好之后在源文件中添加模块定义文件在这里插入图片描述
我们可以看到对应的文件目录
在这里插入图片描述
可以看到,这个文件树实际上有点复杂。但是现在的我们仅仅需要知道以下几点:

  • 将需要包含的头文件放在framework.h头文件中,这样做的用意是让整个项目的依赖关系显得比较清晰;
  • 需要导出的函数放在Dll1.cpp文件中;
  • Source.def文件,实际上定义了需要导出的函数及其导出规定;

创建好整个项目框架之后,我们在根据约定在Dll1.dll中添加自己的函数,如WSPStartupWSPConnect之类的。具体的实现可以参考我的Github源码。
创建Source.def文件的原因是WSPStartup函数在其他地方已经被实现了,如果直接使用__declspec(dllexport)这个宏,连接过程会报如下错误:

error C2375: “WSPStartup”: 重定义;不同的链接
  • 1

为了避免以上错误,我们需要使用*.def文件定义导出函数,至于这个文件的语法,可以查看MSDN:

LIBRARY Dll1
EXPORTS
WSPStartup
  • 1
  • 2
  • 3

编译完成之后应该可以在对应的输出环境下看到lib文件和dll文件。使用安装程序进行安装应该就可以看到效果了。
在这里插入图片描述

3.2 如何调试我们的DLL

调试是一门大的学问,由于这里的主题是LSP技术,所以只记录一下调试的入门技术。
由于动态库无法脱离主程序进行运行,调试动态库一般来说都需要另外编写一个主程序,来联合调试。当对于我们的LSP的DLL,还有另外一条路可以走:使用调试器附加到任意一个网络进程中,加载符号表进行调试。
我推荐使用第一种方法,原因是这样我们可以完全控制程序流程。当然,无论哪一条路这里推荐使用Visual Studio 自带的调试器进行调试,比较友好。还需要注意的一点是只能使用DEBUG版的DLL,以下记录以下流程。

3.2.1 使用主程序联合DLL进行调试

采用这种方式进行调试,我们需要一个主程序,主程序项目和DLL项目放在同一个解决方案里面。如下所示:
在这里插入图片描述
其中Test_C项目是一个使用了TCP连接的应用;

3.2.1 附加程序进行调试

附加程序进行调试我们只需要在成功编译了DLL的项目下找到Visual Studio的调试器就可以了。入口如下所示:
在这里插入图片描述

文献

  1. 加速器行业现状分析:https://zhuanlan.zhihu.com/p/344279029?utm_source=qq&utm_medium=social&utm_oi=1002876282178215936
  2. 加速器DLL实现解析:https://blog.csdn.net/liulilittle/article/details/80678195
  3. https://docs.microsoft.com/en-us/windows/win32/api/ws2spi/nf-ws2spi-wscinstallprovider
  4. 实现代码:https://www.cnblogs.com/freesec/p/6541725.html
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/211045?site
推荐阅读
相关标签
  

闽ICP备14008679号