我正试图逆向工程第三方TCP客户端/服务器Windows XP, SP 3应用程序,我没有可用的源代码。我的主要攻击路线是使用WireShark捕获TCP流量。
当我在客户端发出某个GUI命令时,客户端创建到服务器的TCP连接,发送一些数据,然后断开连接。服务器端端口为1234,客户端端口由操作系统分配,因此不一致
WireShark显示与我发出的GUI命令相对应的消息被发送了两次。这两个消息具有不同的源端口,但它们具有相同的目的端口(如前所述,为1234)。
客户端实际上由几个进程组成,我想确定哪些进程正在发送这些消息。这些过程是长期存在的,因此它们的pid是稳定且已知的。然而,所涉及的TCP连接是短暂的,仅持续几毫秒左右。虽然我已经在WireShark中捕获了客户端端口号,虽然我知道所有涉及的PID,但连接是瞬时的这一事实使得很难确定哪个PID打开了端口。(如果连接是长期存在的,我可以使用netstat将端口号映射到pid。)谁有什么建议,我如何才能确定哪些进程正在创建这些瞬态连接?
我能想到两件事:
-
尝试sysinternals的tcpview程序。它给出了系统中所有进程打开的所有tcp连接的详细列表。如果一个进程创建了连接,您将能够在tcpview中看到它们闪现(连接和断开连接都闪现),并且您将知道要开始查看哪些进程。
-
尝试在调试器下运行二进制文件。Windbg支持多进程调试(我认为visual studio也是如此)。您可能只有导出符号可以使用,但这仍然可以用于对系统dll的调用。尝试破坏任何可疑的windows api,您知道进程将调用这些api来创建连接。MSDN应该有大多数系统api文档的相关dll。
从这里开始……
我最终创建了一个批处理文件,它在一个紧密循环中运行netstat,并将其输出附加到一个文本文件中。我在运行系统时运行这个批处理文件,通过梳理所有netstat转储,我能够找到一个包含与端口相关的pid的转储。