查看进程 socket 连接的简单办法

起因是想知道一款游戏连接的服务器地址。虽然可以考虑用抓包工具之类的做到,但是感觉有点麻烦,要说监控的话还是挺难实现的。不过思考之后,发现可以用系统自带的 netstat 命令来做。比如想知道一个游戏连接的服务器地址是多少,可以先找到这个游戏的进程 pid,然后通过:

netstat -ano | findstr [pid]

来过滤查找。

简单写了个 C语言的程序调用这个 cmd 命令:

#include <windows.h>
#include <stdio.h>

void help( );

int main(int argc, char const *argv[])
{
	INT i;
	HWND hWnd;
	CHAR command[256];
	DWORD dwProcessId;

	if( argc == 1)
	{
		help();
		return;
	}

	if (argc == 3)
	{
		if ( strcmp(argv[1], "/p" ) == 0 )
		{
			wsprintf(command, "netstat -ano | findstr %s", argv[2]);
			system(command);
		}

		if ( strcmp(argv[1], "/w" ) == 0 )
		{
			hWnd = FindWindow(NULL, argv[2]);
			if (hWnd <= 0)
			{
				printf("Can't find process by window name %s", argv[2]);
				return 0;
			}
			GetWindowThreadProcessId(hWnd, &dwProcessId);
			if (dwProcessId > (DWORD)0)
			{
				printf("Pid: %d n", dwProcessId);
				wsprintf(command, "netstat -ano | findstr %d", dwProcessId);
				printf("  协议   本地地址              外部地址        状态           PIDn");
				system(command);
			} else {
				printf("Can't find process by window name %s", argv[2]);
			}
		}
	}
	return 0;
}

void help()
{
	printf("getport [options] [param] n");
	printf("/p 通过 pid 查找 n");
	printf("/w 通过窗口名称查找 n");
}

获取程序的 socket 连接

就这样简单的拿到了一个程序连接的 socket 信息(包括 ip 和 端口)。

当然并不是所有程序都能通过这个拿到,有的程序可能是通过子进程来发的 socket。有的程序(比如QQ)会通过服务器中转,所以发送文件的时候只会拿到腾讯中转服务器的 ip(不过早期的QQ确实是可以通过拿到聊天对象的 ip)。

Advertisements

1 thought on “查看进程 socket 连接的简单办法

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s