이 밸런타인데이에 엔지니어는 아리운으로 다른 사랑을 표현해 보았다
UNIX의 경우_LIKE 시스템에서 핑의 발송 내용과 수신 내용이 다르면 다른 부분이 표시됩니다. 그러면 당신의 여신이나 남신을 천천히 ASCII 코드를 당신이 그녀에게 말하고 싶은 말로 해석하세요.아니면 그녀에게 tcpdump를 사용하여 핑에 숨겨진 속삭임을 직접 잡으라고 말해라.(윈도우즈에 대해 본인은 충분한 테스트를 하지 않았습니다. 다만 유닉스_like 시스템처럼 요청 메시지와 답장 메시지가 직접적으로 나타나지 않는다는 것을 알고 있기 때문에 가방을 잡고 열심히 정보를 추출해야 합니다)
1. ICMP 프로토콜에 대해 알아야 할 사항:
컴퓨터 네트워크를 배운 사람들은 한 네트워크 패키지의 봉인은 주로 여러 개의 서로 다른 네트워크 프로토콜층에 속하는 메시지 헤더와 사용자 데이터가 공동으로 구성된다는 것을 알 수 있다. 체인 헤더 + 네트워크 헤더 IP 메시지 헤더 + 전송 헤더 + 휴대하는 내용 + 프레임 끝이다.ICMP 메시지는 전체 이더리움 프레임에 다음과 같은 위치에 있습니다.
위의 그림은 미분할 ICMP 메시지 또는 비교적 긴 ICMP 메시지의 첫 번째 IP 분할 메시지입니다. (분할된 메시지에는 ICMP 헤더가 포함되지 않습니다.)RFC792(https://tools.ietf.org/html/r...)에서 ICMP 헤더 8bit "유형"필드를 통해 구분되는 11가지 ICMP 메시지 유형을 정의했습니다.또한 각 유형의'회와 그'코드 필드와 메시지 헤더의 마지막 4바이트는 모든 메시지 유형이 표시하는 정보를 공동으로 표현한다.이러한 ICMP 메시지 유형은 주로 오류 메시지와 조회 메시지로 나뉩니다.
2. 간단한 핑을 작성하여 Linux 핑에 대해 알아보기
본고의 주인공 중 하나인 핑은 간단한 핑을 써서 우리가 전체 요청 응답의 과정을 더욱 잘 이해하도록 도와줄 필요가 있다.제 테스트 기계centos7에서 사용하는 것은 iputils라는 도구로 ping 작업을 하기 때문에 우리는 iputils 원본에서 시작하여 간단한 ping을 어떻게 쓰는지 배울 수 있습니다.
c 네트워크 프로그래밍을 배운 사람들은 반드시 socket 플러그인이라는 개념을 이해할 것이다.핑의 경우 요청을 보내고 응답을 받는 것도 플러그인을 통해 이루어진다.단, ICMP 프로토콜은 커널에서 TCP, UDP와 비슷하지만 본질은 IP 프로토콜에 부속된 네트워크 레이어 프로토콜이기 때문에 TCP나 UDP가 사용하는 유동식 소켓(SOCK_STREAM)과 패키지식 소켓(SOCK_DGRAM)이 아닌 원본 소켓(SOCK_RAW)을 사용하여 소켓을 구축해야 한다.SOCK_RAW의 용도는 사용자가 IP 헤더를 사용자 정의로 채울 수 있고 ICMP 헤더를 사용자 정의로 채울 수 있다는 데 있다.다음 그림은 코드에서 전체 핑의 논리적 발송과 응답을 처리하는 논리를 보여 줍니다.
구체적인 코드는 이것을 참고할 수 있다.https://github.com/xiaobaidemu/myping/blob/master/ping.c전체 절차는 매우 간단하다. 설명해야 할 것은ping127.0.1에 대해 프로그램은 type이 0인 리셋 요청 메시지를 먼저 받고 type가 8인 리셋 응답 메시지를 받을 가능성이 매우 높다.이것은 icmp 메시지가 내부 핵에 의해 동시에 수신 처리되고 원시 플러그인에 의해 처리되기 때문이다. 아래는 Understanding Linux Network Internals 책에서 기술한 것이다.
3. 핵 코드를 추가하기 전에 구조체와 icmp만 알면 됩니다.c
핑의 전체 과정을 이해했다. 다음은 네가 하고 싶은 말을 전달하기 위해 내부 핵을 수정해야 한다.그러나 가장 중요한 것은 수정된 위치, 즉 응답을 보낼 수 있는 바이트가 내부 코드에 있는 위치를 분석해야 한다는 것이다.여기에 매우 중요한 구조체가 하나 있다--struct sk_buff, 그 정의는 에 있습니다.
코어 중 sk_buff 구조체는 복사나 삭제 방식을 사용하지 않고 데이터를 각 층 프로토콜 간에 전송할 수 있도록 했다. 즉, 바늘 헤더를 이동하는 방식이다. 구체적으로 서로 다른 프로토콜 헤더를 처리할 때 프로토콜 헤더의 바늘을 대표하고 서로 다른 데이터 구역(예를 들어 L2에서 L4 층 프로토콜, 각각 2층 맥 헤더, 3층 IP 헤더, 4층 전송 헤더)을 가리킨다.다음은 도식 설명과 결합하여 비교적 중요하고 헷갈리는 필드 설명입니다.
위의 그림은 네 개의 포인터와 지향 구역 간의 관계를 간단하게 설명한다.또한 데이터의 경우_len과 len의 관계, 만약에 icmp 메시지가 비교적 작고 ip층이 이를 분리하지 않는다고 가정하면 data_len은 0이고, len은 현재 프로토콜 헤더 길이+데이터 메시지 길이입니다.데이터 정보_len과 len 사이의 관계는 skb_shared_info라는 구조체의 관련 내용은 문장 중심과 관계가 크지 않기 때문에 흥미가 있는 학생들은 스스로 문장을 찾아보고 공부할 수 있다
상기 내용 중 데이터 바늘과 표징 프로토콜층 데이터 길이의 len, 그리고 뒷글에서 수정한 sk_buff가 가리키는 데이터는 직접 관련이 있습니다.별도sk_buff는 여러 가지 다른 구조체와 관련이 있는데 여기서 중요한 필드의 의미만 간단명료하게 설명하고 더욱 구체적인 설명은 Understanding Linux Network Internal 제2장 또는https://blog.csdn.net/YuZhiHui_No1/article/details/38666589시리즈 문장을 더욱 깊이 있게 학습하다.
알겠습니다 sk_buff 구조체, icmp 프로토콜을 처리하는 파일이 어디에 있는지 위치를 지정해야 합니다.icmp.c는 커널 디렉터리에 있는net/ipv4/icmp입니다.c에서, 그리고 ICMP 프로토콜은 일반적으로 모듈을 통해 설정된 것이 아니라 정적으로 코어로 컴파일됩니다.여기에서 저는 Understanding Linux Network Internal이라는 책에서 빅픽처 한 장을 파내서 핑에 대한 회현 요청을 간략하게 설명합니다. sk_buff 구조체의 대상은 icmp의 많은 함수에서 어떻게 전달됩니까?
우선 ip_local_deliver_finish는 icmp_에 ICMP 메시지를 전달합니다.rcv, icmp_rcv는 icmp 헤더의 형식 필드를 분석하고 조회 메시지에 속하는 형식(예를 들어 type8)은 icmp_에 전달합니다reply, 오류에 대한 메시지는 icmp_send 처리를 하고 ICMP 프로토콜도 TCP/UDP 프로토콜과 같은 다른 정보와 상호작용을 한다.ping 프로세스에 대한 요청은 icmp_에 전달됩니다echo 함수를 처리합니다.반면 icmp_echo는 ping 요청을 처리하는 데 중요한 단계입니다. 호스트는 요청에 첨부된 데이터 메시지 부분을 그대로 복사하여 원본 호스트로 보냅니다.그래서 우리는 icmp_echo 함수에 "사랑의 문장"을 추가합니다.
static bool icmp_echo(struct sk_buff *skb)
{
struct net *net;
net = dev_net(skb_dst(skb)->dev);
if (!net->ipv4.sysctl_icmp_echo_ignore_all) {
struct icmp_bxm icmp_param;
icmp_param.data.icmph = *icmp_hdr(skb);
icmp_param.data.icmph.type = ICMP_ECHOREPLY;
icmp_param.skb = skb;
//----------- -----------
char sentence1[] = "I LOVE U, xxxx.";
char sentence2[] = "I MISS U, xxxx.";
char sentence3[] = "Happy Valentine's Day!";
int sentence_len_list[] = {sizeof(sentence1), sizeof(sentence2), sizeof(sentence3)};
char* sentence_list[] = {sentence1, sentence2, sentence3};
int sentence_index = icmp_param.data.icmph.un.echo.sequence % 3;
if(skb->len >= 16 + sentence_len_list[sentence_index])
{
char* tmp = (char*)(skb->data+16);
char* target_sentence = sentence_list[sentence_index];
int i=0;
for(;ilen-16;++i)
{
tmp[i] = 0;
}
}
//----------- ------------
icmp_param.offset = 0;
icmp_param.data_len = skb->len;
icmp_param.head_len = sizeof(struct icmphdr);
icmp_reply(&icmp_param, skb);
}
/* should there be an ICMP stat for ignored echos? */
return true;
}
위의 코드에서 icmp_bxm 구조체는 후속 icmp 메시지 전달 과정에서 필요한 모든 정보를 포함하고 icmp 메시지 헤더, sk_buff 대상, icmp 메시지payload 크기 등.주의해야 할 것은 icmp_rcv 이미 sk_buff는 icmp 프로토콜의 메시지 헤더 부분에 속하기 때문에 매개 변수에서 skb->data는 icmp 데이터 부분을 가리킨다. 즉, 메시지 헤더를 포함하지 않고 skb->len도 icmp 데이터 부분의 길이만 포함한다.ping 요청에 포함된 데이터 부분이 56바이트라고 가정하면 skb->len 크기는 56입니다.ping 데이터 부분의 전 16바이트는 발송이 structtimeval 대상인 발송 시간입니다. 따라서 실제 교체할 때 데이터가 가리키는 데이터 부분의 16번째 바이트부터memcpy로 해당 구역으로 복사하거나 상기 예와 같이 어리석은 순환 값을 부여하면 됩니다.위 코드는 echo 요청에 따라 seq_id 순환은 상기 세 마디를 회복합니다.물론 창의적인 파트너는 더 많은 표현 난이도를 높일 수 있다.
4. Aliwn ECS 서버를 만들고 10분 안에 모든 수정 완료
전체 icmp 처리 절차와 수정 방법을 분석한 후에 우리는 아리운 ECS를 만들고 수정된 핵을 간단하게 컴파일하면 된다.구체적인 절차는 다음과 같다.
섹션 참조:
본문 저자: 하소백 학우
원문을 읽다
본고는 운서 지역사회의 오리지널 내용으로 허락 없이 전재할 수 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
이 밸런타인데이에 엔지니어는 아리운으로 다른 사랑을 표현해 보았다c 네트워크 프로그래밍을 배운 사람들은 반드시 socket 플러그인이라는 개념을 이해할 것이다.핑의 경우 요청을 보내고 응답을 받는 것도 플러그인을 통해 이루어진다.단, ICMP 프로토콜은 커널에서 TCP, UDP와...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.