谁能给个win 下的例子:见内,up 有分
谁能给个win 下的例子:见内,up 有分
楼主pitchstar(一站)2002-01-04 17:48:29 在 VC/MFC / 基础类 提问 win 下 原始套接字发送 tcp syn 包的例子,我没写成,想参考一下。。。
多谢各位的支持。 问题点数:200、回复次数:36Top
1 楼jianhenk(星橙)回复于 2002-01-04 17:49:52 得分 4
up up我要分哈,
我不会Top
2 楼liujiangsh(飞鹰)回复于 2002-01-04 18:04:23 得分 4
up,up,我也不会Top
3 楼szk(szk)回复于 2002-01-04 18:05:15 得分 20
checksum函数就算了,首先定义几个结构
要发送的缓冲区(因为是自定义包,当然tcp包和ip包要自己写了!)
struct packet
{
struct _iphdr ip;
struct _tcphdr tcp;
}packet;
//伪头,计算tcp的checksum用
struct pseudo_header
{ /* For TCP header checksum */
unsigned int source_address;
unsigned int dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
struct _tcphdr tcp;
}pseudo_header;
typedef struct _tcphdr
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度+6位保留字中的4位
unsigned char th_flag; //2位保留字+6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
typedef struct _iphdr
{
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;
然后先构造IP包,再构造tcp包,然后将这个包发出去。记得每次在发送前,先随机更改自己的ip,port,Sequence Number和ID号就行了,还有更新完这些之后要重新计算tcp包的checksum哟,对了,每次发送前最好sleep一下,免得被别人发现太快有诈,被kick掉哟!
good luck!Top
4 楼hujun614(Softworm)回复于 2002-01-04 18:11:16 得分 4
szk(szk):说的好。Top
5 楼key123abc(简简单单)回复于 2002-01-04 18:33:42 得分 4
up
up
upTop
6 楼szk(szk)回复于 2002-01-07 11:28:18 得分 0
给分。。。。Top
7 楼pitchstar(一站)回复于 2002-01-07 13:48:15 得分 0
szk:
哥们,你就给个数据结构就要分?数据结构书上就有,程序我也写过,只是没成又不知道错在哪,才来求源程序对照一下的。。。
有没有编译通过的源程序?Top
8 楼netboys(笨小孩)回复于 2002-01-07 14:16:57 得分 100
我有现成的例子,如果你需要,请留下你的EMAIL,我发给你Top
9 楼pitchstar(一站)回复于 2002-01-07 14:17:40 得分 0
netboys:
我的地址:topper@163.net
多谢~!Top
10 楼pitchstar(一站)回复于 2002-01-07 14:20:03 得分 0
是 tcp 的(最好是 tcp syn 包,不是syn 也可以,这个我可以自己改)。Top
11 楼pitchstar(一站)回复于 2002-01-07 15:05:23 得分 0
u & pTop
12 楼bskay() bskay() bskay()回复于 2002-01-07 15:12:32 得分 4
CSocket的类Top
13 楼zhuang094(hz-huang)回复于 2002-01-07 15:32:52 得分 4
看看Top
14 楼lating(蜡台)回复于 2002-01-07 15:35:13 得分 4
upup
Top
15 楼zl_2001(给自己一个机会)回复于 2002-01-07 15:38:49 得分 4
关注
Top
16 楼lhuchong()回复于 2002-01-07 16:06:39 得分 4
给我一份lhuchong@263.netTop
17 楼szk(szk)回复于 2002-01-07 16:32:25 得分 0
说漏了一句,要注意加上如下语句:
int foo = 1;
setsockopt(socket,0,IP_HDRINCL,(char *)&foo,sizeof(int));
以便允许重构报头Top
18 楼netboys(笨小孩)回复于 2002-01-07 16:55:42 得分 0
我自己写的是一个ping的原程序,写的很糟,难读,我还是给一个别人原程序吧
#pragma pack(1)
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define OICQ_MAX_PACKET 1024
#define OICQ_MAX_MSG 512
#define OICQ_MSG_LEN 45
#define SRC_IP "127.0.0.1"
#define SRC_PORT 5277
#define DST_PORT 4000
typedef struct ip_hdr
{
unsigned char ip_verlen;
unsigned char ip_tos;
unsigned short ip_totallength;
unsigned short ip_id;
unsigned short ip_offset;
unsigned char ip_ttl;
unsigned char ip_protocol;
unsigned short ip_checksum;
unsigned int ip_srcaddr;
unsigned int ip_destaddr;
} IP_HDR;
typedef struct udp_hdr
{
unsigned short src_portno;
unsigned short dst_portno;
unsigned short udp_length;
unsigned short udp_checksum;
} UDP_HDR;
char strMessage = {
0x02,0x01,0x07,0x00,0x78,0x00,0x00,0x31,0x30,0x30,0x30,0x31,0x1f,0x30,0x1f,
0x30,0x30,0x1f,0x32,0x30,0x30,0x30,0x2d,0x30,0x31,0x2d,0x30,0x31,0x1f,0x30,
0x30,0x3a,0x30,0x30,0x3a,0x30,0x30,0x1f,0x68,0x65,0x6c,0x6c,0x6f,0x21,0x03
};
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);
}
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET s;
BOOL bOpt;
struct sockaddr_in remote;
IP_HDR ipHdr;
UDP_HDR udpHdr;
int ret;
DWORD i;
unsigned short iTotalSize,
iUdpSize,
iUdpChecksumSize,
iIPVersion,
iIPSize,
cksum = 0;
char buf,
*ptr = NULL;
printf("Spoof OICQ Msg Sender - by Janker@371.net\n\n");
if(argc!=2) {
printf("usage: OICQSEND Destination_IP_Address");
ExitProcess(1);
}
srand((unsigned)time(NULL));
strMessage=rand();
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup() failed: %d\n", GetLastError());
return -1;
}
s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_UDP, NULL, 0,0);
if (s == INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n", WSAGetLastError());
return -1;
}
bOpt = TRUE;
ret = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));
if (ret == SOCKET_ERROR)
{
printf("setsockopt(IP_HDRINCL) failed: %d\n", WSAGetLastError());
return -1;
}
iTotalSize = sizeof(ipHdr) + sizeof(udpHdr) + OICQ_MSG_LEN;
iIPVersion = 4;
iIPSize = sizeof(ipHdr) / sizeof(unsigned long);
ipHdr.ip_verlen = (iIPVersion << 4) ¦ iIPSize;
ipHdr.ip_tos = 0;
ipHdr.ip_totallength = htons(iTotalSize);
ipHdr.ip_id = 0;
ipHdr.ip_offset = 0;
ipHdr.ip_ttl = 128;
ipHdr.ip_protocol = 0x11;
ipHdr.ip_checksum = 0 ;
ipHdr.ip_srcaddr = inet_addr(SRC_IP);
ipHdr.ip_destaddr = inet_addr(argv);
iUdpSize = sizeof(udpHdr) + OICQ_MSG_LEN;
udpHdr.src_portno = htons(SRC_PORT) ;
udpHdr.dst_portno = htons(DST_PORT) ;
udpHdr.udp_length = htons(iUdpSize) ;
udpHdr.udp_checksum = 0 ;
iUdpChecksumSize = 0;
ptr = buf;
ZeroMemory(buf, OICQ_MAX_PACKET);
memcpy(ptr, &ipHdr.ip_srcaddr, sizeof(ipHdr.ip_srcaddr));
ptr += sizeof(ipHdr.ip_srcaddr);
iUdpChecksumSize += sizeof(ipHdr.ip_srcaddr);
memcpy(ptr, &ipHdr.ip_destaddr, sizeof(ipHdr.ip_destaddr));
ptr += sizeof(ipHdr.ip_destaddr);
iUdpChecksumSize += sizeof(ipHdr.ip_destaddr);
ptr++;
iUdpChecksumSize += 1;
memcpy(ptr, &ipHdr.ip_protocol, sizeof(ipHdr.ip_protocol));
ptr += sizeof(ipHdr.ip_protocol);
iUdpChecksumSize += sizeof(ipHdr.ip_protocol);
memcpy(ptr, &udpHdr.udp_length, sizeof(udpHdr.udp_length));
ptr += sizeof(udpHdr.udp_length);
iUdpChecksumSize += sizeof(udpHdr.udp_length);
memcpy(ptr, &udpHdr, sizeof(udpHdr));
ptr += sizeof(udpHdr);
iUdpChecksumSize += sizeof(udpHdr);
for(i = 0; i <OICQ_MSG_LEN; i++, ptr++)
*ptr = strMessage;
iUdpChecksumSize += OICQ_MSG_LEN;
cksum = checksum((USHORT *)buf, iUdpChecksumSize);
udpHdr.udp_checksum = cksum;
ZeroMemory(buf, OICQ_MAX_PACKET);
ptr = buf;
memcpy(ptr, &ipHdr, sizeof(ipHdr)); ptr += sizeof(ipHdr);
memcpy(ptr, &udpHdr, sizeof(udpHdr)); ptr += sizeof(udpHdr);
memcpy(ptr, strMessage, OICQ_MSG_LEN);
remote.sin_family = AF_INET;
remote.sin_port = htons(DST_PORT);
remote.sin_addr.s_addr = inet_addr(argv);
ret = sendto(s, buf, iTotalSize, 0, (SOCKADDR *)&remote, sizeof(remote));
if (ret == SOCKET_ERROR)
printf("sendto() failed: %d\n", WSAGetLastError());
else
printf("Send O.K.!");
closesocket(s) ;
WSACleanup() ;
return 0;
}
Top
19 楼pitchstar(一站)回复于 2002-01-08 10:19:29 得分 0
netboys 和 szk ,我试一下你们的办法,两位有空帮我看一下:
http://www.csdn.net/expert/topic/421/421451.shtm
问题之源Top
20 楼pitchstar(一站)回复于 2002-01-08 15:00:23 得分 0
netboys :
你的例子跟我的代码犯报一个错,我可是一点没改。。。Top
21 楼pitchstar(一站)回复于 2002-01-09 09:35:19 得分 0
等。。。代码Top
22 楼gold_jin()回复于 2002-01-09 11:23:45 得分 4
诸位:贴一个可以正确执行的ping的程序吧,我最近正在找这方面的东西Top
23 楼Bird1945(没有钱,我拿什么来爱你?)回复于 2002-01-09 11:33:40 得分 4
学习学习!Top
24 楼howard(舍.得.)回复于 2002-01-09 11:44:36 得分 4
http://www.csdn.net/expert/topic/464/464120.shtm
帮帮我吧(网吧管理软件)
各位,还有别的要注意的安全方面的问题吗?Top
25 楼alpasino(地狱天使)回复于 2002-01-09 11:48:49 得分 4
*_*Top
26 楼pitchstar(一站)回复于 2002-01-10 08:43:06 得分 0
继续等,为什么好好的程序在我的机器上不执行Top
27 楼mjs2000(宁静致远)回复于 2002-01-10 09:03:32 得分 4
提示什么错误吗Top
28 楼lyneville(心佛)回复于 2002-01-10 09:31:49 得分 4
黑糊糊后Top
29 楼pitchstar(一站)回复于 2002-01-10 16:52:49 得分 0
mjs2000:
我自己写的,和上边的弟兄给提供的,我从网上还真找到一个 syn 的例子,程序都可以运行,
但 sendto 都返回 -1,WSAGetLastError()的值是 10049,msdn 解释为“The remote address is not a valid address”
调试没办法跟进sendto ,盲人摸象的改几个地方都没起作用,你有什么高见?
Top
30 楼zjhsoft(★ ★)回复于 2002-01-10 17:08:22 得分 2
upup
Top
31 楼pitchstar(一站)回复于 2002-02-04 09:36:51 得分 0
多谢各位,散分Top
32 楼thd111(小蛐蛐)回复于 2002-02-04 10:13:08 得分 2
UP 一下,^_^Top
33 楼xiaoxiaohan(萧晓寒)回复于 2002-02-04 10:22:04 得分 2
VC光盘下\SAMPLES\VC98\MFC\INTERNET目录下有很多例子。Top
34 楼dct1999(宇宙天空)回复于 2002-02-04 10:49:06 得分 2
hehe , upTop
35 楼Kevin_qing()回复于 2002-02-04 10:56:29 得分 12
老兄,那个你是在98下面运行的吧? Top
36 楼pitchstar(一站)回复于 2002-02-05 16:34:36 得分 0
kevin_qing ,是在 2000 advance 下编译、运行的,我的机器有两个 ip ,一个内部网,一个外部网,不知道跟这有没有关系。
昨天想散分,结果出错了,没散成,今天再散,各位如果有什么意见请继续发,我一直在看,我先给其他早先回答的弟兄们散分。以后再回的帖子将另开主题散分。Top
-
相关文章
请教微软技术支持中心工程师,如何在Excel中指定某些单元格(只读,可写)权限?
楼主jgcg(蒋sir)2002-01-04 17:48:29 在 其他开发语言 / Offic…请问如何在网页中向我的ATL传参数?
楼主szk(szk)2002-01-04 17:54:34 在 VC/MFC / 非技术类 提问我有一个atl,它需要从网页中读取参数,如…
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
