当前位置: 技术问答>linux和unix
求助改正/用c在LINUX下写的端口扫描程序有错误 /希望能在6.10前解决
来源: 互联网 发布时间:2015-06-27
本文导语: 求助改正/用c在LINUX下写的端口扫描程序有错误 求助 希望有人能帮忙指明错误 帮忙改一下 使用套接子技术在turbo linux下用c开发的简单端口扫描程序有问题 附源代码和详细说明 第一个能运行 但结果不对 ...
求助改正/用c在LINUX下写的端口扫描程序有错误
求助 希望有人能帮忙指明错误 帮忙改一下
使用套接子技术在turbo linux下用c开发的简单端口扫描程序有问题
附源代码和详细说明
第一个能运行 但结果不对
第2个运行没有反映
第3个编译也没有能通过
1 scanport_tcp.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
enum{CMD_NAME,DST_IP,START_PORT,LAST_PORT};
enum{CONNECT,NOCONNECT};
int tcpportscan(u_int dst_ip,int dst_port);
int main(int argc,char *argv[])
{
u_int dst_ip;
int dst_port;
int start;
int end;
if(argc!=4){
fprintf(stderr,"usage:%s dst_ip start_port last_portn",argv[CMD_NAME]);
exit(EXIT_FAILURE);
}
dst_ip=inet_addr(argv[DST_IP]);
start=atoi(argv[START_PORT]);
end=atoi(argv[LAST_PORT]);
for(dst_port=start;dst_ports_name);
}
}
return EXIT_SUCCESS;
}
int tcpportscan(u_int dst_ip,int port)
{
struct sockaddr_in dest;
int s;
int ret;
memset((char *)&dest,0,sizeof(dest));
dest.sin_family=AF_INET;
dest.sin_port=htons(port);
dest.sin_addr.s_addr=dst_ip;
if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))tcp.th_dport=htons(dst_port);
packet->tcp.th_off=5;
packet->tcp.th_flags=TH_SYN;
packet->tcp.th_win=htons(8192);
packet->tcp.th_urp=0;
packet->ip.ip_ttl=0;
packet->ip.ip_p=IPPROTO_TCP;
packet->ip.ip_src.s_addr=src_ip;
packet->ip.ip_dst.s_addr=dst_ip;
packet->ip.ip_sum=htons(sizeof(packet->tcp)+datalen);
#define PSEUDO_HEADER_LEN 12
packet->tcp.th_sum=0;
packet->tcp.th_sum=checksum((u_short *)(&(packet->ip.ip_ttl)),
PSEUDO_HEADER_LEN+sizeof(packet->tcp)+datalen);
}
void make_ip_header(struct ip *ip,int src_ip,int dst_ip,int iplen)
{ip->ip_v=IPVERSION;
ip->ip_hl=sizeof(struct ip)>>2;
ip->ip_id=0;
#ifdef_Linux
ip->ip->len=htons(iplen);
ip->ip->off=htons(0);
#else
ip->ip->len=iplen;
ip->ip->off=IP_DF;
#endif_Linux
ip->ip_ip_ttl=2;
ip->ip_p=IPPROTO_TCP;
ip->ip_src.s_addr=src_ip;
ip->ip_dst.s_addr=dst_ip;
ip->ip_sum=0;
ip->ip_sum=checksum((u_short *)ip,sizeof(struct ip));
}
u_short checksum(u_short *data,int len)
{
u_long sum=0;
for(;len>1;len-=2{
sum+=*data++;
if(sum&0x80000000)
sum=(sum&0xffff)+(sum>>16);
}
if(len==1){
u_short i=0;
*(u_char *)(&i)=*(u_char *)data;
sum+=i;
}
while(sum>>16)
sum=(sum&0xffff)+(sum>>16);
return(sum==0xffff)?sum:~sum;
}
求助 希望有人能帮忙指明错误 帮忙改一下
使用套接子技术在turbo linux下用c开发的简单端口扫描程序有问题
附源代码和详细说明
第一个能运行 但结果不对
第2个运行没有反映
第3个编译也没有能通过
1 scanport_tcp.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
enum{CMD_NAME,DST_IP,START_PORT,LAST_PORT};
enum{CONNECT,NOCONNECT};
int tcpportscan(u_int dst_ip,int dst_port);
int main(int argc,char *argv[])
{
u_int dst_ip;
int dst_port;
int start;
int end;
if(argc!=4){
fprintf(stderr,"usage:%s dst_ip start_port last_portn",argv[CMD_NAME]);
exit(EXIT_FAILURE);
}
dst_ip=inet_addr(argv[DST_IP]);
start=atoi(argv[START_PORT]);
end=atoi(argv[LAST_PORT]);
for(dst_port=start;dst_ports_name);
}
}
return EXIT_SUCCESS;
}
int tcpportscan(u_int dst_ip,int port)
{
struct sockaddr_in dest;
int s;
int ret;
memset((char *)&dest,0,sizeof(dest));
dest.sin_family=AF_INET;
dest.sin_port=htons(port);
dest.sin_addr.s_addr=dst_ip;
if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))tcp.th_dport=htons(dst_port);
packet->tcp.th_off=5;
packet->tcp.th_flags=TH_SYN;
packet->tcp.th_win=htons(8192);
packet->tcp.th_urp=0;
packet->ip.ip_ttl=0;
packet->ip.ip_p=IPPROTO_TCP;
packet->ip.ip_src.s_addr=src_ip;
packet->ip.ip_dst.s_addr=dst_ip;
packet->ip.ip_sum=htons(sizeof(packet->tcp)+datalen);
#define PSEUDO_HEADER_LEN 12
packet->tcp.th_sum=0;
packet->tcp.th_sum=checksum((u_short *)(&(packet->ip.ip_ttl)),
PSEUDO_HEADER_LEN+sizeof(packet->tcp)+datalen);
}
void make_ip_header(struct ip *ip,int src_ip,int dst_ip,int iplen)
{ip->ip_v=IPVERSION;
ip->ip_hl=sizeof(struct ip)>>2;
ip->ip_id=0;
#ifdef_Linux
ip->ip->len=htons(iplen);
ip->ip->off=htons(0);
#else
ip->ip->len=iplen;
ip->ip->off=IP_DF;
#endif_Linux
ip->ip_ip_ttl=2;
ip->ip_p=IPPROTO_TCP;
ip->ip_src.s_addr=src_ip;
ip->ip_dst.s_addr=dst_ip;
ip->ip_sum=0;
ip->ip_sum=checksum((u_short *)ip,sizeof(struct ip));
}
u_short checksum(u_short *data,int len)
{
u_long sum=0;
for(;len>1;len-=2{
sum+=*data++;
if(sum&0x80000000)
sum=(sum&0xffff)+(sum>>16);
}
if(len==1){
u_short i=0;
*(u_char *)(&i)=*(u_char *)data;
sum+=i;
}
while(sum>>16)
sum=(sum&0xffff)+(sum>>16);
return(sum==0xffff)?sum:~sum;
}
|
这种东西,这么长,谁有耐心给你解决?
你自己装一个嗅探器,然后sniff一下你程序生成的包,就可以找出原因在哪里了.
另外, 要注意程序的返回值
你自己装一个嗅探器,然后sniff一下你程序生成的包,就可以找出原因在哪里了.
另外, 要注意程序的返回值