Я пишу программу, которая на самом деле отправляет сырые пакеты и анализирует сеть.У меня есть Программа для создания, отправки пакетов и прослушивания сети.Каждый из них работает (в основном) замечательно.Если я пытаюсь реализовать основную функцию, которая сначала вызывает функцию для построения и отправки пакета, а затем функцию, которая производит анализ, я получаю ошибку free(): Invalid next size (normal) | Cancelled (memory dump written)
.
Я пытался найти проблему самостоятельно.Я вызывал startSniffer()
- функцию в разных местах.На самом деле в send_tcp_packet
перед сборкой пакета tcp (build_tcp_packet
) и после этого тоже.Если я позвоню startSniffer()
Функция до build_tcp_packet
, она работает.Поэтому я вызываю startSniffer()
- функцию в build_tcp_packet
перед memcpy(...)
, и она работает.Поэтому я предполагаю, что ошибка из-за memcpy(...)
.Я удалил memcpy(...)
, и программа работает хорошо.Но на самом деле Программе нужно memcpy(...)
для установки полезной нагрузки в заголовке TCP.
Так у вас была идея и помощь для моего кода ???
void startBuilding() {
unsigned char *data;
unsigned int packet_size;
unsigned int data_size;
src_addr.sin_family = AF_INET;
inet_aton(srcHost, &src_addr.sin_addr);
dst_addr.sin_family = AF_INET;
inet_aton(destHost, &dst_addr.sin_addr);
data = (char*) malloc(strlen(sendingData) + 1);
strcpy((char *) data, sendingData);
data_size = strlen(sendingData);
switch (ipProto) {
case IPPROTO_TCP:
printf("[+] Send TCP packet...\n");
src_addr.sin_port = htons(tcpSourcePort);
dst_addr.sin_port = htons(tcpDestPort);
if (open_RawSocket(ipProto)) {
send_tcp_packet(raw_socket, src_addr, dst_addr, data, data_size);
}
}
unsigned int build_tcp_packet(struct sockaddr_in src_addr,
struct sockaddr_in dst_addr, unsigned char *tcp_packet,
unsigned char *data, unsigned int data_size) {
printf("[+] Build TCP packet...\n\n");
unsigned int length;
struct tcpheader *tcp;
length = TCPHDRSIZE + data_size;
tcp = (struct tcpheader *) tcp_packet;
tcp->th_sport = src_addr.sin_port;
tcp->th_dport = dst_addr.sin_port;
tcp->th_seq = htonl(tcpSeqNum);
tcp->th_acknum = tcpAcknum;
tcp->th_reserved = tcpReserved;
tcp->th_off = tcpOffSet;
tcp->th_fin = tcpFinFlag;
tcp->th_syn = tcpSynFlag;
tcp->th_rst = tcpRstFlag;
tcp->th_psh = tcpPshFlag;
tcp->th_ack = tcpAckFlag;
tcp->th_urg = tcpUrgFlag;
tcp->th_cwr = tcpCwrFlag;
tcp->th_ece = tcpEceFlag;
tcp->th_win = htons(tcpWin);
tcp->th_urp = tcpUrp;
tcp->th_sum = tcpSum;
// startSniffer(); // If i start startSniffer here, it works fine.
memcpy(tcp_packet + TCPHDRSIZE, data, data_size);
// startSniffer(); //If i start sartSniffer here, it did not work, and i get the error.
return length;
}
unsigned int build_ip_packet(struct in_addr src_addr, struct in_addr dst_addr,
uint8_t protocol, unsigned char *ip_packet, unsigned char *data,
unsigned int data_size) {
printf("[+] Build IP packet...\n\n");
struct ipheader *ip;
ip = (struct ipheader*) ip_packet;
ip->ip_v = ipv;
ip->ip_hl = iphl;
ip->ip_tos = iptype;
ip->ip_id = htons(ipId);
if (calculateIpLenInBuildPacket) {
ip->ip_len = htons(iphl * 4 + data_size);
} else {
ip->ip_len = htons(ipLen);
}
ip->ip_off = ipOffset;
ip->ip_moreFrag = ipMoreFragmentFlag;
ip->ip_doNotFrag = ipDoNotFragmentFlag;
ip->ip_reserved = ipReserved;
ip->ip_frag_offset1 = ipFragOffset;
ip->ip_ttl = ipTTL;
ip->ip_p = ipProto;
ip->ip_sum = ipSum;
ip->iph_sourceip = src_addr.s_addr;
ip->iph_destip = dst_addr.s_addr;
return sizeof(struct ipheader) + data_size;
}
int main(int argc, char **argv) {
startBuilding();
startSniffer();
}
void send_tcp_packet(int raw_sock, struct sockaddr_in src_addr,
struct sockaddr_in dst_addr, uint8_t *data, unsigned int data_size) {
unsigned int packet_size;
unsigned int ip_payload_size;
unsigned char *packet;
packet = (char*) malloc(strlen(data) + 1);
memset(packet, 0, ETH_DATA_LEN);
ip_payload_size = build_tcp_packet(src_addr, dst_addr,
packet + sizeof(struct ipheader), data, data_size);
packet_size = build_ip_packet(src_addr.sin_addr, dst_addr.sin_addr,
IPPROTO_TCP, packet, packet + sizeof(struct ipheader), ip_payload_size);
setOption_RawSocket(raw_sock);
if (sendto(raw_sock, packet, packet_size, 0, (struct sockaddr *) &dst_addr,
sizeof(dst_addr)) < 0) {
perror("sendto");
exit(1);
} else {
printf("Send! \n\n");
}
close(raw_sock);
}