===== 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
=xt는 Exact 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
댓글 없음:
댓글 쓰기