2026년 7월 10일 금요일

Res – Tracker that tracks torrents used in North Korea - Part - 3

Sub Topic - EP.03 - What is inside a Magnet Link?

===== Intro =====

1.     제 나름대로 구상한 방식입니다

2.     막히면 돌아가고 깊이가 방대하면 포기하고 다음으로!

3.     구성 : 토픽 기반기술 학습 기반기술 기반 실습(되는데로..) – 최종 프로젝트

 

===== Overall story =====

1.     1 = 북한 ip의 구성

2.     2 = Torrent 이용중 IP 동작

3.     3 = 마그넷 링크를 뜯어보고 토렌트가 무엇으로 파일을 식별하는지 이해

 

Step – 0

== 토렌트 파일(.torrent) 없이도 다운로드가 시작되는 이유는 뭘까?

지난시간에 토렌트 네트워크의 동작을 알아보았죠? 토렌트에 참여하는 Peer들은 서로 직접 연결되어 이 과정에서 IP 주소가 노출될 수 있다~ 이말이죠 (심연을 오래 들여다보면 심연 또한 그대를 들여다 본다는~)

그럼 이때 의문이 듭니다!(너만 그렇다..) 토렌트 파일 없이도 다운로드가 가능한 이유는 뭐지? (실제로 많은 토렌트 사이트에서 .Torrent 파일대신 Magnet Link 만 제공합니다)

실험을 위해 Torrent Ubuntu Linux Torrent 를 가지고 실험합니다~

(Torrent사이트에서 제공하는 파일 다운로드와 마그넷, 우측은 실험을 위해 만든 토렌트)

****Torrent 자체는 불법이 아닙니다!! 토렌트로 공유되는 파일들이 저작권을 무시하고 공유되는 경우가 많아 불법으로 아시는 분들이 많은 것!! ****

 

일단 Magnet Link 를 분해해 보면 아래와 같이 생겼습니다

è magnet:?xt=urn:btih:dafc8c076ca2f3ed (중략)

è 얼핏 보면 알수 없는 문자열 같이 생겼지만 이 안에 토렌트 네트워크가 파일을 찾기 위해 필요한 중요한 정보들이 있습니다



(프리즘처럼 링크를 쪼개 보자)

 

Step – 1

== Magnet Link?

마그넷 링크란 이 파일의 정보는 이 해시(Hash)로 식별됩니다라고 알려주는 URL(Uniform Resource Identifier) 입니다, 웹페이지 주소가 특정 서버를 가리킨다면 마그넷 링크는 파일을 가리키죠

 

(어떤 값을 넣어도 정해진 길이의 문자열을 반환 하는 해시함수)

 

Step – 2

== Magnet Link 분석 시작

예제로 사용할 마그넷(ubuntu Linux 26.04 iso파일의 torrent입니다)

è magnet:?xt=urn:btih:dafc8c076ca2f3ed376eeae7c76a0d6be2415c45&dn=ubuntu-26.04-desktop-amd64.iso&xl=6518974464&tr=https%3A%2F%2Ftorrent.ubuntu.com%2Fannounce&tr=https%3A%2F%2Fipv6.torrent.ubuntu.com%2Fannounce

 

1.xt

è magnet:?xt=urn:btih:dafc8c076ca2f3ed376eeae7c76a0d6be2415c45&dn=ubuntu-26.04-desktop-amd64.iso&xl=6518974464&tr=https%3A%2F%2Ftorrent.ubuntu.com%2Fannounce&tr=https%3A%2F%2Fipv6.torrent.ubuntu.com%2Fannounce

=xtExact Topic 의 약자로 토렌트에서 보이는 형태는 urn:bith:INFOHASH 형태임

=이때 bith BitTorrent Info Hash 로 쉽게말하면 이 토렌트를 대표하는 고유 식별자

 

**InfoHash?**

토렌트 내부 파일의 info 딕셔너리를 해시한 값, 지금처럼 Unbuntu ISO 파일의 토렌트를 예를 들면 “SHA1 + 구조로 생성되어 전세계 모든 Peer 들은 이 값만 알고 있어도 같은 토렌트를 탐색이 가능함! 이를테면 토렌트 네트워크의 주민등록번호



(이런 느낌의 정보가 InfoHash~)

 

2.dn

è magnet:?xt=urn:btih:dafc8c076ca2f3ed376eeae7c76a0d6be2415c45&dn=ubuntu-26.04-desktop-amd64.iso&xl=6518974464&tr=https%3A%2F%2Ftorrent.ubuntu.com%2Fannounce&tr=https%3A%2F%2Fipv6.torrent.ubuntu.com%2Fannounce

=dn Display Name 의 약자로 사용자 화면에 표시될 파일 이름, dn은 없어도 작동할수있음, 실제 핵심 정보는 InfoHash 이다

 

3.tr

è magnet:?xt=urn:btih:dafc8c076ca2f3ed376eeae7c76a0d6be2415c45&dn=ubuntu-26.04-desktop-amd64.iso&xl=6518974464&tr=https%3A%2F%2Ftorrent.ubuntu.com%2Fannounce&tr=https%3A%2F%2Fipv6.torrent.ubuntu.com%2Fannounce

=tr Tracker 로써 주소를 말함, 토렌트 클라이언트는 이 주소로 접속하여 이 해시를 가진 Peer 목록을 알려달라라고 요청하면 Tracker 가 응답으로 Peer 정보를 반환한다

 

**Tracker없어도 다운로드 되는데?**

요즘 토렌트는 DHT, PEX, Local Peer Discovery 기능을 사용함, 따라서 Tracker 가 없거나 최소한만 포함되는 경우도 많음!

 

Step – 3

== Torrent Tracker 관점에서 중요한건?

그래서 만들려는 Torrent Tracker는 결국 InfoHash를 중심으로 동작하고 추적의 목표인 누가 어떤 토렌트에 참여하고 있는가를 추적하려면 먼저 어떤 InfoHash를 감시할건가?” 라는 것을 정해야 하기 때문임!

 

즉 정리하면 추적의 흐름을 정리하면 이렇게 된다

è Magnet Link -> InfoHash 추출 -> Peer 탐색 -> IP 수집

 

(순서대로 만들어야 한다~)

 

Step – 4

==다음화 예고 - Tracker 서버는 Peer 목록을 어떻게 알려줄까?

l   Announce 요청

l   Bencode

l   Peer List

l   Compact Peer Format

l   Tracker 통신 분석

l   C#으로 Tracker 응답 파싱하기

 

여기까지 진행하면 드디어 "토렌트 참여자(IP)를 실제로 수집하는 원리"에 본격적으로 들어가게 됩니당~

 

===== 실습 =====

=C# 콘솔 프로그램으로 진행

==Magnet Link 파싱하는 프로그램을 만들어보자(Ex_3_Magnet_Parser)

 

using System;

using System.Web;

 

class Program

{

    static void Main()

    {

        Console.WriteLine("Magnet Link 입력:");

        string magnet = Console.ReadLine();

 

        Uri uri = new Uri(magnet);

 

        var query = HttpUtility.ParseQueryString(uri.Query);

 

        string xt = query["xt"];

        string dn = query["dn"];

        string tr = query["tr"];

 

        string infoHash = "";

 

        if (!string.IsNullOrEmpty(xt))

        {

            int idx = xt.LastIndexOf(':');

 

            if (idx >= 0)

                infoHash = xt.Substring(idx + 1);

        }

 

        Console.WriteLine();

        Console.WriteLine("=== 분석 결과 ===");

        Console.WriteLine($"InfoHash   : {infoHash}");

        Console.WriteLine($"DisplayName: {dn}");

        Console.WriteLine($"Tracker    : {tr}");

    }

}

 

Ubuntu iso Torrent 로 실험해 봅시다

ubuntu-26.04-desktop-amd64.iso

 

ubuntu-26.04-live-server-amd64.iso


댓글 없음:

댓글 쓰기