先来看一个非常普通的收发
服务端
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <assert.h>
int main() {
int listen_fd = socket(AF_INET, SOCK_DGRAM, 0);
assert(listen_fd > 0);
struct sockaddr_in listen_addr;
memset(&listen_addr, 0, sizeof(listen_addr));
listen_addr.sin_family = AF_INET;
listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);
listen_addr.sin_port = htons(9999);
assert(bind(listen_fd, (struct sockaddr*)&listen_addr, sizeof(listen_addr)) != -1);
while (1) {
struct sockaddr_in cli_addr;
memset(&cli_addr, 0, sizeof(cli_addr));
socklen_t cli_addr_len = sizeof(cli_addr);
int msg, msg_len;
recvfrom(listen_fd, &msg, sizeof(msg), 0, (struct sockaddr*)&cli_addr, &cli_addr_len);
printf("%d\n", msg);
sleep(1);
msg++;
sendto(listen_fd, &msg, sizeof(msg), 0, (struct sockaddr*)&cli_addr, cli_addr_len);
}
return 0;
}
客户端
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <assert.h>
int main() {
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
assert(socket_fd > 0);
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(9999);
assert(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) >= 0);
int msg = 1;
while (1) {
sendto(socket_fd, &msg, sizeof(msg), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
socklen_t serv_addr_len = sizeof(serv_addr);
recvfrom(socket_fd, &msg, sizeof(msg), 0, (struct sockaddr*)&serv_addr, &serv_addr_len);
printf("%d\n", msg);
sleep(1);
msg++;
}
return 0;
}
跑起来之后,可以用 netstat -anp|grep 9999 看到下面的链接
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) udp 0 0 0.0.0.0:9999 0.0.0.0:* 16144/ser
问题来了,如果我不想被 netstat 看到,需要怎么搞呢
这个思路其实比较直接,就是使用 raw socket,注意到 netstat 是分析 tcp 或者 udp 包头中的 port 字段来判定这个是个什么样的连接的,所以如果我们使用一个自定义的传输层协议,然后自行填充 ip 包的包头,发送出去,就可以绕过 netstat 的检查了。
说起来容易,但是实际调起来发现 raw socket 确实是不好调,稍后代码如果能调通了会放一份上来。
可以看这里有相关的说明,http://sec.chinabyte.com/429/8…
不过楼主的目的是要创建一种属于自己的protocol,这样就不会受到TCP/UDP监控?有种covert channel的感觉…
是的,可以看我原文最后引用的那篇文章,里面有说明,这种技术一般是木马用于躲避简单的监控