TCP连接劫持

7
我有一个在C++中开发的小项目,由于它所做的事情的特殊性质,我需要将数据包插入到实时TCP流中。(目的是无辜的,如果你非得知道可以查看这里:http://ee.forumify.com/viewtopic.php?id=3299) 我正在为游戏创建一个级别编辑器,由于握手的特性,我不能简单地使用高级库(如WinSock)建立新连接。到目前为止,它一直依赖于Winsock Packet Editor 来处理这些问题,但如果我让应用程序处理所有事情,那么每个人都会很高兴。
所以我的问题是:是否有API可以让我控制实时TCP流,并最好在完成后保持其有效性?我希望不需要注入任何DLL。同时,由于我使用GCC/Mingw,Detours不能使用。
我已经尝试了WinPCap,并编写了一些工作代码(我可以收集数据包,并从中生成适当的数据包进行发送),但由于它在如此低的层次上操作,我无法预见用户可能使用的所有潜在协议。是的,他们可能仍然在使用以太网上的IPv4,但那些仍然使用PPP或其他模糊协议的人怎么办?此外,客户端应用程序在我的应用程序完成后会断开连接,因为数据包中的最新ID值已更改,客户端认为它已断开连接。
因此,如果有人能够提供高级TCP流操作器,我将非常高兴。如果没有,我将继续尝试WinPCap,并告诉所有拨号用户去获得更好的互联网连接。
目标平台:Microsoft Windows XP至Windows 7。

你应该阅读Michael Flenov的《Hackish C++: Pranks and Tricks》。这本书听起来像是一本计算机恶作剧书,但他有很多关于网络的优秀案例,可以应用到这个项目中。 - Nate Koppenhaver
有没有地方可以免费在线阅读它?不幸的是,我的当地图书馆系统没有这本书的副本。 - Kaslai
我不知道...也许你可以在谷歌上找到一些东西。我已经在某个地方打了一些代码,如果我找到相关的文件,我会发布一些代码。 - Nate Koppenhaver
很抱歉,我好像没有打出我想要的条目。对不起,我不能提供更多帮助,但我建议您查找Winsock2库。我非常确定它可以实现这一点。我确信它支持原始套接字。 - Nate Koppenhaver
我已经研究了Winsock2,但由于安全原因,原始套接字的兼容性非常糟糕。这将限制我的用户群体只能使用XP专业版或更早版本。 - Kaslai
3个回答

2
创建一个独立进程来绑定本地端口。当创建初始 TCP 流时,通过该进程进行代理,然后将其转发到网络。当您需要“注入”流时,可以让这个代理进程来执行。只是一个想法。

一个简单的方法是使用SOCKS代理,它基本上有一个序言来告诉服务器进程要连接到哪个目标端口,并等待代理建立连接,然后“简单地将数据包从服务器复制到客户端,从客户端复制到服务器”。但是,代理不一定只能复制数据包。它可以跟踪协议协商,并在初始协议级别握手完成后开始修改数据。在Windows下,像ProxyCap这样的工具对于重定向TCP连接非常有用。OWASP代理在服务器端。 - Rogan Dawes

1

0

我认为没有任何明智的API可以让你劫持TCP流。这样的事情本质上会成为一个安全问题。

你能否将你的程序插入到相关连接的代理中?也就是说,让打开连接的程序将其打开到你的程序,然后让你的程序打开到真正的目标连接。

这个想法是,如果所有的数据包都通过你的程序传递,那么修改TCP流就变得相对容易。


是的,我可以使用WinPCap作为嗅探器,它允许我直接修改网络卡的位流,但由于我在这方面缺乏经验,它的兼容性不会像我希望的那样高。 - Kaslai
@Aslai - 我的意思是,没有更兼容的API来拦截和操作TCP流。这不是一个“正常”的需求。正常的做法是成为一个显式代理,这样就不会有任何疑问,也不需要进行低级别的奇怪操作。 - Michael Kohne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接