일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- kmip
- Xcode
- SwiftUI
- 인증
- 앨범북
- SSL
- css
- WebAuthn
- 앱리소스
- OSX
- fido
- otpkey
- apple
- Android
- 안드로이드
- Nodejs
- MYSQL
- SWIFT
- git
- albumbook
- appres
- SSH
- openssl
- MSYS2
- OTP
- 앱스토어
- 2FA
- FIDO2
- MFA
- 애플
Archives
- Today
- Total
인디노트
ethhdr 의 src 및 dst 를 변경하는 C 코드 본문
#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에서 컴파일하고 실행해야합니다.
반응형
'개발 플랫폼 및 언어 > 네트워크 기술' 카테고리의 다른 글
PF_PACKET을 사용하여 C 코드에서 패킷을 보내는 예시 (0) | 2023.04.14 |
---|---|
eth0 에서 recvfrom 함수로 읽어서 그대로 eth1 으로 write 함수로 전송 하는 C 코드 (0) | 2023.04.13 |
iphdr 를 이용해서 tcphdr 를 찾는 C 코드 (0) | 2023.04.13 |
ICMP ping 구현의 C 코드 (0) | 2023.04.12 |
TCP 전송의 C 코드 (0) | 2023.04.12 |
Comments