인디노트

ethhdr 의 src 및 dst 를 변경하는 C 코드 본문

개발 플랫폼 및 언어/네트워크 기술

ethhdr 의 src 및 dst 를 변경하는 C 코드

인디개발자 2023. 4. 13. 16:26
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <net/ethernet.h>
#include <arpa/inet.h>

#define ETH_HDRLEN 14

int main() {
    int sockfd = 0, ret = 0;
    char buffer[ETH_FRAME_LEN] = {0};
    struct ethhdr *eth = NULL;
    struct sockaddr_in dest = {0};

    // create raw socket
    sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if (sockfd == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // set destination address
    memset(&dest, 0, sizeof(struct sockaddr_in));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr("192.168.0.1");

    // allocate memory for Ethernet header
    eth = (struct ethhdr*)malloc(ETH_HDRLEN);
    if (!eth) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

    // read Ethernet frame into buffer
    ret = read(sockfd, buffer, ETH_FRAME_LEN);
    if (ret == -1) {
        perror("read");
        exit(EXIT_FAILURE);
    }

    // modify Ethernet header
    memcpy(eth->h_dest, "\x01\x02\x03\x04\x05\x06", ETH_ALEN);
    memcpy(eth->h_source, "\x06\x05\x04\x03\x02\x01", ETH_ALEN);
    eth->h_proto = htons(ETH_P_IP);

    // copy Ethernet header back into buffer
    memcpy(buffer, eth, ETH_HDRLEN);

    // send modified Ethernet frame to destination
    ret = sendto(sockfd, buffer, ETH_FRAME_LEN, 0, (struct sockaddr*)&dest, sizeof(struct sockaddr_in));
    if (ret == -1) {
        perror("sendto");
        exit(EXIT_FAILURE);
    }

    // free allocated memory and close socket
    free(eth);
    close(sockfd);

    return 0;
}

이 코드는 raw 소켓을 사용하여 Ethernet 프레임을 읽고 수정한 다음 지정된 대상 IP 주소로 보냅니다. Ethernet 헤더의 소스 및 대상 주소를 변경하는 방법은 memcpy 함수를 사용하여 수행됩니다. ethhdr 구조체를 포인터로 캐스팅하여 헤더의 필드에 액세스 할 수 있습니다. 이 코드는 Linux에서 컴파일하고 실행해야합니다.

반응형
Comments