一发送syn的例子

 
                  
     
     


这是一个构造SYN包做扫描的例子:

//---------------------------------------------------------------------------
//Filename:ss.c
//Author:yunshu
//---------------------------------------------------------------------------
//Filename:ss.c
//Author:yunshu
//Last:2004-04-02
//Thank Wineggdrop's Code
//---------------------------------------------------------------------------
#include <winsock2.h>
#include <ws2tcpip.h>
#include <MSTcpIP.h>
#include <stdio.h>
#include <string.h>

#pragma comment(lib,"ws2_32")


//全局变量


#define srcPort 8296

char srcIP[20] = {0};//定义源地址
char tgtIP[20] = {0};//定义目的地址
int portNow;//定义正在扫描的端口

//标准端口列表
int ports[20] = {21,22,23,25,53,79,80,110,111,135,139,445,554,1080,1433,1521,3306,3389,5631,8080};

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;


//函数原形


int send_packet();//发送数据函数
int recv_packet();//监听数据函数
USHORT checksum(USHORT *, int );//计算检验和函数
void usage(char *);//显示帮助函数
void check_port(char *);//判断端口是否开放函数



//main函数


int main(int argc,char *argv[])
{
WSADATA WSAData;
DWORD thread_ID = 1;
char FAR hostname[128];
struct hostent *phe;

if(argc != 2)//检查命令行参数是否正确
{
usage(argv[0]);
exit(0);
}

if (WSAStartup(MAKEWORD(2,2), &WSAData))
{
printf("WSAStartup Error.../n");
exit(0);
}

strcpy(tgtIP,argv[1]);//得到目标主机的ip地址

gethostname(hostname,128);//获取本机主机名

phe = gethostbyname(hostname);//获取本机ip地址结构

if(phe == NULL)
{
printf("Get LocalIP Error.../n");
}

strcpy(srcIP, inet_ntoa(*((struct in_addr *)phe->h_addr_list[0])));//得到本机ip地址

//调试用,注释掉
//printf("test/t%s/n",tgtIP);
//printf("test/t%s/n",srcIP);

//开启新线程,接受数据包,分析返回的信息
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recv_packet,NULL,0,&thread_ID);

Sleep(1000);//休息一下再启动发送数据包函数

for(int tmp = 0; tmp < 20; tmp++)
{
++thread_ID;

//要扫描的端口
portNow = ports[tmp];

//开启新线程,发送数据包
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)send_packet,NULL,0,&thread_ID);

//防止生成线程过快,休息
Sleep(100);
}

Sleep(1000);//等待扫描接结束
WSACleanup();
return 0;
}



Top
netsys2来电! 两星(中级) 信誉:1052006-1-23 11:57:31得分: 0
                  
     
     


//计算检验和函数,完全抄别人的
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);
}

void usage(char *prog)
{
printf("===========================================/n");
printf("Used To Scan Remote Host's Ports/n");
printf("OurTeam:<a href="http://www.ph4nt0m.net/n" target="_blank">http://www.ph4nt0m.net/n</a>");
printf("Usage:%s TargetIP/n",prog);
printf("===========================================/n");
exit(0);
}


//发送数据包的函数
int send_packet()
{
SOCKET sendSocket;
BOOL flag;
int timeout;
SOCKADDR_IN sin;
IP_HEADER ipHeader;
TCP_HEADER tcpHeader;
PSD_HEADER psdHeader;
char szSendBuf[60];
int ret;
unsigned long source_ip;
unsigned long target_ip;

//建立原生数据socket
if((sendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("Socket Setup Error.../n");
return 0;
}

//设置自己填充数据包
if(setsockopt(sendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR)
{
printf("Setsockopt IP_HDRINCL Error.../n");
return 0;
}

//设置超时时间
timeout = 1000;
if(setsockopt(sendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == SOCKET_ERROR)
{
printf("Setsockopt SO_SNDTIMEO Error.../n");
return 0;
}

target_ip = inet_addr(tgtIP);
source_ip = inet_addr(srcIP);

sin.sin_family = AF_INET;
sin.sin_port = htons(portNow);
sin.sin_addr.S_un.S_addr = target_ip;

//填充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 = source_ip;//源IP
ipHeader.destIP = target_ip;//目的IP

//填充TCP首部
tcpHeader.th_dport = htons(portNow);//目的端口
tcpHeader.th_sport = htons(srcPort); //源端口
tcpHeader.th_seq = 0x12345678;
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag = 2;//syn标志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG(推测,哈哈)
tcpHeader.th_win = htons(512);
tcpHeader.th_urp = 0;
tcpHeader.th_sum = 0;

//填充tcp伪首部
psdHeader.saddr = ipHeader.sourceIP;
psdHeader.daddr = ipHeader.destIP;
psdHeader.mbz = 0;
psdHeader.ptcl = IPPROTO_TCP;
psdHeader.tcpl = htons(sizeof(tcpHeader));

//计算TCP校验和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));

tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));

//计算IP检验和
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);
ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));

//发送数据包
ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin));

if(ret == SOCKET_ERROR)
{
printf("Send Packet Error.../n");
return 0;
}
else return 1;
}

int recv_packet()
{
SOCKADDR_IN sniff;
SOCKET sock;
char recvBuffer[65000] = {0};//缓冲区存放捕获的数据

//建立socket监听数据包
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

sniff.sin_family = AF_INET;
sniff.sin_port = htons(0);
sniff.sin_addr.s_addr = inet_addr(srcIP);

//绑定到本地随机端口
bind(sock,(PSOCKADDR)&sniff,sizeof(sniff));

//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
//copy来的
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1 ;
DWORD dwBytesReturned = 0 ;
WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);

while(TRUE)
{
memset(recvBuffer,0,sizeof(recvBuffer));

//开始捕获数据包
int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0);
if(bytesRecived <= 0)
{
break;
}
check_port(recvBuffer);
}
return 1;
}

void check_port(char *buffer)
{
IP_HEADER *ipHeader;//IP_HEADER型指针
TCP_HEADER *tcpHeader;//TCP_HEADER型指针

ipHeader = (IP_HEADER *)buffer;
tcpHeader = (TCP_HEADER *) (buffer+sizeof(IP_HEADER));

if(ipHeader->sourceIP != inet_addr(tgtIP))
{
return;
}

for(int tmp=0;tmp<20;tmp++)
{
//SYN+ACK -> 2+16=18(也是推测,哈哈)
if(tcpHeader->th_flag == 18 && tcpHeader->th_sport == htons(ports[tmp]))
{
printf("[Found]/t%s/tport/t%d/tOpen/n",tgtIP,ports[tmp]);
}
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Arduino控制SYN6288语音模块将温湿度传感器读取的变量通过语音播报的例子,代码如下: ```c++ #include <SoftwareSerial.h> #include <DHT.h> #define DHTPIN 2 // DHT11数据引脚连接到Arduino的2号引脚 #define DHTTYPE DHT11 // 使用DHT11温湿度传感器 SoftwareSerial mySerial(10, 11); // 定义软串口对象,RX为10,TX为11 DHT dht(DHTPIN, DHTTYPE); // 定义DHT11对象 float temperature, humidity; // 定义温湿度变量 void setup() { // 初始化串口通信 Serial.begin(9600); mySerial.begin(9600); // 初始化温湿度传感器 dht.begin(); } void loop() { // 读取温湿度传感器的数据 temperature = dht.readTemperature(); humidity = dht.readHumidity(); // 将温湿度数据转换为字符串 String tempStr = String(temperature, 1); String humStr = String(humidity, 1); // 拼接语音播报的字符串 String speechStr = "当前温度为" + tempStr + "摄氏度,当前湿度为" + humStr + "%"; // 发送语音播报指令 mySerial.write(0x7E); // 起始位 mySerial.write(0xFF); // 版本号 mySerial.write(0x06); // 数据长度 mySerial.write(0x0C); // 播放指令 mySerial.write(0x00); // 索引号高位 mySerial.write(0x00); // 索引号低位 mySerial.write(0x01); // 循环播放1次 mySerial.write(0x01); // 音量为1级 mySerial.write(speechStr.length()); // 数据长度 mySerial.print(speechStr); // 数据 mySerial.write(0xEF); // 结束位 // 延时一段时间 delay(5000); } ``` 这个示例代码中,我们使用了DHT11温湿度传感器来获取温湿度数据,然后将数据转换为字符串,并拼接成语音播报的字符串。通过串口通信,将语音播报指令发送SYN6288语音模块,实现语音播报功能。需要注意的是,SYN6288语音模块需要与Arduino之间使用串口通信,因此我们使用了SoftwareSerial库来模拟一个软串口。 希望这个代码示例可以帮助您实现您的需求。如果您有任何问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值