SYN扫描源代码

合集下载

SYN端口扫描

SYN端口扫描
}IP_HEADER;
typedef struct _tcphdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
{
IP_HEADER *iphdr;
TCP_HEADER *tcphdr;
unsigned short iphdrlen;
iphdr = (IP_HEADER *)recvbuf;
iphdrlen = sizeof(unsigned long) * (iphdr->h_lenver & 0xf);
/*
经典描器(全TCP连接)和SYN(半连接)扫描器
全TCP连接
全TCP连接是长期以来TCP端口扫描的基础。
扫描主机尝试(使用三次握手)与目的机指定端口建立建立正规的连接。
连接由系统调用connect()开始。对于每一个监听端口,connect()会获得成功,
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
否则,返回的是RST/ACK。
这种方法比第一种更具隐蔽性,可能不会在目标系统中留下扫描痕迹。
3. TCP FIN scan:这种方法向目标端口发送一个FIN分组。

tscancode用法

tscancode用法

tscancode用法TSCancode 是一个开源的静态代码分析工具,用于扫描和识别源代码中的安全漏洞和错误。

它可以帮助开发人员和安全工程师发现和修复潜在的安全问题,以提高代码质量和应用程序的安全性。

使用 TSCancode 的第一步是安装和配置工具。

它可以以Docker 或本地安装的方式运行。

在安装完成后,可以通过命令行调用 TSCancode,并指定待扫描的代码路径。

例如,可以运行以下命令:```tscancode -s /path/to/source-code```这会启动 TSCancode,并对指定路径下的源代码进行扫描分析。

TSCancode 使用的是 Python 编程语言和底层的 Pylint 库来进行代码静态分析。

Pylint 是一个广泛使用的静态代码分析工具,它可以检查代码规范、错误、潜在的问题和代码复杂度等。

TSCancode 在 Pylint 的基础上进行了进一步的扩展和定制,以适应特定的安全需求。

TSCancode 的扫描结果会以报告的方式呈现。

报告中包含了漏洞和错误的详细信息,包括风险等级、代码位置和建议的修复措施。

在分析报告时,可以根据风险等级的高低来优先处理相关问题。

常见的 TSCancode 扫描参数和选项包括:1. `-s` 或 `--source`:指定待扫描的源代码路径。

2. `-x` 或 `--exclude`:指定要排除的文件或目录,以避免对无关代码的扫描。

3. `-r` 或 `--rules`:指定要使用的规则集,以定制扫描的内容和级别。

4. `-f` 或 `--format`:指定输出报告的格式,包括 HTML、JSON、CSV 等。

5. `-o` 或 `--output`:指定保存报告的文件路径和名称。

除了基本的扫描功能外,TSCancode 还提供了与其他工具集成的能力。

例如,可以将扫描结果导出为 JSON 格式的数据,然后通过其他工具进行后续分析和处理。

代码扫描报告

代码扫描报告

代码扫描报告
一、扫描目的
代码扫描是一种自动审查源代码中的安全漏洞和软件缺陷的技术。

本次扫描的目的是识别出本应用程序中的潜在漏洞,以便及
时修补。

二、扫描范围
本次扫描针对本应用程序中的所有源代码实现了全面的扫描,
并设定了相应的扫描策略来确保对所有关键代码进行检查。

三、扫描结果
本次扫描发现以下漏洞:
1. SQL注入漏洞:该漏洞存在于代码中用户输入数据的处理中,攻击者可利用该漏洞通过SQL注入攻击来获取敏感信息。

建议在
代码中使用参数化查询来解决该问题。

2. 跨站脚本攻击(XSS)漏洞:该漏洞存在于代码中的用户输
入验证和数据处理中。

攻击者可通过该漏洞将脚本代码注入到网
站中,并在用户访问时执行恶意代码。

建议在代码中加入输入验
证和转义过滤来减少该漏洞的风险。

3. 文件上传漏洞:该漏洞存在于代码中对用户上传文件的验证
处理中。

攻击者可通过该漏洞上传包含恶意代码的文件来破坏系统,建议在代码中加入二进制检查和文件类型检查来修补该漏洞。

四、修补建议
根据上述扫描结果,我们建议您尽快修补相关漏洞,并加入相
应的安全措施来加强应用程序的安全性。

我们也推荐您定期进行
代码扫描并加固安全措施,以确保应用程序的安全性。

五、扫描总结
本次代码扫描发现了若干安全漏洞,我们已经向您提供了相应
的修补建议。

我们希望您能够及时处理漏洞,以保护该应用程序
的安全。

我们也希望您能够定期进行代码扫描,以确保应用程序的持续安全。

源代码扫描系统原厂技术支持服务总结报告

源代码扫描系统原厂技术支持服务总结报告

源代码扫描系统原厂技术支持服务项目总结报告1.项目技术说明源代码漏洞扫描是我校新系统上线安全管控环节的第二步骤,也是非常重要的步骤,属于“白盒检测”,在此环节可大量减少第三步骤安全检测(属于“黑盒检测”)环节出现的漏洞数量,甚至可发现在安全检测环节无法发现的代码问题。

因此一直以来都是安全工作重要和有效的组成部分。

源代码漏洞扫描系统如不能及时更新升级,将会出现不能及时获得更新更多的功能,如对新出现的编程语言编写的源代码的检测等。

日常工作中,我单位技术人员经常会遇到一些关于源代码检测结果争议和系统本身故障问题需要咨询和处理。

因此采购维保服务对于源代码漏洞扫描工作是非常重要和必要的。

为保证网络与计算中心已有的源代码漏洞扫描系统已购买的5年维保服务到期后还能得到持续性的更新升级、技术问题咨询以及故障定位修复等技术支持服务,而继续向系统开发公司采购1年技术支持服务,从而能及时修复故障、升级规则库及功能,并在遇到一些关于源代码检测结果争议和系统本身故障问题可进行咨询和处理的服务。

2.项目完成情况本项目经过前期调研、招标,经学校公开招标,于年月确定中标单位并开始实施工作,年月进行了初步验收。

项目施工单位提供了次更新维护服务,目前源代码系统已为最新版本。

项目建设主要成效:1. 源代码扫描系统已升级为最新版本,从而可提供更全面及准确的源代码安全检测结果,为我校信息系统上线安全提供有效保证。

2. 通过日常技术答疑,解决因源代码检测结果引起的争议,提高了我单位工作人员的工作效率。

3.修复我单位工作人员提出的系统无法检测出某一类sql注入漏洞的功能问题,提高了源代码扫描系统的漏洞检出率,从而进一步为我校信息系统上线安全提供保证。

现总结如下:1、项目建设完成了合同约定的内容,服务内容及时长符合合同约定,技术指标满足合同要求。

2、验收资料齐全。

项目负责人签字:。

源代码扫描报告

源代码扫描报告

源代码扫描报告1. 引言源代码扫描是一种常用的安全审计方法,用于发现和修复软件系统中的潜在漏洞和安全隐患。

本报告为某个软件系统进行源代码扫描后的结果总结和分析。

2. 扫描工具为了进行源代码扫描,我们采用了一款专业的静态代码分析工具 - XScan。

该工具具有强大的静态代码扫描功能,可以全面分析源代码中的安全漏洞和代码质量问题。

3. 扫描过程我们使用XScan工具对软件系统的源代码进行了全面的扫描。

扫描过程中,XScan会对代码进行静态分析,并根据预设的规则和策略进行检查。

扫描过程非常耗时,但可以有效地发现代码中的安全问题。

4. 扫描结果根据源代码扫描的结果,我们发现以下几类安全漏洞和问题:4.1 SQL注入漏洞通过对源代码的分析,我们发现系统存在SQL注入漏洞的风险。

这类漏洞通常由于未正确过滤用户输入造成,攻击者可以利用这类漏洞执行恶意的SQL查询,从而获取敏感数据或者篡改数据。

4.2 跨站脚本漏洞(XSS)源代码中也存在一些潜在的跨站脚本漏洞。

这些漏洞通常由于未对用户输入进行充分的验证和过滤引起,攻击者可以通过注入恶意脚本来窃取用户的敏感信息或者破坏网站的正常功能。

4.3 暴露敏感信息在源代码中,我们还发现了一些明文存储用户密码和其他敏感信息的问题。

这类问题可能导致用户数据泄露,增加了系统的安全风险。

4.4 访问控制问题通过对源代码的分析,我们发现系统在访问控制方面存在一些问题。

部分功能没有进行足够的权限验证,攻击者可能通过绕过访问控制机制来获取或者篡改数据。

4.5 代码质量问题除了安全漏洞外,源代码中还存在一些代码质量问题。

例如,重复代码、冗余代码、缺乏注释等。

这些问题可能导致代码的可读性和可维护性下降,增加了开发和维护的困难。

5. 建议和修复方案针对源代码扫描结果中发现的安全漏洞和问题,我们提出了以下的建议和修复方案:5.1 SQL注入漏洞修复方案•对用户输入进行严格的验证和过滤,确保输入的数据符合预期。

语法分析器源代码

语法分析器源代码

语法分析程序的源代码#include<stdio.h>#include<string.h>char prog[80],token[6];char ch;int syn,p,m,n,sum,kk=0;char * rwtab[6]={"begin","if","then","while","do","end"};main(){p=0;printf("\nplease intput string:");do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();getch();}/*词法扫描程序:*/scaner(){for(n=0;n<8;n++)token[n]=NULL;m=0;ch=prog[p++];while(ch==' ')ch=prog[p++];if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')){while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0')) {token[m++]=ch;ch=prog[p++];}token[m++]='\0';ch=prog[--p];syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif((ch<='9'&&ch>='0')){sum=0;while((ch<='9'&&ch>='0')){sum=sum*10+ch-'0';ch=prog[p++];}ch=prog[--p];syn=11;}elseswitch(ch){case '<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}elseif(ch=='='){syn=22;token[m++]=ch;}else{syn=20;ch=prog[--p];}break;case '>':token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=23;ch=prog[--p];}break;case ':':token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;ch=prog[--p];}break;case '+':syn=13;token[0]=ch;break;case '-':syn=14;token[0]=ch;break;case '*':syn=15;token[0]=ch;break;case '/':syn=16;token[0]=ch;break;case ':=':syn=18;token[0]=ch;break;case '<>':syn=21;token[0]=ch;break;case '<=':syn=22;token[0]=ch;break;case '>=':syn=24;token[0]=ch;break;case '=':syn=25;token[0]=ch;break;case ';':syn=26;token[0]=ch;break;case '(':syn=27;token[0]=ch;break;case ')':syn=28;token[0]=ch;break;case '#':syn=0;token[0]=ch;break;default:syn=-1;}}lrparser(){if(syn==1){scaner();if(syn==6){scaner();if((syn==0)&&(kk==0))printf("sucess");}else{if(kk!=1) printf("lost end error!");kk=1;}}else{printf("output of begin is error!");kk=1;}return;}yucu(){statement();while(syn==26){scaner();statement();}return;}statement(){if(syn==10){scaner();if(syn==18){scaner();expression();}{printf("output of equal is error!");kk=1;}}else{printf("input of sentence is error!");kk=1;}return;}expression(){term();while(syn==13||syn==14){scaner();term();}return;}term(){factor();while(syn==15||syn==16){scaner();factor();}return;}factor(){if(syn==10||syn==11)scaner();elseif(syn==27){scaner();expression();if(syn==28)scaner();else{printf("output ')' is error!");kk=1;}}else{printf("output expression is error!");kk=1;}return;}。

syn flood攻击源代码

syn flood攻击源代码
__try{
//设置发送超时
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if(ErrorCode==SOCKET_ERROR){
fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
__leave;
}
memset(&DestAddr,0,sizeof(DestAddr));
DestAddr.sin_family=AF_INET;
DestAddr.sin_addr.s_addr=inet_addr(SYN_DEST_IP);
FakeIpNet=inet_addr(FAKE_IP);
//发送TCP报文
ErrorCode=sendto(SockRaw,
SendBuf,
datasize,
0,
(struct sockaddr*) &DestAddr,
sizeof(DestAddr));
if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());
typedef struct _iphdr //定义IP首部
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)

SYN扫描源代码

SYN扫描源代码

下面是一个网络编程的实例, Syn扫描器代码,可以作为参考.基本可以看为是ping命令的实现//getallIP.cpp#include <winsock2.h>#include <stdio.h>#pragma comment(lib,"ws2_32.lib")int main(){////////////////// 初始化Windows sockets API.//WORD wVersionRequested = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(wVersionRequested, &wsaData)) {printf("WSAStartup failed %s\n", WSAGetLastError());return 0;}//////////////////// 获得主机名.//char hostname[256];int res = gethostname(hostname, sizeof(hostname));if (res != 0) {printf("Error: %u\n", WSAGetLastError());return 0;}printf("hostname=%s\n", hostname);////////////////// 根据主机名获取主机信息.//hostent* pHostent = gethostbyname(hostname);if (pHostent==NULL) {printf("Error: %u\n", WSAGetLastError());return 0;}//////////////////// 解析返回的hostent信息.//hostent& he = *pHostent;printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n", he.h_name, he.h_aliases, he.h_addrtype, he.h_length);sockaddr_in sa;//根据he.h_addr_list[nAdapter]是否为空来获取所有IP地址for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);// 输出机器的IP地址.printf("Address [%d%]: %s\n",nAdapter, inet_ntoa(sa.sin_addr)); // 显示地址串}//////////////////// 终止Windows sockets API//WSACleanup();return 0;}//mstcpip.h//头文件// Copyright (C) Microsoft Corporation, 1996-1999#if _MSC_VER > 1000#pragma once#endif/* Argument structure for SIO_KEEPALIVE_VALS */struct tcp_keepalive {u_long onoff;u_long keepalivetime;u_long keepaliveinterval;};// New WSAIoctl Options#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)#define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)#define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)#define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)#define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)#define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7) #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)#define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)#define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10) #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)//主程序//synscan.cpp#include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <time.h>#include "mstcpip.h"#pragma comment(lib,"ws2_32.lib")#define SEQ 0x28376839SOCKET sockRaw = INVALID_SOCKET,sockListen = INVALID_SOCKET;struct sockaddr_in dest;BOOL ScanOK=FALSE;char *DEST_HOST;int DEST_PORT;int DEST_PORTEND;int play=0;clock_t start,end;//程序运行的起始和结束时间float costtime;//程序耗时typedef struct _iphdr{unsigned char h_lenver; //4位首部长度+4位IP版本号unsigned char tos; //8位服务类型TOSunsigned short total_len; //16位总长度(字节)unsigned short ident; //16位标识unsigned short frag_and_flags; //3位标志位unsigned char ttl; //8位生存时间TTLunsigned char proto; //8位协议(TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;typedef struct _tcphdr //定义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;struct //定义TCP伪首部{unsigned long saddr; //源地址unsigned long daddr; //目的地址char mbz;char ptcl; //协议类型unsigned short tcpl; //TCP长度}psd_header;//SOCK错误处理程序void CheckSockError(int iErrorCode, char *pErrorMsg) {if(iErrorCode==SOCKET_ERROR){printf("%s Error:%d\n", pErrorMsg, GetLastError()); closesocket(sockRaw);ExitProcess(-1);}}//计算检验和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);}//IP解包程序bool DecodeIPHeader(char *buf, int bytes){IP_HEADER *iphdr;TCP_HEADER *tcphdr;unsigned short iphdrlen;iphdr = (IP_HEADER *)buf;iphdrlen = sizeof(unsigned long) * (iphdr->h_lenver & 0xf);tcphdr = (TCP_HEADER*)(buf + iphdrlen);//是否来自目标IPif(iphdr->sourceIP != dest.sin_addr.s_addr)return false;//序列号是否正确if((ntohl(tcphdr->th_ack) != (SEQ+1)) && (ntohl(tcphdr->th_ack) != SEQ)) return false;//if(tcphdr->th_flag == 20)return true;//SYN/ACK - 扫描到一个端口if(tcphdr ->th_flag == 18){printf("\t%d\t open \n",ntohs(tcphdr->th_sport));return true;}return true;}void usage(void){printf("\t===================SYN portscaner======================\n");printf("\t============ 2004/7/6===========\n");printf("\tusage: synscan DomainName[IP] StartPort-EndPort\n");printf("\tExample: synscan 1-139\n");printf("\tExample: synscan 192.168.1.1 8000-9000\n");}DWORD WINAPI RecvThread(LPVOID para)//接收数据线程函数{int iErrorCode;struct hostent *hp;char RecvBuf[65535]={0};sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockListen, "socket");//设置IP头操作选项BOOL bOpt = true;iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));CheckSockError(iErrorCode, "setsockopt()");//获得本地IPSOCKADDR_IN sa;unsigned char LocalName[256];iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);CheckSockError(iErrorCode, "gethostname()");if((hp = gethostbyname((char*)LocalName)) == NULL){CheckSockError(SOCKET_ERROR, "gethostbyname()");}memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);sa.sin_family = AF_INET;sa.sin_port = htons(7000);iErrorCode = bind(sockListen, (PSOCKADDR)&sa, sizeof(sa));CheckSockError(iErrorCode, "bind");//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包DWORD dwBufferLen[10] ;DWORD dwBufferInLen = 1 ;DWORD dwBytesReturned = 0 ;iErrorCode=WSAIoctl(sockListen, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL ); CheckSockError(iErrorCode, "Ioctl");memset(RecvBuf, 0, sizeof(RecvBuf));//接收数据for(;;){iErrorCode = recv(sockListen, RecvBuf, sizeof(RecvBuf), 0);//CheckSockError(iErrorCode, "recv");DecodeIPHeader(RecvBuf,iErrorCode) ;}if(ScanOK){closesocket(sockListen);return 0;}}void playx(void) // 定义状态提示函数{// 进度条char *plays[12]={" | "," / "," - "," \\ "," | "," / "," - "," \\ "," | "," / "," - "," \\ ",};printf(" =%s=\r", plays[play]);play=(play==11)?0:play+1;Sleep(2);}//主函数int main(int argc,char **argv){char *p;if(argc!=3){usage();return 0;}p=argv[2];//处理端口参数if(strstr(argv[2],"-")){ DEST_PORT=atoi(argv[2]);for(;*p;)if(*(p++)=='-')break;DEST_PORTEND=atoi(p);if(DEST_PORT<1 || DEST_PORTEND>65535){ printf("Port Error!\n");return 0;}}DEST_HOST=argv[1];usage();int iErrorCode;int datasize;struct hostent *hp;IP_HEADER ip_header;TCP_HEADER tcp_header;char SendBuf[128]={0};//初始化SOCKETWSADATA wsaData;iErrorCode = WSAStartup(MAKEWORD(2,2),&wsaData);CheckSockError(iErrorCode, "WSAStartup()");sockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockRaw, "socket()");sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockListen, "socket");//设置IP头操作选项BOOL bOpt = true;iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));CheckSockError(iErrorCode, "setsockopt()");//获得本地IPSOCKADDR_IN sa;unsigned char LocalName[256];iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);CheckSockError(iErrorCode, "gethostname()");if((hp = gethostbyname((char*)LocalName)) == NULL){CheckSockError(SOCKET_ERROR, "gethostbyname()");}memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);sa.sin_family = AF_INET;sa.sin_port = htons(7000);iErrorCode = bind(sockListen, (PSOCKADDR)&sa, sizeof(sa));CheckSockError(iErrorCode, "bind");//获得目标主机IPmemset(&dest,0,sizeof(dest));dest.sin_family = AF_INET;dest.sin_port = htons(DEST_PORT);if((dest.sin_addr.s_addr = inet_addr(DEST_HOST)) == INADDR_NONE){if((hp = gethostbyname(DEST_HOST)) != NULL){memcpy(&(dest.sin_addr),hp->h_addr_list[1],hp->h_length);dest.sin_family = hp->h_addrtype;printf("dest.sin_addr = %s\n",inet_ntoa(dest.sin_addr));}else{CheckSockError(SOCKET_ERROR, "gethostbyname()");}}//开启监听线程HANDLE Thread=CreateThread(NULL,0,RecvThread,0,0,0);//填充IP首部ip_header.h_lenver=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));//高四位IP版本号,低四位首部长度ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)ip_header.ident=1; //16位标识ip_header.frag_and_flags=0; //3位标志位ip_header.ttl=128; //8位生存时间TTLip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)ip_header.checksum=0; //16位IP首部校验和ip_header.sourceIP=sa.sin_addr.s_addr; //32位源IP地址ip_header.destIP=dest.sin_addr.s_addr; //32位目的IP地址//填充TCP首部tcp_header.th_sport=htons(7000); //源端口号tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位tcp_header.th_win=htons(16384);//填充TCP伪首部(用于计算校验和,并不真正发送)psd_header.saddr=ip_header.sourceIP;psd_header.daddr=ip_header.destIP;psd_header.mbz=0;psd_header.ptcl=IPPROTO_TCP;psd_header.tcpl=htons(sizeof(tcp_header));Sleep(500);printf("\n");printf("Scaning %s\n",DEST_HOST);start=clock();//开始计时for(;DEST_PORT<DEST_PORTEND;DEST_PORT++){playx();tcp_header.th_dport=htons(DEST_PORT); //目的端口号tcp_header.th_ack=0; //ACK序列号置为0tcp_header.th_flag=2; //SYN 标志tcp_header.th_seq=htonl(SEQ); //SYN序列号tcp_header.th_urp=0; //偏移tcp_header.th_sum=0; //校验和//计算TCP校验和,计算校验和时需要包括TCP pseudo header memcpy(SendBuf,&psd_header,sizeof(psd_header));memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header)); tcp_header.th_sum=checksum((USHORT*)SendBuf,sizeof(psd_header)+sizeof(tcp_header));//计算IP校验和memcpy(SendBuf,&ip_header,sizeof(ip_header));memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header)); memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);datasize=sizeof(ip_header)+sizeof(tcp_header);ip_header.checksum=checksum((USHORT *)SendBuf,datasize);//填充发送缓冲区memcpy(SendBuf,&ip_header,sizeof(ip_header));//发送TCP报文iErrorCode=sendto(sockRaw,SendBuf,datasize,0,(struct sockaddr*) &dest, sizeof(dest));CheckSockError(iErrorCode, "sendto()");}end=clock();//计时结束ScanOK=TRUE;printf("Closeing Thread.....\n");WaitForSingleObject(Thread,5000);CloseHandle(Thread);costtime= (float)(end - start) / CLOCKS_PER_SEC; //转换时间格式printf("Cost time:%f Sec",costtime);//显示耗时//退出前清理if(sockRaw != INVALID_SOCKET) closesocket(sockRaw);WSACleanup();re turn 0;}。

四款优秀的源代码扫描工具简介

四款优秀的源代码扫描工具简介

一、DMSCA-企业级静态源代码扫描分析服务平台端玛企业级静态源代码扫描分析服务平台(英文简称:DMSCA)是一个独特的源代码安全漏洞、质量缺陷和逻辑缺陷扫描分析服务平台。

该平台可用于识别、跟踪和修复在源代码中的技术和逻辑上的缺陷,让软件开发团队及测试团队快速、准确定位源代码中的安全漏洞、质量和业务逻辑缺陷等问题,并依据提供的专业中肯的修复建议,快速修复。

提高软件产品的可靠性、安全性。

同时兼容并达到国际、国内相关行业的合规要求。

DMSCA是端玛科技在多年静态分析技术的积累及研发努力的基础上,联合多所国内及国际知名大学、专家共同分析全球静态分析技术的优缺点后、结合当前开发语言的技术现状、源代码缺陷的发展势态和市场后,研发出的新一代源代码企业级分析方案旨在从根源上识别、跟踪和修复源代码技术和逻辑上的缺陷。

该方案克服了传统静态分析工具误报率(False Positive)高和漏报(False Negative)的缺陷。

打断了国外产品在高端静态分析产品方面的垄断,形成中国自主可控的高端源代码安全和质量扫描产品,并支持中国自己的源代码检测方面的国家标准(GB/T34944-2017 Java、GB/T34943-2017 C/C++、GB/T34946-2017 C#),致力于为在中国的企业提供更直接,更个性化的平台定制和本地化服务。

DMSCA支持主流编程语言安全漏洞及质量缺陷扫描和分析,支持客户化平台界面、报告、规则自定义,以满足客户特定安全策略、安全标准和研发运营环境集成的需要。

产品从面世,就获得了中国国内众多客户的青睐,这些客户包括但不限于银行、在线支付、保险、电力、能源、电信、汽车、媒体娱乐、软件、服务和军事等行业的财富1000企业。

1、系统架构2、系统组件3、产品界面4、集成SDLC五、主要功能及特性操作系统独立。

代码扫描不依赖于特定操作系统,只需在在企业范围内部署一台扫描服务器,就可以扫描其它操作系统开发环境下的代码。

端口扫描原理

端口扫描原理

端口扫描原理绝大多数应用程序运行在TCP或者UDP协议之上,这些协议是众多应用程序使用的传输机制,端口扫描是通过扫描主机确定哪一些TCP和UDP端口可以访问的过程。

端口扫描常见的几种类型:TCP Connect()扫描SYN扫描NULL扫描ACK扫描Xmas-TreeDumb扫描下面是TCP数据包的6个标志位:URG:紧急数据包ACK:确认(应答数据包)PSH:将数据强制压入缓冲区RST:连接复位(断开连接)SYN:连接请求FIN:TCP连接结束TCP建立连接的三次握手的过程:1. SYN---->A:请求方 2. <---SYN/ACK B:服务方3.ACK----->下面介绍常见的扫描类型1.TCP Connect ()扫描TCP Connect ()扫描试图与每个TCP端口进行三次握手通信,但是也最容易被防火墙或者入侵检测系统测到。

尽量使用其他的扫描类型。

1 SYN----> 1 SYN----><---SYN/ACK 2 <---RST 23 ACK----->端口开放端口关闭2.SYN扫描比TCP Connect ()扫描隐蔽一些,SYN扫描仅发送初始的SYN数据包给目标主机。

1 SYN----> 1 SYN----><---SYN/ACK 2 <---RST 2端口开放端口关闭3.NULL扫描(反向扫描)NULL扫描将一个没有标志位的数据包发送给TCP端口,根据RFC 793的要求1 NULL----> 1 NULL----><---RST 2端口开放端口关闭Windows主机不遵从RFC 793,Unix遵从RFC 793比前两种更隐蔽。

4.FIN扫描(反向扫描)在FIN扫描中,一个FIN的数据包被发送给目标主机的每个端口。

根据RFC 793的要求1 NULL----> 1 NULL----><---RST 2端口开放端口关闭5. ACK 扫描ACK 扫描通常用来穿过防火墙的规则集,有助于确定一个防火墙的功能比较完善或者仅是一个简单的包过滤程序,ACK扫描使用响应包来发现防火墙的配置信息。

gitee scan工具用法

gitee scan工具用法

gitee scan工具用法一、Gitee Scan简介Gitee Scan是一款基于Gitee平台的代码扫描工具,旨在帮助开发者检测项目中的安全风险和质量问题。

通过自动化扫描,Gitee Scan可以识别出项目中的潜在漏洞、代码规范问题、依赖库风险等,从而帮助开发者提前防范和解决问题。

二、Gitee Scan的安装与配置1.访问Gitee官网,注册并登录账号。

2.在个人中心页面,点击“项目”进入项目管理界面。

3.选择需要扫描的项目,点击“设置”按钮。

4.在设置页面,找到“代码扫描”选项,开启代码扫描功能。

5.按照提示安装对应的扫描插件,如SonarQube、FindBugs等。

6.配置扫描插件的相关参数,如扫描范围、扫描深度等。

三、Gitee Scan的主要功能与操作方法1.代码质量检测:Gitee Scan支持对Java、Python、JavaScript等主流编程语言的代码质量进行检测,识别代码中的潜在问题。

2.安全风险检测:Gitee Scan可以检测项目中的安全漏洞,如SQL注入、跨站脚本攻击等。

3.依赖库风险检测:Gitee Scan可以分析项目依赖库的安全性和稳定性,提前发现潜在的风险。

4.代码规范检测:Gitee Scan支持自定义代码规范,帮助开发者遵循统一的编码规范。

5.操作方法:在项目管理界面,点击“执行扫描”按钮即可启动代码扫描。

扫描完成后,查看报告页面,根据报告中的问题进行修复。

四、Gitee Scan的实用场景与应用案例1.场景:团队协作项目中,使用Gitee Scan可以确保团队成员遵循统一的代码规范,提高代码质量。

2.场景:在开源项目中发现潜在的安全风险和质量问题,提前防范和解决。

3.案例:某公司使用Gitee Scan对员工代码进行定期扫描,发现并修复了大量潜在的安全问题和质量隐患。

五、Gitee Scan的优缺点分析优点:1.基于Gitee平台,方便开发者管理和监控项目。

tcp syn扫描的实现原理

tcp syn扫描的实现原理

TCP SYN扫描的实现原理TCP SYN扫描是一种常用的网络扫描技术,用于识别目标主机上的开放端口。

在进行TCP SYN扫描时,扫描器向目标主机发送TCP连接请求中的SYN标志位,并根据目标主机的响应来判断端口的状态。

1. TCP连接建立过程在了解TCP SYN扫描的实现原理之前,我们需要首先了解TCP连接建立的过程。

TCP连接建立需要进行三次握手,即以下步骤:1.主机A发送一个TCP包,其中SYN标志位被设置为1,表示请求建立连接。

2.主机B收到后,向主机A发送一个TCP包,其中SYN和ACK标志位都被设置为1,表示确认连接请求,并发送自己的SYN序列号。

3.主机A收到后,向主机B发送一个TCP包,其中ACK标志位被设置为1,表示连接建立成功。

通过三次握手,TCP连接建立成功,双方可以开始进行数据传输。

2. TCP SYN扫描的工作原理TCP SYN扫描利用了TCP连接建立过程中的一些特性,来判断目标主机上的端口状态,即端口是否开放。

1.扫描器向目标主机的某个端口发送一个TCP包,其中SYN标志位被设置为1,表示请求建立连接。

2.如果目标端口处于关闭状态,那么目标主机将会发送一个RST(复位)包作为响应,表示连接被重置,从而扫描器获得了目标端口的信息。

3.如果目标端口处于开放状态,那么目标主机将会发送一个TCP包,其中SYN和ACK标志位都被设置为1,表示确认连接请求,并发送自己的SYN序列号。

4.扫描器收到目标主机的响应后,将发送RST包给目标主机,以关闭已经建立的连接。

根据目标主机响应的情况,扫描器可以判断目标端口的状态: - 如果目标主机返回RST包,则表示该端口处于关闭状态。

- 如果目标主机返回SYN/ACK包,则表示该端口处于开放状态。

3. 实现原理TCP SYN扫描的实现原理可以从以下几个方面进行详细说明:3.1 构造TCP包扫描器需要向目标主机发送构造的TCP包,其中SYN标志位被设置为1,以请求建立连接。

端口扫描器的几种代码实现方案

端口扫描器的几种代码实现方案

端⼝扫描器的⼏种代码实现⽅案 搞安全的应该都知道端⼝扫描在渗透测试、漏洞扫描过程中的重要性,其与URL爬⾍等技术构成了漏洞扫描的第⼀阶段,即⽬标信息收集。

因此能否开发出⼀款⾼效稳定的端⼝扫描器,往往决定了漏洞扫描器的好坏。

那么说到端⼝扫描器,我们往往会先想到nmap、masscan等神器,它们是这个领域的标杆。

但本篇并不是为了介绍这⼏款⼯具,⽽是谈谈如何⾃研⼀款⾼效稳定的端⼝扫描器。

端⼝扫描器,顾名思义就是为了探测服务器上的某个端⼝是否开放,究其原理可以分为很多种探测⽅式,⽐如tcp三次握⼿扫描,syn扫描等等,本篇并不打算详细介绍这些扫描⽅式的区别,有兴趣的可以看下nmap的⽂档,对这⼏种扫描⽅式有详细的介绍。

那么说下本⽂重点,基于这⼏天我研究并尝试利⽤python、go开发tcp扫描器、tcp-syn扫描器,以及对⽐它们之间的速度性能、稳定性差异情况,将测试结果在此做个记录,并分享⼀下代码以及⽅案。

说明:⽂章结尾将给出本篇所使⽤代码的Github地址,可供⼤家测试,代码测试环境为centos7。

scan for Python Socket Python的Socket模块可以创建套接字,创建tcp三次握⼿连接,以此探测⽬标端⼝是否存活。

本篇将使⽤socket模块编写tcp扫描以及syn 扫描,并对⽐两者的差异。

tcp scan 快来看代码:1#! -*- coding:utf-8 -*-2import time3import socket4 socket_timeout = 0.15def tcp_scan(ip,port):6try:7 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)8 s.settimeout(socket_timeout)9 c=s.connect_ex((ip,port))10if c==0:11print “%s:%s is open” % (ip,port)12else :13# print “%s:%s is not open” % (ip,port)14pass15except Exception,e:16print e17 s.close()18if__name__== “__main__” :19 s_time = time.time()20 ip = “14.215.177.38”21for port in range(0,1024):22 ” ‘ 此处可⽤协作 ‘ ”23 tcp_scan(ip,port)24 e_time = time.time()25print “scan time is “ ,e_time-s_time 运⾏结果: 说明⼀下:可以看到此代码扫描1024个端⼝⽤了102s,当然代码并没有⽤多线程、协程等⽅式提⾼扫描效率(使⽤协程测试过扫65535个端⼝⽤时400s左右),因为python在这⽅⾯的能⼒⽐较弱;由于扫描过程中会建⽴tcp三次握⼿,因此⽐较消耗资源。

代码扫描的常见问题和修复方法

代码扫描的常见问题和修复方法

代码扫描的常见问题和修复方法代码扫描是一项重要的安全实践,可以帮助发现代码中的常见问题和潜在漏洞。

下面列举了一些常见问题和相应的修复方法:1. XSS(跨站脚本攻击):在用户输入中未正确过滤或编码特殊字符,导致恶意脚本被执行。

修复方法是对用户输入进行正确的过滤、编码或转义。

2. SQL 注入:将用户输入的数据作为SQL 查询的一部分,导致恶意SQL 代码被执行。

修复方法是使用参数化查询或预编译语句,避免将用户输入直接拼接到SQL 查询中。

3. 敏感数据泄露:在代码中意外地输出了敏感数据,如密码、密钥等。

修复方法是确保敏感数据只在必要的情况下被处理和存储,并避免将其输出到日志或错误消息中。

4. 访问控制问题:未对敏感操作或资源进行适当的访问控制验证,导致未经授权的用户可以执行或访问这些操作或资源。

修复方法是在代码中实施正确的访问控制机制,如身份验证、授权等。

5. 代码注入:未正确验证或过滤用户输入,导致恶意代码被注入到代码中执行。

修复方法是对用户输入进行正确的验证、过滤或编码。

6. 执行不安全的代码:在代码中执行不安全的系统命令或外部代码,可能导致远程代码执行等问题。

修复方法是避免直接执行用户输入的命令或外部代码,使用安全的替代方法。

7. 敏感信息在内存中的存储问题:敏感数据如密码、密钥等在内存中存储时可能存在泄露的风险。

修复方法是使用安全的加密算法和安全的存储方式存储敏感数据,并在使用后及时清除。

8. 未验证的重定向和跳转:未正确验证重定向或跳转的目标地址,导致恶意用户可以将用户重定向到恶意网站。

修复方法是验证目标地址的合法性,并只接受预期的目标地址。

9. 未正确处理异常:代码中未正确处理异常情况,导致安全问题或可预料的错误信息泄露。

修复方法是正确处理异常,不泄露敏感信息,同时保证代码的健壮性。

以上是一些常见的代码扫描问题和修复方法,但并不穷尽所有情况。

安全是一个不断演化的领域,开发人员应该时刻关注安全最佳实践,并跟随漏洞、攻击和修复的动态变化。

tscancode用法

tscancode用法

tscan code用法1.什么是t s c a n c od e?t s ca nc od e是一个开源的静态代码分析工具,用于检测软件开发过程中潜在的问题和错误。

通过扫描源代码文件,ts ca nc od e可以快速识别出代码中的潜在漏洞、安全风险、代码规范问题等。

2.t s c a n c o d e的安装和使用安装t s c a n c o d e使用以下命令可以在L in ux系统中安装t sc an co de:安装依赖软件包s u do ap t-ge ti ns tal l py th on3-pi ps u do ap t-ge ti ns tal l cl an g安装tscancodep i p3in st al lt sc anc o de使用t s c a n c o d e在安装完ts ca nc ode后,我们可以通过以下命令来扫描代码文件:t s ca nc od e<代码根目录>例如,要扫描名为"p r oj ec t"的代码项目,可以运行以下命令:t s ca nc od ep ro je ct3.t s c a n c o d e使用示例以下是一个针对P yth o n代码的示例,展示了ts ca nc od e的一些功能和用法:3.1扫描代码文件我们可以使用以下命令来扫描一个Py th on代码项目:t s ca nc od ep ro j e ct这将对项目中的所有P yt ho n代码文件进行扫描,并生成相应的扫描报告。

3.2忽略代码规范问题有时候我们可能并不想将代码规范问题列入扫描结果中,可以使用以下命令来忽略代码规范问题:t s ca nc od e--e xc lud e=C OD E_ST YL Ep roj e ct这将在扫描报告中排除代码规范问题。

3.3根据扫描结果过滤代码文件如果我们只关注某些特定类型的问题,可以使用以下命令来过滤扫描结果:t s ca nc od e--f il ter=SE CU RI TY--fi lte r=P ER FO RM AN CE pro j ec t这将只在扫描结果中显示安全问题和性能问题。

simple-scan源码编译方法

simple-scan源码编译方法

编译simple-scan源码的方法1. 简介simple-scan 是一个简单易用的扫描仪应用程序,它可以帮助用户轻松地扫描文档和图片。

如果你对这个应用程序感兴趣,可能会想要了解一下如何编译它的源代码。

本文将介绍编译 simple-scan 源码的具体方法,希望能帮助到有需要的读者。

2. 硬件和软件要求在开始编译 simple-scan 源码之前,你需要确保你的计算机满足以下硬件和软件要求:- 一台安装了 Ubuntu 操作系统的计算机- 一个可用的 C 语言编译器,比如 GCC- GTK+ 库的开发文件- gnomemon 软件包- intltool 软件包3. 下载 simple-scan 源码你需要下载 simple-scan 的源代码。

你可以在其冠方全球信息站或者代码托管评台上找到源代码的下载信息。

下载完成后,解压缩源码包,并进入解压后的目录。

4. 配置源码在终端中进入解压后的simple-scan 目录,运行以下命令来配置源码:```bash./configure```如果一切顺利,你将看到一系列的配置信息输出在终端上。

如果出现错误信息,你需要根据错误信息来安装缺少的开发文件或软件包,并重新运行 `./configure` 命令。

5. 编译源码一旦配置成功,你就可以开始编译 simple-scan 源码了。

在终端中运行以下命令:```bashmake```这将会启动编译过程,将源代码编译成可执行文件。

在编译完成后,你就可以在 simple-scan 目录下找到编译好的可执行文件。

6. 安装 simple-scan最后一步是安装 simple-scan。

在终端中运行以下命令:```bashsudo make install```输入你的密码后,simple-scan 将会被安装到系统中。

一旦安装完成,你就可以在应用菜单中找到 simple-scan,并且运行它了。

总结编译simple-scan 源码并不是一件困难的事情,只要遵循以上的步骤,你就可以成功地编译并安装 simple-scan 到你的系统中。

nmap源代码分析

nmap源代码分析

以下代码是对nmap_main()函数基本的分析。

其中以///开头是新添加的注释。

而以类似于///<Start------创建主机组状态,进入主循环--------Start>的形式出现的注释用于标注一个比较大的功能代码段。

int nmap_main(int argc, char *argv[]) {int i;vector<Target *> Targets;time_t now;struct hostent *target = NULL;time_t timep;char mytime[128];addrset exclude_group;#ifndef NOLUA/* Only NSE scripts can add targets */NewTargets *new_targets = NULL;///NewTargets为Singleton模式,产生单个实例/* Pre-Scan and Post-Scan script results datastructure */ScriptResults *script_scan_results = NULL;#endifchar **host_exp_group;int num_host_exp_groups;HostGroupState *hstate = NULL;unsigned int ideal_scan_group_sz = 0;Target *currenths;char *host_spec = NULL;char myname[MAXHOSTNAMELEN + 1];int sourceaddrwarning = 0; /* Have we warned them yet about unguessable source addresses? */unsigned int targetno;char hostname[MAXHOSTNAMELEN + 1] = "";struct sockaddr_storage ss;size_t sslen;char **fakeargv = NULL;now = time(NULL);local_time = localtime(&now);///设置错误log输出函数if(o.debugging)nbase_set_log(fatal,error);elsenbase_set_log(fatal,NULL);if (argc < 2 ) printusage(-1);/* argv faking silliness */fakeargv = (char **) safe_malloc(sizeof(char *) * (argc + 1));for(i=0; i < argc; i++) {fakeargv[i] = strdup(argv[i]);}fakeargv[argc] = NULL;Targets.reserve(100);#ifdef WIN32win_pre_init();#endif///调用parse_options进行命令参数的解析parse_options(argc, fakeargv);///在Linux下设置终端为只读非阻塞方式,在Windows平台为空函数。

nmap的syn扫描参数

nmap的syn扫描参数

nmap的syn扫描参数
nmap是一个强大的网络扫描工具,它支持多种扫描技术,其中之一是SYN 扫描。

SYN扫描是一种TCP三次握手的第一步,通过发送SYN数据包尝试与目标主机建立连接。

在nmap中使用SYN扫描的参数是-sS或--scan SYN。

这个参数告诉nmap 使用SYN扫描方式。

以下是一个简单的示例命令,演示如何使用nmap进行SYN扫描:
nmap -sS <目标IP地址>
其中<目标IP地址>是你要扫描的目标主机的IP地址或域名。

需要注意的是,SYN扫描需要在具有足够权限的系统上运行,因为这可能会被视为攻击行为。

确保在使用之前了解相关的法律和道德规定,并确保你有合法的权限进行扫描。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下面是一个网络编程的实例, Syn扫描器代码,可以作为参考.基本可以看为是ping命令的实现//getallIP.cpp#include <winsock2.h>#include <stdio.h>#pragma comment(lib,"ws2_32.lib")int main(){////////////////// 初始化Windows sockets API.//WORD wVersionRequested = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(wVersionRequested, &wsaData)) {printf("WSAStartup failed %s\n", WSAGetLastError());return 0;}//////////////////// 获得主机名.//char hostname[256];int res = gethostname(hostname, sizeof(hostname));if (res != 0) {printf("Error: %u\n", WSAGetLastError());return 0;}printf("hostname=%s\n", hostname);////////////////// 根据主机名获取主机信息.//hostent* pHostent = gethostbyname(hostname);if (pHostent==NULL) {printf("Error: %u\n", WSAGetLastError());return 0;}//////////////////// 解析返回的hostent信息.//hostent& he = *pHostent;printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n", he.h_name, he.h_aliases, he.h_addrtype, he.h_length);sockaddr_in sa;//根据he.h_addr_list[nAdapter]是否为空来获取所有IP地址for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);// 输出机器的IP地址.printf("Address [%d%]: %s\n",nAdapter, inet_ntoa(sa.sin_addr)); // 显示地址串}//////////////////// 终止Windows sockets API//WSACleanup();return 0;}//mstcpip.h//头文件// Copyright (C) Microsoft Corporation, 1996-1999#if _MSC_VER > 1000#pragma once#endif/* Argument structure for SIO_KEEPALIVE_VALS */struct tcp_keepalive {u_long onoff;u_long keepalivetime;u_long keepaliveinterval;};// New WSAIoctl Options#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)#define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)#define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)#define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)#define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)#define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7) #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)#define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9) #define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10) #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)//主程序//synscan.cpp#include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <time.h>#include "mstcpip.h"#pragma comment(lib,"ws2_32.lib")#define SEQ 0x28376839SOCKET sockRaw = INVALID_SOCKET,sockListen = INVALID_SOCKET;struct sockaddr_in dest;BOOL ScanOK=FALSE;char *DEST_HOST;int DEST_PORT;int DEST_PORTEND;int play=0;clock_t start,end;//程序运行的起始和结束时间float costtime;//程序耗时typedef struct _iphdr{unsigned char h_lenver; //4位首部长度+4位IP版本号unsigned char tos; //8位服务类型TOSunsigned short total_len; //16位总长度(字节)unsigned short ident; //16位标识unsigned short frag_and_flags; //3位标志位unsigned char ttl; //8位生存时间TTLunsigned char proto; //8位协议(TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;typedef struct _tcphdr //定义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;struct //定义TCP伪首部{unsigned long saddr; //源地址unsigned long daddr; //目的地址char mbz;char ptcl; //协议类型unsigned short tcpl; //TCP长度}psd_header;//SOCK错误处理程序void CheckSockError(int iErrorCode, char *pErrorMsg) {if(iErrorCode==SOCKET_ERROR){printf("%s Error:%d\n", pErrorMsg, GetLastError()); closesocket(sockRaw);ExitProcess(-1);}}//计算检验和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);}//IP解包程序bool DecodeIPHeader(char *buf, int bytes){IP_HEADER *iphdr;TCP_HEADER *tcphdr;unsigned short iphdrlen;iphdr = (IP_HEADER *)buf;iphdrlen = sizeof(unsigned long) * (iphdr->h_lenver & 0xf);tcphdr = (TCP_HEADER*)(buf + iphdrlen);//是否来自目标IPif(iphdr->sourceIP != dest.sin_addr.s_addr)return false;//序列号是否正确if((ntohl(tcphdr->th_ack) != (SEQ+1)) && (ntohl(tcphdr->th_ack) != SEQ)) return false;//if(tcphdr->th_flag == 20)return true;//SYN/ACK - 扫描到一个端口if(tcphdr ->th_flag == 18){printf("\t%d\t open \n",ntohs(tcphdr->th_sport));return true;}return true;}void usage(void){printf("\t===================SYN portscaner======================\n");printf("\t============gxisone@ 2004/7/6===========\n");printf("\tusage: synscan DomainName[IP] StartPort-EndPort\n");printf("\tExample: synscan 1-139\n");printf("\tExample: synscan 192.168.1.1 8000-9000\n");}DWORD WINAPI RecvThread(LPVOID para)//接收数据线程函数{int iErrorCode;struct hostent *hp;char RecvBuf[65535]={0};sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockListen, "socket");//设置IP头操作选项BOOL bOpt = true;iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));CheckSockError(iErrorCode, "setsockopt()");//获得本地IPSOCKADDR_IN sa;unsigned char LocalName[256];iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);CheckSockError(iErrorCode, "gethostname()");if((hp = gethostbyname((char*)LocalName)) == NULL){CheckSockError(SOCKET_ERROR, "gethostbyname()");}memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);sa.sin_family = AF_INET;sa.sin_port = htons(7000);iErrorCode = bind(sockListen, (PSOCKADDR)&sa, sizeof(sa));CheckSockError(iErrorCode, "bind");//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包DWORD dwBufferLen[10] ;DWORD dwBufferInLen = 1 ;DWORD dwBytesReturned = 0 ;iErrorCode=WSAIoctl(sockListen, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL ); CheckSockError(iErrorCode, "Ioctl");memset(RecvBuf, 0, sizeof(RecvBuf));//接收数据for(;;){iErrorCode = recv(sockListen, RecvBuf, sizeof(RecvBuf), 0);//CheckSockError(iErrorCode, "recv");DecodeIPHeader(RecvBuf,iErrorCode) ;}if(ScanOK){closesocket(sockListen);return 0;}}void playx(void) // 定义状态提示函数{// 进度条char *plays[12]={" | "," / "," - "," \\ "," | "," / "," - "," \\ "," | "," / "," - "," \\ ",};printf(" =%s=\r", plays[play]);play=(play==11)?0:play+1;Sleep(2);}//主函数int main(int argc,char **argv){char *p;if(argc!=3){usage();return 0;}p=argv[2];//处理端口参数if(strstr(argv[2],"-")){ DEST_PORT=atoi(argv[2]);for(;*p;)if(*(p++)=='-')break;DEST_PORTEND=atoi(p);if(DEST_PORT<1 || DEST_PORTEND>65535){ printf("Port Error!\n");return 0;}}DEST_HOST=argv[1];usage();int iErrorCode;int datasize;struct hostent *hp;IP_HEADER ip_header;TCP_HEADER tcp_header;char SendBuf[128]={0};//初始化SOCKETWSADATA wsaData;iErrorCode = WSAStartup(MAKEWORD(2,2),&wsaData);CheckSockError(iErrorCode, "WSAStartup()");sockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockRaw, "socket()");sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockListen, "socket");//设置IP头操作选项BOOL bOpt = true;iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));CheckSockError(iErrorCode, "setsockopt()");//获得本地IPSOCKADDR_IN sa;unsigned char LocalName[256];iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);CheckSockError(iErrorCode, "gethostname()");if((hp = gethostbyname((char*)LocalName)) == NULL){CheckSockError(SOCKET_ERROR, "gethostbyname()");}memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);sa.sin_family = AF_INET;sa.sin_port = htons(7000);iErrorCode = bind(sockListen, (PSOCKADDR)&sa, sizeof(sa));CheckSockError(iErrorCode, "bind");//获得目标主机IPmemset(&dest,0,sizeof(dest));dest.sin_family = AF_INET;dest.sin_port = htons(DEST_PORT);if((dest.sin_addr.s_addr = inet_addr(DEST_HOST)) == INADDR_NONE){if((hp = gethostbyname(DEST_HOST)) != NULL){memcpy(&(dest.sin_addr),hp->h_addr_list[1],hp->h_length);dest.sin_family = hp->h_addrtype;printf("dest.sin_addr = %s\n",inet_ntoa(dest.sin_addr));}else{CheckSockError(SOCKET_ERROR, "gethostbyname()");}}//开启监听线程HANDLE Thread=CreateThread(NULL,0,RecvThread,0,0,0);//填充IP首部ip_header.h_lenver=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));//高四位IP版本号,低四位首部长度ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)ip_header.ident=1; //16位标识ip_header.frag_and_flags=0; //3位标志位ip_header.ttl=128; //8位生存时间TTLip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)ip_header.checksum=0; //16位IP首部校验和ip_header.sourceIP=sa.sin_addr.s_addr; //32位源IP地址ip_header.destIP=dest.sin_addr.s_addr; //32位目的IP地址//填充TCP首部tcp_header.th_sport=htons(7000); //源端口号tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位tcp_header.th_win=htons(16384);//填充TCP伪首部(用于计算校验和,并不真正发送)psd_header.saddr=ip_header.sourceIP;psd_header.daddr=ip_header.destIP;psd_header.mbz=0;psd_header.ptcl=IPPROTO_TCP;psd_header.tcpl=htons(sizeof(tcp_header));Sleep(500);printf("\n");printf("Scaning %s\n",DEST_HOST);start=clock();//开始计时for(;DEST_PORT<DEST_PORTEND;DEST_PORT++){playx();tcp_header.th_dport=htons(DEST_PORT); //目的端口号tcp_header.th_ack=0; //ACK序列号置为0tcp_header.th_flag=2; //SYN 标志tcp_header.th_seq=htonl(SEQ); //SYN序列号tcp_header.th_urp=0; //偏移tcp_header.th_sum=0; //校验和//计算TCP校验和,计算校验和时需要包括TCP pseudo header memcpy(SendBuf,&psd_header,sizeof(psd_header));memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header)); tcp_header.th_sum=checksum((USHORT*)SendBuf,sizeof(psd_header)+sizeof(tcp_header));//计算IP校验和memcpy(SendBuf,&ip_header,sizeof(ip_header));memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header)); memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);datasize=sizeof(ip_header)+sizeof(tcp_header);ip_header.checksum=checksum((USHORT *)SendBuf,datasize);//填充发送缓冲区memcpy(SendBuf,&ip_header,sizeof(ip_header));//发送TCP报文iErrorCode=sendto(sockRaw,SendBuf,datasize,0,(struct sockaddr*) &dest, sizeof(dest));CheckSockError(iErrorCode, "sendto()");}end=clock();//计时结束ScanOK=TRUE;printf("Closeing Thread.....\n");WaitForSingleObject(Thread,5000);CloseHandle(Thread);costtime= (float)(end - start) / CLOCKS_PER_SEC; //转换时间格式printf("Cost time:%f Sec",costtime);//显示耗时//退出前清理if(sockRaw != INVALID_SOCKET) closesocket(sockRaw);WSACleanup();re turn 0;}。

相关文档
最新文档