不知道各位有没有安装新的for 2k的platformsdk啊,如果安装后,不妨比较一下一些头文件和vs98原有的头文件的异同,会发现不少有趣的东东喔!有些内容其实ms早就在之前的平台上就提供了支持,只不过一直没有写入它的头文件里去,下面就是在winsock2.h里发现的一个例子: 在新版的winsock2.h里,多了这么一段定义: #define so_exclusiveaddruse ((int)(~so_reuseaddr)) /* disallow local address reuse */ 从ms的注释也可以看出来了,这个东东是为了防止本地端口被重用的,我们知道,本来我们是可以向同一个端口绑定两个socket的,只要使用上面被“反”掉的那个选项so_reuseaddr就可以了,想想看这会发生什么事?我们可以在一个程序打开pop3端口(服务器端缺省是110,客户端应该设置为随机选择)收信的同时,运行自己的程序,绑定自己的socket到同样的端口上,这时侯你就可以在该程序收信的同时,窃听到信件的内容,包括账户密码!看起来非常简单,不是吗?可是现实中很多软件并没有采取任何有效的策略来对付这一手,比如国内著名的某电邮客户端软件f**mail. 那么我们该怎么防止这种情形在自己的程序运行当中出现?直接的想法是实时监控本机连接,看看都有些什么端口被绑定了,如果发现窃听程序存在立刻断开。听起来不错,可是真等你断开连接时可能密码已经泄漏了,要确保在密码传输前切断连接,需要大量的实时处理工作,就算抛开这些困难不谈,在windows平台下去访问一大堆的注册表内容来确定目前活动的端口就有够烦了。还好,现在有了上面的这个socket选项,一切就变得简单了,请看如下演示程序: //test.cpp : test exclusive with sockets //if it's ok then written by star, else i don't know^_^ //#include #include //if have no the new platformsdk, then u need to add the //define statement to your sourcecode, else remove it // #define so_exclusiveaddruse ((int)(~so_reuseaddr))const u_short exclusive_port = 110;//or othersvoid main(int argc, char* argv[]) { socket sock1, sock2; int ret; bool val; wsadata ws; struct sockaddr_in in; //need winsock 2.0! if (wsastartup (2, &ws)) return; if (lobyte (ws.wversion) - 2) return; //make two sockets sock1 = socket (af_inet, sock_stream, ipproto_tcp); sock2 = socket (af_inet, sock_stream, ipproto_tcp); val = true; ret = setsockopt (sock1, sol_socket, so_exclusiveaddruse, //set to exclusive (lpcstr)&val, 4); if (ret) { //failed.... //do something to clear the error.... return; } zeromemory (&in, sizeof(in)); in.sin_family = af_inet; in.sin_port = htons (exclusive_port); in.sin_addr.s_addr = inaddr_any; printf ("now to bind the first socket to port %d with so_exclusiveaddruse\n", exclusive_port); if (bind (sock1, (const struct sockaddr*)&in, sizeof(in))) { //failed... //do something to clear the error... closesocket (sock1); return; } printf ("the first socket has been bound to port %d\n", exclusive_port); ret = setsockopt (sock2, sol_socket, so_reuseaddr,//try to reuse (lpcstr)&val, 4); if (ret) { //failed.... //do something to clear the error.... return; } zeromemory (&in, sizeof(in)); in.sin_family = af_inet; in.sin_port = htons (exclusive_port); in.sin_addr.s_addr = inaddr_any; printf ("\nnow to bind the second socket to port %d\n", exclusive_port); if (bind (sock2, (const struct sockaddr*)&in, sizeof(in))) { if (wsaeaddrinuse == getlasterror ()) printf ("bind failed, the so_exclusiveaddruse take effect!\n"); else { //failed... //do something to clear the error... } } else printf ("what??? i see nothing!!!\n"); closesocket (sock1); closesocket (sock2); return; } 上面的代码在我的pnt4sp6下编译运行通过,注意除了几个显眼处,很多地方都缺少应有的错误检测,需要用的朋友自己加上吧。9x下的情况我就不很清楚了,毕竟没用已经一年了,快忘光了:-)知道的朋友还请告诉我:-)我会补在后面的:-) --------------------------------------------------------------------------------copied
to blastball([email protected]) ,难道你真的这样试过了吗?地址重用以后,就可以截获别人的数据?如果这样的话,为什么当初要设计地址重用呢?我记得UNP中不是这么说的。 细节我要去查一下。我认为你错了。
int PASCAL FAR setsockopt( SOCKET s, int level, int optname, const char FAR* optval, int optlen);用这个函数,如: SOCKET sock; BOOL optB = 1;sock = socket(AF_INET,SOCK_DGRAM,0); setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&optB,sizeof(optB));然后呢就可以在sock这个逃接字上面帮定已经帮定的端口了
大家介绍一下啊
而不是一个木马。但是起不到隐藏目的的,别人还是会发现有程序在监听21端口而怀疑的。
启动就可以了吗
那么如果在我绑定一个端口以后,系统也启动了这个端口后,会不会有
冲突阿。
作者:star 2000.6.12
不知道各位有没有安装新的for 2k的platformsdk啊,如果安装后,不妨比较一下一些头文件和vs98原有的头文件的异同,会发现不少有趣的东东喔!有些内容其实ms早就在之前的平台上就提供了支持,只不过一直没有写入它的头文件里去,下面就是在winsock2.h里发现的一个例子: 在新版的winsock2.h里,多了这么一段定义: #define so_exclusiveaddruse ((int)(~so_reuseaddr)) /* disallow local address reuse */ 从ms的注释也可以看出来了,这个东东是为了防止本地端口被重用的,我们知道,本来我们是可以向同一个端口绑定两个socket的,只要使用上面被“反”掉的那个选项so_reuseaddr就可以了,想想看这会发生什么事?我们可以在一个程序打开pop3端口(服务器端缺省是110,客户端应该设置为随机选择)收信的同时,运行自己的程序,绑定自己的socket到同样的端口上,这时侯你就可以在该程序收信的同时,窃听到信件的内容,包括账户密码!看起来非常简单,不是吗?可是现实中很多软件并没有采取任何有效的策略来对付这一手,比如国内著名的某电邮客户端软件f**mail. 那么我们该怎么防止这种情形在自己的程序运行当中出现?直接的想法是实时监控本机连接,看看都有些什么端口被绑定了,如果发现窃听程序存在立刻断开。听起来不错,可是真等你断开连接时可能密码已经泄漏了,要确保在密码传输前切断连接,需要大量的实时处理工作,就算抛开这些困难不谈,在windows平台下去访问一大堆的注册表内容来确定目前活动的端口就有够烦了。还好,现在有了上面的这个socket选项,一切就变得简单了,请看如下演示程序:
//test.cpp : test exclusive with sockets
//if it's ok then written by star, else i don't know^_^
//#include
#include //if have no the new platformsdk, then u need to add the
//define statement to your sourcecode, else remove it
//
#define so_exclusiveaddruse ((int)(~so_reuseaddr))const u_short exclusive_port = 110;//or othersvoid main(int argc, char* argv[])
{
socket sock1, sock2;
int ret;
bool val;
wsadata ws;
struct sockaddr_in in; //need winsock 2.0!
if (wsastartup (2, &ws))
return; if (lobyte (ws.wversion) - 2)
return; //make two sockets
sock1 = socket (af_inet, sock_stream, ipproto_tcp);
sock2 = socket (af_inet, sock_stream, ipproto_tcp); val = true;
ret = setsockopt (sock1, sol_socket, so_exclusiveaddruse, //set to exclusive
(lpcstr)&val, 4); if (ret)
{
//failed....
//do something to clear the error....
return;
} zeromemory (&in, sizeof(in));
in.sin_family = af_inet;
in.sin_port = htons (exclusive_port);
in.sin_addr.s_addr = inaddr_any; printf ("now to bind the first socket to port %d with so_exclusiveaddruse\n", exclusive_port); if (bind (sock1, (const struct sockaddr*)&in, sizeof(in)))
{
//failed...
//do something to clear the error...
closesocket (sock1);
return;
} printf ("the first socket has been bound to port %d\n", exclusive_port); ret = setsockopt (sock2, sol_socket, so_reuseaddr,//try to reuse
(lpcstr)&val, 4); if (ret)
{
//failed....
//do something to clear the error....
return;
} zeromemory (&in, sizeof(in));
in.sin_family = af_inet;
in.sin_port = htons (exclusive_port);
in.sin_addr.s_addr = inaddr_any; printf ("\nnow to bind the second socket to port %d\n", exclusive_port); if (bind (sock2, (const struct sockaddr*)&in, sizeof(in)))
{
if (wsaeaddrinuse == getlasterror ())
printf ("bind failed, the so_exclusiveaddruse take effect!\n");
else
{
//failed...
//do something to clear the error...
}
}
else
printf ("what??? i see nothing!!!\n"); closesocket (sock1);
closesocket (sock2); return;
} 上面的代码在我的pnt4sp6下编译运行通过,注意除了几个显眼处,很多地方都缺少应有的错误检测,需要用的朋友自己加上吧。9x下的情况我就不很清楚了,毕竟没用已经一年了,快忘光了:-)知道的朋友还请告诉我:-)我会补在后面的:-)
--------------------------------------------------------------------------------copied
细节我要去查一下。我认为你错了。
const char FAR* optval, int optlen);用这个函数,如:
SOCKET sock;
BOOL optB = 1;sock = socket(AF_INET,SOCK_DGRAM,0);
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&optB,sizeof(optB));然后呢就可以在sock这个逃接字上面帮定已经帮定的端口了