From ad0b0d691008dacf4460baa84f5d631d80fbbd66 Mon Sep 17 00:00:00 2001 From: aixiao Date: Mon, 4 Nov 2024 17:00:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cap.c | 24 +++++++++--------------- cap.o | Bin 39248 -> 39128 bytes denyip | Bin 73736 -> 73728 bytes 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/cap.c b/cap.c index 8dc15da..2e7b73c 100644 --- a/cap.c +++ b/cap.c @@ -10,7 +10,7 @@ struct bpf_program fp; // 编译后的过滤器 pid_t pid = -1; // 子进程全局PID #define SHM_SIZE 1024 // 共享内存大小 -#define SHM_KEY 1234 // 共享内存键值 +#define SHM_KEY 0124 // 共享内存键值 int shmid = -1; int RULE_NAME_NUMBER = 0; // ipset 集合集合数 char *RULE_NAME = NULL; // 共享内存 @@ -219,6 +219,11 @@ void cleanup_(int signum) { _printf("Received signal %d, cleaning up...\n", signum); + + // 终止子进程 + if (pid > 0) { + kill(pid, SIGTERM); + } // 释放共享内存 if (RULE_NAME != NULL) { @@ -243,10 +248,7 @@ void cleanup_(int signum) pcap_freealldevs(alldevs); // 释放设备列表 pcap_close(handle); // 关闭会话句柄 - // 终止子进程 - if (pid > 0) { - kill(pid, SIGTERM); - } + // 退出主进程 exit(0); @@ -282,7 +284,8 @@ int main(int argc, char **argv) { 0, 0, 0, 0 } }; - while (-1 != (opt = getopt_long(argc, argv, optstring, longopts, &longindex))) { + while (-1 != (opt = getopt_long(argc, argv, optstring, longopts, &longindex))) + { switch (opt) { case 'd': if (daemon(1, 1)) { @@ -304,8 +307,6 @@ int main(int argc, char **argv) "for n in $(seq 0 %d); do iptables -A INPUT -p tcp -m set --match-set root$n src -j DROP 2> /dev/null; done", MAXIPSET_RULT_NAME_NUM); system(Ipset_Command); - - //system("for n in $(seq 0 MAXIPSET_RULT_NAME_NUM); do iptables -A INPUT -p tcp -m set --match-set root$n src -j DROP 2> /dev/null; done"); exit(0); } else if (strcmp(optarg, "stop") == 0) { memset(Ipset_Command, 0, BUFFER); @@ -314,8 +315,6 @@ int main(int argc, char **argv) "for n in $(seq 0 %d); do iptables -D INPUT -p tcp -m set --match-set root$n src -j DROP 2> /dev/null; done", MAXIPSET_RULT_NAME_NUM); system(Ipset_Command); - - //system("for n in $(seq 0 MAXIPSET_RULT_NAME_NUM); do iptables -D INPUT -p tcp -m set --match-set root$n src -j DROP 2> /dev/null; done"); exit(0); } else { usage(); @@ -335,11 +334,6 @@ int main(int argc, char **argv) } } - if (strcmp(interface, "eth0") != 0) - { - - } - // 创建共享内存 shmid = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666); diff --git a/cap.o b/cap.o index a7ae1c1286292b1734fd078fbe37240b072fa24c..bc5a4fc158ca127e135c96f07ccdfbb0fe153871 100644 GIT binary patch delta 3169 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 C#5-RA diff --git a/denyip b/denyip index 959c4d9ca05bff01c5c12deb1df1bb0e982cd268..5ca0db8be430f80f3c03700fdda7fc06aa7d2e7a 100644 GIT binary patch delta 7065 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