最近,我开始研究一个程序,该程序将监视我的一个开源程序的数据包,以试图了解有关编程和网络的更多信息。此外,我想在不编辑源代码的情况下为程序添加其他功能,如外部控制面板。
(我使用WPE Pro过滤数据包,以防你想知道,WireShark对于这么简单的任务来说太麻烦了。)但有一件事困扰我,即Socket ID。
我知道它是什么,之前我曾问过一个关于它的问题,但我无法弄清楚如何使用它/分配一个/拦截一个。
如果没有正确的套接字ID,我的程序将无法执行任何操作,所以我的问题是,一旦捕获数据包,是否可以找出套接字正在使用的套接字ID?
如果没有,还有其他办法吗? - 或其他可能的语言,如Visual Basic?
感谢您的时间。
答案 0 :(得分:4)
如果按套接字ID表示成功调用socket()
函数的返回值,我认为没有办法。
您可以获得的最接近的事情是进程ID,因为您可能已经知道,每个IP数据包都有一个由元组(IP地址,端口)描述的目标,并且在系统内只有一个套接字可以成功绑定到那个元组。像TCPView这样的实用程序能够将IP元组映射到进程,因此如果该信息对您来说足够存在。。
如果不是这种情况,我不知道有任何方法可以检索您需要的套接字ID 如果目标应用程序不是协作的。
答案 1 :(得分:1)
答案 2 :(得分:0)
socket()
返回一个文件描述符,如果这是你所指的套接字ID,那么在没有进程在窗口上的协作的情况下获得这个的方法是有限的。 Linux开放FD上的FWIW在proc文件系统中枚举。
话虽这么说,你唯一能用fd做的就是从套接字发送附加信息。您也可以从fd读取,但以这种方式读取的任何数据都将 not 发送到拥有该套接字的应用程序。没有一些协调,这可能不是你想要的,因为你只是得到点点滴滴的数据。
如果只是希望能够收听程序中的流量,那么包过滤之类的内容应该足够了,所以我假设你真的希望能够像中间人一样。
如果是这种情况,那么最好的办法就是将您的应用程序设置为其他服务的代理。
我的意思是,编写一个打开侦听端口并在启动连接时接受连接的程序,它应该立即打开自己与预先配置的IP:端口组合的连接并开始转发流量。一旦编写完成,在转发之前检查流量并可能修改它是一件简单的事情。
如果您的程序是服务器,请在非标准端口上运行,配置此应用程序以打开服务器的正常端口,然后将连接转发到您在localhost上设置的非标准端口。
如果你的程序是客户端,只需将拦截器应用程序指向服务器并在你的盒子上选择一个随机的监听端口。然后将客户端配置为连接到此侦听端口,就好像它是服务器一样。
这应该适用于任何事情。唯一需要注意的是,如果流量被加密,您将(显然)无法检查/修改流量。这实际上与将您的应用程序放在NAT后面相同。