C Programming
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
User Name:
Password:
Remember me
Go Back   Dev Shed ForumsProgramming LanguagesC Programming

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Rate Thread Display Modes
 
Unread Dev Shed Forums Sponsor:
Get inside! Sample the range of functionality easily built with JMSL Library for Time Series Data Analysis, Heat Maps, Portfolio Optimization, Monte Carlo Simulation, Stock Price Charting and more. Download Now!
  #1  
Old December 7th, 2002, 03:02 AM
CyberOsc CyberOsc is offline
Contributing User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Jul 2000
Location: Indonesia
Posts: 87 CyberOsc User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 9
building a TCP SYN packet ... need help please ...

i'm working on a TCP IP project right now.
And i got a problem with my code for sending a TCP SYN packet.

The code supposed to be generate a TCP SYN packet and send it to a receiver. but the TCP SYN seems to be not valid because the receiver didn't response it, just ignore it.

So, would anybody please help me find the missing thing in my code below.

Or anybody can give me an example code of building and sending a valid TCP SYN packet please ...

thanks in advance ..


#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in_systm.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <linux/ip.h>
#include <linux/tcp.h>

#define error -1
#define srcip "10.20.10.19"
#define dstip "10.20.10.55"
#define sport 1111
#define dport 23

#include "/root/LoadBalancer/loadblc.h"

__u16 cksum(__u16 *buf, int nbytes)
{
__u32 sum;
__u16 oddbyte;

sum = 0;
while (nbytes > 1) {
sum += *buf++;
nbytes -= 2;
}

if (nbytes == 1) {
oddbyte = 0;
*((__u16 *) &oddbyte) = *(__u8 *) buf;
sum += oddbyte;
}

sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);

return (__u16) ~sum;
}


main() {
struct iphdr *iphdr;
//struct tcphdr *tcp;
struct TCPhdr *tcp;
u_char packet[sizeof(struct iphdr) + sizeof(struct TCPhdr)+ 14];
//u_char *packet;
struct sockaddr_in target;
struct in_addr saddr, daddr;
int sock, on = 1;
char *payload;

/*===[ unsnip ]==========================================
Here we open a socket. We have to provide a domain, which is AF_INET, the
type of socket this is, which is a raw socket, and the protocol, which is
a raw protocol. We also have error checking. You should always have it.
It's very useful.
*/

if ((sock = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) == error) {
printf("socket error\n");
exit(1);
}

/*===[ unsnip ]==========================================
Now we set the socket options, setsockopt. We use the option IP_HDRINCL.
This allows us to create our own ip header. If you don't have this option
on your system then you can't spoof packets .
*/

if (setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on)) == error) {
printf("setsockopt error\n");
exit(1);
}

/*===[ unsnip ]==========================================
Here we just make the ip and tcp headers equal to their structures and the
packet. Then we zero them out.
*/

iphdr = (struct iphdr *) (packet);
tcp = (struct TCPhdr *) (packet + sizeof(struct iphdr));
payload = (char *) (packet + sizeof(struct iphdr) + sizeof(struct TCPhdr));

memset((char *)iphdr,'\0',sizeof(struct iphdr));
memset((char *)tcp,'\0',sizeof(struct TCPhdr));

/*===[ unsnip ]==========================================
Now we make the saddr.s_addr equal too the srcip defined earlier in the
code. And I do the same for the destionation ip address.
*/
saddr.s_addr = inet_addr(srcip);
daddr.s_addr = inet_addr(dstip);

/*===[ unsnip ]==========================================
Finally we get to the good part, creating the packet. This is mainly self
explained. Look at 3.2 The Header Fields for explaination.
*/

iphdr->ihl = 20;
iphdr->version = 4;
iphdr->tot_len = htons(sizeof (struct iphdr));
iphdr->id = 1234;
iphdr->ttl = 250;
iphdr->frag_off |= htons((unsigned short) 0x2000);
iphdr->frag_off |= htons((0x2000) >> 3);
iphdr->protocol = 6;
iphdr->saddr = saddr.s_addr;
iphdr->daddr = daddr.s_addr;
iphdr->check = 0;

int data_size = 20;
int packet_size;
int tcp_opt_size = 0;

packet_size = TCPHDR_SIZE + tcp_opt_size + data_size;

/*tcp->dest = htons(dport);
tcp->seq = 12345; //htonl(rand());
tcp->ack_seq = 0;
tcp->res1 = 0;
tcp->doff = 5;
tcp->window = 512;
tcp->syn = 1; */

tcp->th_sport = htons(sport);
tcp->th_dport = htons(dport);
tcp->th_seq = 12345;
tcp->th_ack = 0;
tcp->th_flags = 0x2;
tcp->th_win = 512;

tcp->th_sum = cksum((u_short*) packet, PSEUDOHDR_SIZE + packet_size);

payload[0] = 0x2;
payload[1] = 0x4;
payload[2] = 0x5;
payload[3] = 0xb3;
payload[4] = 0x1;
payload[5] = 0x1;
payload[6] = 0x4;
payload[7] = 0x2;
payload[8] = 0x0;

/*===[ unsnip ]==========================================
First we zero out our target. Then we define our sin family, port, and
address.
*/
memset(&target,'\0',sizeof(target));
target.sin_family = AF_INET;
target.sin_port = htons(dport);
target.sin_addr = daddr;

/*===[ unsnip ]==========================================
Now we finally get to send the packet. So we simply use the sendto()
funtion to send it out.
*/
printf("sending packet: \n");
if (sendto(sock,&packet,sizeof(packet),0x0,(struct sockaddr *)&target,
sizeof(target)) != sizeof(packet)) {
printf("packet wasn't sent\n");
exit(1);
} else {
printf("packet sent\n");
}
exit(0);
}
__________________
** Science belongs to the world **

Reply With Quote
  #2  
Old December 9th, 2002, 12:06 AM
TechNoFear TechNoFear is offline
Offensive Member
Dev Shed Novice (500 - 999 posts)
 
Join Date: Oct 2002
Location: in the perfect world
Posts: 594 TechNoFear User rank is Sergeant (500 - 2000 Reputation Level)TechNoFear User rank is Sergeant (500 - 2000 Reputation Level)TechNoFear User rank is Sergeant (500 - 2000 Reputation Level)TechNoFear User rank is Sergeant (500 - 2000 Reputation Level)TechNoFear User rank is Sergeant (500 - 2000 Reputation Level) 
Time spent in forums: 2 Days 14 h 6 m 15 sec
Reputation Power: 21
IP spoofing is not nice and AFAIK has no 'legal' uses!

Most ISP's will have blocked you with a simple egress filter though. (only packets from valid local IP adresses can be sent outside local network)
__________________
The essence of Christianity is told us in the Garden of Eden history. The fruit that was forbidden was on the Tree of Knowledge. The subtext is, All the suffering you have is because you wanted to find out what was going on. You could be in the Garden of Eden if you had just kept your f***ing mouth shut and hadn't asked any questions.

Frank Zappa

Reply With Quote
Reply

Viewing: Dev Shed ForumsProgramming LanguagesC Programming > building a TCP SYN packet ... need help please ...


Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest News | Latest Threads | Shoutbox
Forum Jump


Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 





© 2003-2008 by Developer Shed. All rights reserved. DS Cluster 1 hosted by Hostway