为什么?为什么阻塞了????????

111222 2001-07-21 04:12:26
//下面程序我从cgi.txt里面读出漏洞列表,然后开线程扫描
//可是一扫描就阻塞了。

//在getcgi函数里面的recv处卡住
//怎么办??????




struct cgi{
char *rmt_host;
CString url;
int n;
};

UINT cgiScan()
{
char rbuff[1024];
struct cgi mycgi[10];
CString cginame[900];
CString csline;
int line=0;
CStdioFile file;
SOCKET sockfd;
SOCKADDR_IN addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
printf("无法建立Socket\r\n");
return 0;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr(rmt_host);
if(connect(sockfd,(struct sockaddr *) &addr, sizeof(addr))<0)
{
printf("目标没有开放www服务...\r\n");
fEvent.SetEvent();
return 0;
}
if(file.Open("cgi.txt", CFile::modeRead,NULL)==0)
{
printf("cgi漏洞列表文件cgi.txt被损坏!请确认");
}
while(file.ReadString(csline)!=NULL)
{

cginame[line]=csline;
line++;

}
file.Close();
memset(rbuff,0,1024);
printf("WWW服务器的Banner:");
send(sockfd,"HEAD / HTTP/1.0\n\n",sizeof("HEAD / HTTP/1.0\n\n"),0);
Sleep(1000);
recv(sockfd,rbuff,sizeof(rbuff),0);
Sleep(1000);
printf(rbuff);
closesocket(sockfd);
printf("开始CGI漏洞的扫描,由于扫描漏洞数量较多,请耐心等待...\r\n");
for(int i=0;i<(line/10);i++)
{
for(int j=0;j<10;j++)
{
mycgi[j].rmt_host=rmt_host;
mycgi[j].url=cginame[i*10+j];
mycgi[j].n=j;
Thread[j]=AfxBeginThread(getcgi,(LPVOID)&mycgi[j]);
hThread[j]=Thread[j]->m_hThread;
Sleep(1);
}
WaitForMultipleObjects(10,hThread,TRUE,120000);
}
fEvent.SetEvent();
return 0;
}



UINT getcgi(LPVOID pParam)
{
char rbuff[1024];
struct cgi* tcgi=(struct cgi *)pParam;
CString hole=tcgi->url;
CString url="GET ";
url+=hole;
url+=" HTTP/1.0\r\n";
int num=tcgi->n;
char *rmt_host=tcgi->rmt_host;
SOCKET sockfd;
SOCKADDR_IN addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr(rmt_host);
int r = connect(sockfd,(struct sockaddr *) &addr, sizeof(addr));
send(sockfd,url,url.GetLength(),0);
memset(rbuff,0,1024);
Sleep(1000);
recv(sockfd,rbuff,sizeof(rbuff),0);
Sleep(1000);
CString display="\t发现";
display+=hole;
display+="漏洞\r\n";
printf(display);
if (strstr(rbuff,"200 OK")!=NULL)
{
printf(display);
}
closesocket(sockfd);
return 0;
}
...全文
180 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hover 2002-05-29
  • 打赏
  • 举报
回复
大换分罗
111222 2001-07-23
  • 打赏
  • 举报
回复
char *GetData(int SockFD)
{
//get data without a blocking recv so we dont hang if we crash the server
char *buffer;
char data[2001];
unsigned long on=1;
unsigned long off=0;
char waste[2001];
int p, i=1;
int t;

memset(data,0,2001);
p=ioctlsocket(SockFD,FIONBIO,&on);
memset(waste,0,2001);
for(t=1;t<10;t++){
i=recv(SockFD, waste, 2000, 0);
if(i>0)
break;
Sleep(500);
}
waste[i]='\0';
strncat(data,waste,2000);
buffer = ( char * )malloc( 2000 * sizeof( char ) );
strncpy( buffer, data, 2000 );
return buffer;
}


//发送CGI请求的线程
UINT getcgi(LPVOID pParam)
{
char* rbuff;
struct cgi* tcgi=(struct cgi *)pParam;
CString hole=tcgi->url;
CString url="GET ";
url+=hole;
url+=" HTTP/1.0\r\n";
int num=tcgi->n;
char *rmt_host=tcgi->rmt_host;
CScanDlg* dlg=tcgi->mydlg;
SOCKET sockfd;
SOCKADDR_IN addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr(rmt_host);
int r = connect(sockfd,(struct sockaddr *) &addr, sizeof(addr));
send(sockfd,url,url.GetLength(),0);
rbuff = GetData(sockfd);
CString display="\t发现";
display+=hole;
display+="漏洞\r\n";
if (strstr(rbuff,"200 OK")!=NULL)
{
printf(display);
}
closesocket(sockfd);
return 0;
}





搞定了,加上GetData函数

把getcgi函数改成上面就可以了。

admireO 2001-07-22
  • 打赏
  • 举报
回复
只要line>= 10,按照你所说的,程序第一次执行for( int j = 0;j < 10,j++ )都是一样的,不论外面的循环是for(int i = 0;i < (line/10);i++ )还是for( int i = 0;i < 10;i++ )那你的line是不是>= 10呢?不过如果不大于10那又不可能执行到线程里
111222 2001-07-22
  • 打赏
  • 举报
回复
Chice_wxg:

请问,异步的socket怎么用啊?恳请指教啊!!!!!!!
Chice_wxg 2001-07-22
  • 打赏
  • 举报
回复


不要用同步的Socket,用异步方式就没问题了!

alphapaopao 2001-07-22
  • 打赏
  • 举报
回复
什么,洞啊,塞进去的,什么意思啊
111222 2001-07-22
  • 打赏
  • 举报
回复
看来我得把全部代码弄出来供大伙帮忙
admireO 2001-07-21
  • 打赏
  • 举报
回复
不会吧,按照你所说的,无论line为多少(只要line>= 10)程序第一次执行里面的循环都是一样的了,那debug的时候line是为多少呢?
gbstar2021 2001-07-21
  • 打赏
  • 举报
回复
gz
wjyasd 2001-07-21
  • 打赏
  • 举报
回复
看看!
111222 2001-07-21
  • 打赏
  • 举报
回复
line和cginame没有任何问题阿
rose1982 2001-07-21
  • 打赏
  • 举报
回复
test

line被重复初始化
111222 2001-07-21
  • 打赏
  • 举报
回复
我没写清楚?
wangfeng 2001-07-21
  • 打赏
  • 举报
回复
学习学习!
111222 2001-07-21
  • 打赏
  • 举报
回复
admireO:

只开一个线程没任何问题。

for(int i=0;i<(line/10);i++)
{
for(int j=0;j<10;j++)
{
//创建线程
}
}

改成

for(int i=0;i<10;i++)//改的这里
{
for(int j=0;j<10;j++)
{
//创建线程
}
}


也没有任何问题。


但上面那样就阻塞
admireO 2001-07-21
  • 打赏
  • 举报
回复
如果只开一个线程会不会有问题?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧