发新话题
打印

[原创]A Simple Muiltiple Thread Banner Scanner

[原创]A Simple Muiltiple Thread Banner Scanner

  文章作者:netxfly [E.S.T]
信息来源:邪恶八进制安全小组(www.eviloctal.com

一个简单的通过Banne判断远程主机是否为Winsows系统,其实大家还可以扩充其他的功能.
大家可以随意修改代码,我没意见的.呵呵!
复制内容到剪贴板
代码:
#include "stdio.h"
#include "string.h"
#include "winsock2.h"
#include "windows.h"

#pragma comment(lib,"ws2_32.lib")
#define PORT 80

//Function Proctotype Declaration
//--------------------------------------------
DWORD WINAPI Banner(LPVOID);
void Usage(char*);
void Scan(char*,char*);
//--------------------------------------------
//End Function Proctotype Declaration

//Mian Funtion
int main(int argc,char *argv[])
{
   if(argc!=3)
   {
      Usage(argv[0]);
   }   
   else
   {
      Scan(argv[1],argv[2]);
   }
   return 0;   
}   
//End main Function

//Scan() Function Defination
//--------------------------------------------
void Scan(char *start,char *end)
{
   unsigned long StartAddr;
   unsigned long EndAddr;
   unsigned long i;
   DWORD      dwThreadid;
   HANDLE      h;
   int        NumThread   =0;
   int        TotalNum;
   
   StartAddr=ntohl(inet_addr(start));
   EndAddr=ntohl(inet_addr(end));
   TotalNum=EndAddr-StartAddr;
   
   printf("Start Scanning...\nPlease Wait...\n");
   for(i=StartAddr;i<=EndAddr;i++)
   {
      h=CreateThread(NULL,0,Banner,(LPVOID)i,0,&dwThreadid);
      if(h=NULL)
      {
        printf("Create Thread Failure...\n");
        CloseHandle(h);
      }
      Sleep(4000);  
   }  CloseHandle(h);
   printf("%[%s-%s] All Scaning Compeled! \n",start,end);
   return ;  
}   
//--------------------------------------------
//End Scan() Function Defination

//Banner() Function Defination
//---------------------------------------------
DWORD WINAPI Banner(LPVOID lp)
{
   WSADATA     wsa;
   SOCKET      netxfly;
   struct      sockaddr_in remote;
   int        ret;
   char       Sbuffer[]="GET /http/1.1\r\n";
   char       *Banner="Server:";
   char       Buffer[1024];
   unsigned long target;
   char       *p;
   
   ret=WSAStartup(MAKEWORD(2,2),&wsa);
   if(ret)
   {
      printf("Load Socket Dll Failure...\n");
      exit(0);
   }
     
   netxfly=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   if(netxfly==INVALID_SOCKET)
   {
      printf("Create Socket Failure...\n");
      WSACleanup();
      exit(0);
   }   
   
   target=(unsigned long)lp;
   remote.sin_family=AF_INET;
   remote.sin_port=htons(PORT);
   remote.sin_addr.s_addr=htonl(target);
   
   ret=connect(netxfly,(const struct sockaddr*)&remote,sizeof(remote));
   if(ret==SOCKET_ERROR)
   {
      printf("Connect to Target[%s] Failuer...\n",inet_ntoa(remote.sin_addr));
      closesocket(netxfly);
      WSACleanup();
      return 0;
   }   
   
   
   send(netxfly,Sbuffer,strlen(Sbuffer),0);
   
   memset(Buffer,0,sizeof(Buffer));
   
   recv(netxfly,Buffer,1024,0);
   
   p=strstr(Buffer,Banner);
   
   if(p==NULL)
   {
      printf("[%s] Is not Windows OS\n",inet_ntoa(remote.sin_addr));
   }
   else
   {
      printf("[%s] Is  Windows OS\n",inet_ntoa(remote.sin_addr));
   }  
   
   closesocket(netxfly);
   WSACleanup();
   return 0;
}   
//---------------------------------------------
//End Banner() Function Defination

void Usage(char *help)
{
   printf("===============================================\n");
   printf("Written by Netxfly[E.T.S] 05/02/2005\n");
   printf("Usage:\n");
   printf("%s <StartIP> <EndIP>\n",help);
   printf("===============================================\n");
   return ;
}   

附件

bannerscan.rar (7 KB)

2005-5-3 03:44, 下载次数: 23

TOP

for(i=StartAddr;i<=EndAddr;i++)
   {
      h=CreateThread(NULL,0,Banner,(LPVOID)i,0,&dwThreadid);
      if(h=NULL)
      {
        printf("Create Thread Failure...\n");
        CloseHandle(h);
      }
      Sleep(4000);  
   }  
    CloseHandle(h);

这段程序中用for循环创建了EndAddr - StartAddr个内核对象,却只调用了一次CloseHandle(h);关闭了一个内核对象,这样程序运行时可能会发生内存泄漏。还有CreateThread如果没有成功返回是NULL,但是既然创建内核对象没有成功又为什么调用CloseHandle(h);来清除没有创建的内核对象那?
我用青春赌明天

TOP

引用:
下面是引用EvilCat于2005-05-04 16:32发表的:
for(i=StartAddr;i<=EndAddr;i++)
   {
      h=CreateThread(NULL,0,Banner,(LPVOID)i,0,&dwThreadid);
      if(h=NULL)
      {
.......
呵呵,偶本意是把那个CloseHandle()放在for()内的。结果不小

心放在外面了,太粗心了。
还有CreateThread如果没有成功返回是NULL,但是既然创建内核

对象没有成功又调用CloseHandle(h);这中间还得用一个

WaitForSingleObject(),
这也是为了防止内存泄漏的。
还有偶不会等待线程完全退出啊,只好用一个Sleep(),如果

socket阻塞了,线程还没退出前,就CloseHandle了,同样,这

也是内存泄露。

偶是刚学多线程,请各位精通的大哥们多多指点。

TOP

  h只是一个句柄  每次CreateThread都被赋于新值  其目的就是

检查CreateThread是否执行成功  所以最后CloseHandle一次就

可以了  

CreateThread本身就不安全  Windows核心编程就说过最好用

_beginthreadex  VC提供了C/C++启动函数代码 好象是CRT0.C

看看就知道了!
请加47809945   100%通过!每个月总有那么几天,您的网络会受到黑客的攻击--坐立不安,烦躁无力,使用虎虎开发的"月月舒"防火墙,超轻超薄,易于携带,提供由内到外的全方位保护,即使流量再大,也可以冲浪自如,再也不用担心侧漏啦。

TOP

  CreateThread了n次就创建了n个内核对象
假如忘记调用C l o s e H a n d l e函数,那么会不会出现内存泄漏呢?答案是可能的,但是也不一定。在进程运行时,进程有可能泄漏资源(如内核对象)。但是,当进程终止运行时,操作系统能够确保该进程使用的任何资源或全部资源均被释放,这是有保证的。对于内核对象来说,系统将执行下列操作:当进程终止运行时,系统会自动扫描进程的句柄表。如果该表拥有任何无效项目(即在终止进程运行前没有关闭的对象),系统将关闭这些对象句柄。如果这些对象中的任何对象的使用计数降为0,那么内核便撤消该对象.
所以只CloseHandle一次程序好像没有什么问题~~~但只是好像,其实还是存在问题地。
我用青春赌明天

TOP

发新话题