赞
踩
简单来说,LSP是微软公司提供的位于Windows环境下的编程接口,其目的提供第三方用户进行网络数据包的HOOK的标准接口。LSP是位于RING3层的一个HOOK框架,另外需要注意的是从Windows8、Windows Server 2012 开始,这个框架已经不再被微软所推荐,取而代之的是另外一个框架——Windows Filtering Platform,WPF,这也是网游加速器的第三种技术,之所以暂时不研究这个技术是因为从从MSDN及其其他网站上看WPF这个框架似乎是需要使用内核编程的相关知识,似乎不太好去动它。
大家知道,在国内由于存在无望长城,在玩一些国外游戏的时候(特别是烂橘子、Xbox)等一些游戏的时候,如果不接专线,一般都需要使用各种网游加速器。网游加速器可以使用如下形式进行加速:
无论使用哪一种方法,网游加速器的客户端需要解决一个根本的问题:如何将一个独立的进程的网络通信包的路由进行更改?这个问题我之前进行了很多思考,我自认为有如下几种解决方式:
http_proxy
、https_proxy
环境变量来设置代理以上的方式都是自己的一些猜想,通过网络上查看了一些资料,文章的出处留在了本文的最后,非常感谢这些大牛提供的帮助。我看到的几篇文章有不同的地方,但是发现现行的网游加速器一般都采用几重技术来保证加速器的正常运行,这些技术一般包括:
另外还有通过创建虚拟网卡来实现的,但是无论哪一篇文章,都提到了LSP作为实现加速的首选。因此我就准备研究一下这个技术到底是什么玩意。另外网络上似乎并没有从零开始的教程,所以自己也准备好好写一下。
我个人认为学习一个新的技术的首要前提是将程序先跑起来,所以这次系列文章的第一步是先将环境搭起来。
首先列一下我成功编译了的环境:
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 测试工具。扩展安装目录中提供了使用条款和第三方通知。
整个程序由两部分组成,一个程序是通过Windows的微软接口来安装自己分层协议,另外一个程序是一个动态库,动态库里面实现了自己的分层协议。这个部分主要记录一下编译环境的配置,主要是DLL动态库的配置。其中的代码都是通过网络上收集来的,在我的环境中需要对代码做出一定的修改,具体体现在头文件处。另外具体的出处依然在附录中。我自己配置好的项目放在Github上,传送门。
这个程序直接使用普通的命令行程序就可以了,需要注意的是有几个点:
lspInject
这个函数中有一个局部变量dllpath
,路径需要指向接下来编译的DLL路径。ws2_32
和Rpcrt4
,其中第二个库是用于生成GUID的。Windows.h
头文件前需要宏定义一个标志以排除Windows.h
中的一些结构体,否则编译时会造成重复定义。源码的话详见Github中的Layered_Service_Providers_Install_Uninstall
项目。对于安装程序用到的概念会在第三篇文章中讲解。
关于这个Demo,准备实现的效果为:对于连接端口为443或者80的应用程序,弹出一个弹窗来证明自己(另外对于Firefox和QQ效果都不是很理想,不知道为什么)
由于之前很少做过DLL库的编译过程,这次编译过程踩了比较多的坑。所以新手项的记录一下整个的编译过程,关于在Visual Studio下的编译DLL的系统体系,我在后面可能会写一篇系列文章。
首先需要创建一个DLL动态库的项目(题外话,实际上创建不同项目的实质是Visual Studio会选择不同的默认链接库,默认头文件)
创建好之后在源文件中添加模块定义文件
我们可以看到对应的文件目录
可以看到,这个文件树实际上有点复杂。但是现在的我们仅仅需要知道以下几点:
framework.h
头文件中,这样做的用意是让整个项目的依赖关系显得比较清晰;Dll1.cpp
文件中;创建好整个项目框架之后,我们在根据约定在Dll1.dll
中添加自己的函数,如WSPStartup
、WSPConnect
之类的。具体的实现可以参考我的Github源码。
创建Source.def
文件的原因是WSPStartup
函数在其他地方已经被实现了,如果直接使用__declspec(dllexport)
这个宏,连接过程会报如下错误:
error C2375: “WSPStartup”: 重定义;不同的链接
为了避免以上错误,我们需要使用*.def
文件定义导出函数,至于这个文件的语法,可以查看MSDN:
LIBRARY Dll1
EXPORTS
WSPStartup
编译完成之后应该可以在对应的输出环境下看到lib文件和dll文件。使用安装程序进行安装应该就可以看到效果了。
调试是一门大的学问,由于这里的主题是LSP技术,所以只记录一下调试的入门技术。
由于动态库无法脱离主程序进行运行,调试动态库一般来说都需要另外编写一个主程序,来联合调试。当对于我们的LSP的DLL,还有另外一条路可以走:使用调试器附加到任意一个网络进程中,加载符号表进行调试。
我推荐使用第一种方法,原因是这样我们可以完全控制程序流程。当然,无论哪一条路这里推荐使用Visual Studio 自带的调试器进行调试,比较友好。还需要注意的一点是只能使用DEBUG版的DLL,以下记录以下流程。
采用这种方式进行调试,我们需要一个主程序,主程序项目和DLL项目放在同一个解决方案里面。如下所示:
其中Test_C项目是一个使用了TCP连接的应用;
附加程序进行调试我们只需要在成功编译了DLL的项目下找到Visual Studio的调试器就可以了。入口如下所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。