以前一直觉得像灰鸽子、黑洞之类的木马很神秘,很厉害。自己也想学学,刚好前段时间我一个导师布置了个课题研究木马防范技术。当然要防住木马这种东西总得了解别人的原理吧,无奈之中只好自己写个木马了。
若干日后。。。。。
其实木马这东西还真他#$简单,说穿了就是一个底层的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 版权协议,转载请附上原文出处链接和本声明。