BEncode 란?

토렌트(Torrent) 파일을 분석해 보면 공유 대상이 되는 파일의 이름, 파일의 전체 크기, 파일의 해시값(hash value), 트래커, Piece 등에 대한 정보를 가지고 있는데, 해당 데이터 내용들은 BEncoding 방식으로 구성되어 있다.

BEncode 는 바이너리 인코딩(Binary Encoding)의 약자로, 비트 토렌트 관련 파일에서 데이터를 저장하거나 공유 네트워크 상에서 정보를 주고 받을 때 사용하는 형식이다.

BEncode 구조

BEncode 구조로 작성된 파일은 평문으로 데이터를 저장하지만 각각의 규칙적인 구조를 가지게 된다.

BEncode 구성 요소의 사본

위의 구조를 기반으로 데이터를 관리&저장을 하는데 해당 파일이 디렉터리(Directory) 일때 아래와 같은 구조를 가지게 된다.

BEncode Directory 구성 요소의 사본

BEncode 구조와 관련된 구성 요소를 전부 알아 보았기 때문에 한번 실제 *.dat 파일을 Hex Viewer를 이용해서 열어서 도구를 사용했을때 보여주는 데이터와 실제 Hex 데이터를 읽고 해석한 결과 와 비교를 해보자.

BEncode File Analysis

예시로 간단하게 분석할 파일은 rss.dat 파일로 209 바이트를 차지하고 있다. 해당 파일을 BEncode 뷰어 도구인 BEncode Editor 를 이용해서 한번 확인해 보면 아래와 같다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/46c1cbe6-3336-4fc4-bb5d-700122492065/Untitled.png

이제 한번 Hex Data를 확인해 보고 해석을 해보자.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/12b19131-c5c5-436e-9f01-13939b59b225/Untitled.png

먼저 **d**가 나오는데 맨마지막 0xD0 위치에 e 가 있는 것을 확인해 볼 수 있다. 이 이후에 나오는 모든 데이터는 Dictionaries 로 데이터가 들어가는 것을 알 수 있다.

그 뒤에 10:.fileguard 이라는 값이 있다. 이는 Strings 유형에 [길이]:[데이터] 구조 인것을 확인해 볼 수 있다. 그렇기 때문에 .fileguard 라는 변수를 설정 한것으로 확인해 볼 수 있다. 그 뒤에는 해당 변수에 대한 데이터가 작성 되게 되는데 40:9DE53CBD58F32BCC072A6EAA8AD906AC54AF0CF4 와 같이 40글자가 쓰여져 있다.

여기 까지의 데이터를 정리해 보면 아래와 같다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/49b57689-f03f-4ac8-9c74-36a1c58e3479/Untitled.png

이어서 분석해 보면 6:d_feed 라는 변수 설정 값이 있고, 그 뒤에 le 라는 값이 나오는 것으로 보아 d_feed 변수가 list로 구성되어 있지만 l 과 e 의 사이에 아무런 값이 없기 때문에 해당 리스트에는 아무런 값이 없기 때문에 아래와 같이 정리를 할 수 있다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2871d9be-1a17-4b93-b697-54e425100b92/Untitled.png

다음을 보면 5:feeds 로 변수를 설정하고 그뒤에 l 이나오고 데이터가 나오기 때문에 feeds 의 리스트가 어디 까지인지 확인해 보면 아래와 같다.