伪装飞秋发送者version3: 添加中文字符集转换,添加飞鸽传书操作符enum头文件

This commit is contained in:
2023-09-12 11:38:26 +08:00
parent 6269ec8a5c
commit 08c65c47cb
2 changed files with 136 additions and 42 deletions
+103 -42
View File
@@ -5,6 +5,14 @@
UDP -> 8 UDP -> 8
UDP 数据报数据部分 UDP 数据报数据部分
*/ */
// 伪装飞秋数据报(UDP)
// 1. 伪装飞秋数据报的源IP和目的IP
// 2. 伪装飞秋数据报的源端口和目的端口
// 3. 伪装飞秋数据报的校验和
// 4. 伪装飞秋数据报的数据部分
// 5. 伪装飞秋数据报的长度
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/ether.h> #include <netinet/ether.h>
@@ -20,9 +28,14 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdlib.h> // system #include <stdlib.h> // system
#include <iconv.h> // iconv 用于转换编码
#include "fake_feiqiu_head.h"
ssize_t send_datapacket(int fd, unsigned char *buf, ssize_t buf_size, const char *ether_name); ssize_t send_datapacket(int fd, unsigned char *buf, ssize_t buf_size, const char *ether_name);
unsigned short checksum(unsigned short *buf, int len); unsigned short checksum(unsigned short *buf, int len);
char *convertToUTF8(const char *str); // 将字符串转换为UTF-8编码
char *convertToGB2312(const char *str); // 将字符串转换为GB2312编码
// 伪头部(UDP 校验时需要再 UDP 报文之间加上伪头部) // 伪头部(UDP 校验时需要再 UDP 报文之间加上伪头部)
typedef struct pseudo_udp_head_struct typedef struct pseudo_udp_head_struct
@@ -43,21 +56,11 @@ int main(int argc, char const *argv[])
perror("raw socket"); perror("raw socket");
return -1; return -1;
} }
/*
// 网卡结构体
struct ifreq ether_req; // 网卡接口请求结构体
strncpy(ether_req.ifr_name, "ens34", IFNAMSIZ); // 指定网卡名字, IFNAMESIZ 是接口网卡的名字大小
// 如果网卡不存在,返回错误,否则返回网卡接口索引
if (ioctl(sock_fd, SIOCGIFINDEX, &ether_req) == -1)
{
perror("ioctl");
return -1;
}
// 发送接口的结构体 // 设置网卡名
struct sockaddr_ll sll; // 网络层套接字地址结构体 char eth_name[128] = "";
bzero(&sll, sizeof(sll)); printf("请输入要伪装的网卡名: ");
sll.sll_ifindex = ether_req.ifr_ifindex; // 将网卡的接口类型赋值给发送接口 */ scanf("%s", eth_name);
char sender_ip[128] = ""; char sender_ip[128] = "";
printf("请输入要伪装的发送者IP: "); printf("请输入要伪装的发送者IP: ");
@@ -93,13 +96,6 @@ int main(int argc, char const *argv[])
unsigned char udp_buf[1500] = ""; // UDP 数据报 unsigned char udp_buf[1500] = ""; // UDP 数据报
// 伪装飞秋数据报(UDP)
// 1. 伪装飞秋数据报的源IP和目的IP
// 2. 伪装飞秋数据报的源端口和目的端口
// 3. 伪装飞秋数据报的校验和
// 4. 伪装飞秋数据报的数据部分
// 5. 伪装飞秋数据报的长度
// 伪装飞秋数据报的数据部分 // 伪装飞秋数据报的数据部分
// char msg_data[1024] = "1_lbt6_47#128#704D7B3F6397#0#0#0#4001#9:1694470508:chai:chai:32:hi liangzai"; // char msg_data[1024] = "1_lbt6_47#128#704D7B3F6397#0#0#0#4001#9:1694470508:chai:chai:32:hi liangzai";
char msg_data[1024] = ""; char msg_data[1024] = "";
@@ -108,6 +104,7 @@ int main(int argc, char const *argv[])
// scanf("%s", say_what); // scanf("%s", say_what);
fgets(say_what, sizeof(say_what), stdin); // 比 scanf 的优点是可以输入空格 fgets(say_what, sizeof(say_what), stdin); // 比 scanf 的优点是可以输入空格
say_what[strlen(say_what) - 1] = '\0'; // 去掉最后的换行符 say_what[strlen(say_what) - 1] = '\0'; // 去掉最后的换行符
if (strcmp(say_what, "exit") == 0) if (strcmp(say_what, "exit") == 0)
{ {
break; break;
@@ -117,26 +114,10 @@ int main(int argc, char const *argv[])
system("clear"); system("clear");
continue; continue;
} }
/* if (strncpy(say_what, "change", 6) == 0)
{
printf("请输入要伪装的发送者名字:");
scanf("%s", sender_name);
printf("请输入要伪装的发送者电脑名字:");
scanf("%s", sender_pc_name);
continue;
}
if (strncmp(say_what, "help", 4) == 0)
{
printf("请输入要发送的内容:\n");
printf("1. 输入exit退出\n");
printf("2. 输入clear清屏\n");
printf("3. 输入change更改伪装信息\n");
continue;
} */
sprintf(msg_data, "1:%d:%s:%s:%d:%s", 123, sender_name, sender_pc_name, 32, say_what); sprintf(msg_data, "1:%d:%s:%s:%d:%s", 123, convertToGB2312(sender_name), convertToGB2312(sender_pc_name), IPMSG_SENDMSG, convertToGB2312(say_what));
int msg_data_len = strlen(msg_data) + strlen(msg_data) % 2; // 整数补齐偶数位,strlen(msg_data)%2 : 偶数+0,奇数+1 int msg_data_len = strlen(msg_data) + strlen(msg_data) % 2; // 整数补齐偶数位,strlen(msg_data)%2 : 偶数+0,奇数+1
printf("msg_data_len = %d ---> %s\n", msg_data_len, msg_data); printf("msg_data_len = %d ---> %s\n", msg_data_len, convertToUTF8(msg_data));
/* ---------------------组装 UDP 数据报的 UDP 首部--------------------- */ /* ---------------------组装 UDP 数据报的 UDP 首部--------------------- */
struct udphdr *udp_head = (struct udphdr *)(udp_buf + 14 + 20); // UDP 首部开始位置 struct udphdr *udp_head = (struct udphdr *)(udp_buf + 14 + 20); // UDP 首部开始位置
@@ -151,8 +132,6 @@ int main(int argc, char const *argv[])
UDP 校验中的伪头部(pseudo header)是在计算 UDP 校验和时使用的辅助数据。伪头部包含了源 IP 地址、目的 IP 地址、协议类型(通常是 UDP)和 UDP 报文长度等信息。 UDP 校验中的伪头部(pseudo header)是在计算 UDP 校验和时使用的辅助数据。伪头部包含了源 IP 地址、目的 IP 地址、协议类型(通常是 UDP)和 UDP 报文长度等信息。
在计算 UDP 校验和时,将伪头部和 UDP 报文的内容拼接在一起,然后计算校验和。这样做的目的是增加校验和的安全性,使其更具可靠性。 在计算 UDP 校验和时,将伪头部和 UDP 报文的内容拼接在一起,然后计算校验和。这样做的目的是增加校验和的安全性,使其更具可靠性。
*/ */
// 196: 4c:e1:73:47:16:3a
// 158: e8:d8:d1:48:46:ae
unsigned char pseudo_udp_buf[1056] = ""; // 伪头部 unsigned char pseudo_udp_buf[1056] = ""; // 伪头部
PSEUDO_UDP_HEAD *pseudo_udp_head = (PSEUDO_UDP_HEAD *)pseudo_udp_buf; PSEUDO_UDP_HEAD *pseudo_udp_head = (PSEUDO_UDP_HEAD *)pseudo_udp_buf;
@@ -195,7 +174,7 @@ int main(int argc, char const *argv[])
/* ---------------------发送数据--------------------- */ /* ---------------------发送数据--------------------- */
// int send_len = sendto(sock_fd, udp_buf, 14 + 20 + 8 + msg_data_len, 0, (struct sockaddr *)&sll, sizeof(sll)); // int send_len = sendto(sock_fd, udp_buf, 14 + 20 + 8 + msg_data_len, 0, (struct sockaddr *)&sll, sizeof(sll));
int send_len = send_datapacket(sock_fd, udp_buf, 14 + 20 + 8 + msg_data_len, "ens38"); int send_len = send_datapacket(sock_fd, udp_buf, 14 + 20 + 8 + msg_data_len, eth_name);
printf("send_len = %d\n", send_len); printf("send_len = %d\n", send_len);
} }
@@ -247,3 +226,85 @@ unsigned short checksum(unsigned short *buf, int len)
sum += (sum >> 16); sum += (sum >> 16);
return ~sum; return ~sum;
} }
// 将字符串转换为UTF-8编码
char *convertToUTF8(const char *str)
{
// 输入字符串的长度
size_t inlen = strlen(str);
// 输出缓冲区的长度,假设为输入长度的3倍(UTF-8编码最多占用3个字节)
size_t outlen = inlen * 3;
// 创建转换句柄
iconv_t cd = iconv_open("UTF-8", "GB2312"); // 从 GB2312 转换为 UTF-8
// 分配输出缓冲区
char *outbuf = (char *)malloc(outlen);
if (outbuf == NULL)
{
perror("Memory allocation failed");
return NULL;
}
// 进行转换
char *inbuf = (char *)str;
char *outptr = outbuf;
if (iconv(cd, &inbuf, &inlen, &outptr, &outlen) == (size_t)-1)
{
perror("Conversion failed");
free(outbuf);
iconv_close(cd);
return NULL;
}
// 关闭转换句柄
iconv_close(cd);
// 添加字符串结束符
*outptr = '\0';
return outbuf;
}
// 将字符串转换为GB2312编码
char *convertToGB2312(const char *str)
{
// 输入字符串的长度
size_t inlen = strlen(str);
// 输出缓冲区的长度,假设为输入长度的3倍(UTF-8编码最多占用3个字节)
size_t outlen = inlen * 3;
// 创建转换句柄
iconv_t cd = iconv_open("GB2312", "UTF-8"); // 从 UTF-8 转换为 GB2312
// 分配输出缓冲区
char *outbuf = (char *)malloc(outlen);
if (outbuf == NULL)
{
perror("Memory allocation failed");
return NULL;
}
// 进行转换
char *inbuf = (char *)str;
char *outptr = outbuf;
if (iconv(cd, &inbuf, &inlen, &outptr, &outlen) == (size_t)-1)
{
perror("Conversion failed");
free(outbuf);
iconv_close(cd);
return NULL;
}
// 关闭转换句柄
iconv_close(cd);
// 添加字符串结束符
*outptr = '\0';
return outbuf;
}
+33
View File
@@ -0,0 +1,33 @@
#ifndef __FAKE_FEIQIU_HEAD_H__
#define __FAKE_FEIQIU_HEAD_H__
enum ipmsg_e
{
IPMSG_NOOPERATION = 0x00000000,
IPMSG_BR_ENTRY = 0x00000001,
IPMSG_BR_EXIT = 0x00000002,
IPMSG_ANSENTRY = 0x00000003,
IPMSG_BR_ABSENCE = 0x00000004,
IPMSG_BR_ISGETLIST = 0x00000010,
IPMSG_OKGETLIST = 0x00000011,
IPMSG_GETLIST = 0x00000012,
IPMSG_ANSLIST = 0x00000013,
IPMSG_FILE_MTIME = 0x00000014,
IPMSG_FILE_CREATETIME = 0x00000016,
IPMSG_BR_ISGETLIST2 = 0x00000018,
IPMSG_SENDMSG = 0x00000020,
IPMSG_RECVMSG = 0x00000021,
IPMSG_READMSG = 0x00000030,
IPMSG_DELMSG = 0x00000031,
/* option for all command */
IPMSG_ABSENCEOPT = 0x00000100,
IPMSG_SERVEROPT = 0x00000200,
IPMSG_DIALUPOPT = 0x00010000,
IPMSG_FILEATTACHOPT = 0x00200000
};
#endif