struct ApcParament
{
CHAR Buffer[512];
DWORD dwDestIP;
};
typedef void * (__stdcall *PIcmpCreateFile)(void);
typedef void * (__stdcall *PIcmpCloseHandle)(HANDLE IcmpHandle);
typedef unsigned long (__stdcall *PIcmpSendEcho2)(HANDLE IcmpHandle,HANDLE Event, FARPROC ApcRoutine, PVOID ApcContext, IPAddr DestinationAddress, LPVOID RequestData, WORD RequestSize, PIP_OPTION_INFORMATION RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout);
void ApcFunc (void *p){
ApcParament * pApcParament=(ApcParament*)p;
ICMP_ECHO_REPLY* P_Icmp_Echo_Option=(ICMP_ECHO_REPLY*)(pApcParament->Buffer);
if(P_Icmp_Echo_Option->RoundTripTime<100000 && P_Icmp_Echo_Option->Address==htonl(pApcParament->dwDestIP))
{
in_addr tmp;
tmp.S_un.S_addr=P_Icmp_Echo_Option->Address;
printf("ip:%s 开启\n",inet_ntoa(tmp));
}
}
DWORD WINAPI IcmpNormalScan(LPVOID pscanParament)
{
scanParament* lpParament=(scanParament*)pscanParament;
ApcParament *ReplyBuffer=NULL;
int NumberOfIP;
HMODULE hInst=LoadLibrary("iphlpapi.dll");
if(!hInst)
{
return -1;
}
PIcmpCreateFile IcmpCreateFile=(PIcmpCreateFile)GetProcAddress(hInst,"IcmpCreateFile");
PIcmpSendEcho2 IcmpSendEcho2=(PIcmpSendEcho2)GetProcAddress(hInst,"IcmpSendEcho2");
PIcmpCloseHandle IcmpCloseHandle=(PIcmpCloseHandle)GetProcAddress(hInst,"IcmpCloseHandle");
if(IcmpCreateFile==NULL||IcmpSendEcho2==NULL||IcmpCloseHandle==NULL)
{
return -1;
}
HANDLE IcmpHandle=0;
IcmpHandle=IcmpCreateFile();//打开ICMP句柄
if(IcmpHandle==0)
{
return -1;
}
else
{
IP_OPTION_INFORMATION IpOption;//该结构用来控制所发ICMP数据包的IP头的相应字段值
IpOption.Flags=0;
IpOption.OptionsData=NULL;
IpOption.OptionsSize=0;
IpOption.Tos=0;
IpOption.Ttl=123;
char *SendData = "hi,I am houhou!";
NumberOfIP=lpParament->dwLastIP-lpParament->dwOriginalIP;
ReplyBuffer=new ApcParament[NumberOfIP];
int i=0;
printf("ICMP Scanning...\n");
for(DWORD dwIP=lpParament->dwOriginalIP;dwIP<=lpParament->dwLastIP;dwIP++,i++)
{
ReplyBuffer[i].dwDestIP=dwIP;
int Res=0;
Res=IcmpSendEcho2(IcmpHandle,
NULL,
(FARPROC)&ApcFunc,
(void*)(&ReplyBuffer[i]),
htonl(dwIP),
SendData,
(WORD)strlen(SendData),
&IpOption,
ReplyBuffer[i].Buffer,
512,
NumberOfIP*200);
// SleepEx(1,true);
}
}
int i=0;
while(1)
{
if(SleepEx(100,true)==WAIT_IO_COMPLETION)
{
}
else
{
i++;
}
if(NumberOfIP*2==i)
{
break;
}
}
IcmpCloseHandle(IcmpHandle);
delete []ReplyBuffer;
return 0;
}
int main(){
scanParament p;
p=GetScanParament();
HANDLE h;
h=CreateThread(NULL,0,IcmpNormalScan,&p,0,NULL);
WaitForSingleObject(h,INFINITE);
CloseHandle(h);
system("pause");
return 0;
}