달력

52024  이전 다음

  • 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
반응형
제목이 참 거창하다.
확실한 것은 이 제목을 “도시락 스트리밍 파헤치기”라 쓰고 “도시락 음악을 스트리밍으로 다운받아 공짜로 노래를 듣자” 라고 읽는다.

우선 이 글에 들어가기에 앞서, 이 작업은 약 한 달 전에 이루어진 것이며, 그 당시의 조건으로 지금까지 남겨둔 자료를 바탕으로 작성하는 것이다. 따라서 지금은 통하지 않을 수도 있으며, 작업 중 일부를 누락할 수 있음일 미리 알린다.

그럼 시작해보겠다.

1. 들어가기
이제, 뮤즈가 도시락과 통합이 되었다. 그럼 이제 어디에서 음악을 받아야할까? 뭐, 아주 간단하게 도시락으로 가 보자! 내가 가장 마지막으로 도시락을 사용했던 때는 약 4년 전. 그 당시 비기 사이트에서 무료로 도시락 1개월 이용권을 나누어주었다. 그것을 여러 장 구입해 약 1년 간 유료 회원으로 사용했었다. 다만 스트리밍 상품권이었으므로 다운로드에는 큰 무리가 있었다. 그래서 패킷 스니핑을 통해 스트리밍 음원을 다운받아 사용했었다. 4년이 지난 지금, 어떻게 달라져 있을까? 그 때와 비슷한 시스템을 유지하고 있다. 하긴, 이 시스템을 교체하기엔 너무 힘들겠지. 어라? 그런데 그 때처럼 다운이 받아지지는 않는다. 무엇이 문제일까...

2. 시스템 구조 살피기
어차피 구조를 살피는 것이니 스니핑을 쉽게 하기 위해서 URL Snooper를 사용했다. 재생 목록을 결정하고 음악 듣기를 누르기 전에 바로 스니핑 시작을 누르고 음악 듣기를 눌렀다. 그리고 음악이 시작될 때까지 기다리다가 소녀시대의 아름다운(?) 소리가 들리자마자 스니핑을 중단하였다. 그리고 분석.

가장 먼저 살펴본 녀석은 역시 음원 파일. 주소는 다음과 같이 나타났다.
mms://stm.dosirak.com/QP/5/57504097/57504097_192K.wma?mky=00730105-113-0220072-047-076-0520118-07100620107&uno=8381237&cid=57504097&sid=0060200910&Cashtype=

뭔가 심상치않다. Net Transport 를 사용하여 다운로드 시도. 실패한다. 아니, 엄밀히 말하면 일부분만 받아지고 더 이상 받아지지 않는다. 그래서 다시 한 번 스니핑을 해 본다. 아하. 계속 mky 부분이 바뀐다. 그렇다면 그 부분을 얻어오면 된다는 것 아닌가. 이 주소가 가장 처음 나타난 페이지를 찾아본다.

http://www.dosirak.com/Global/CDN/GetStreammingKey.asp?uno=8381237&cid=57504097&sid=0060200910&pv=N&mul=/QP/5/57504097/57504097_192K.wma&NonStreamPrdt=N&Cashtype=

여기다. 찾아 들어가본다. 어라? 공백이다. 내가 놓친 것이 있나? telnet으로 들어가 접속해본다. 역시 안 나온다. 패킷을 분석해본다.

아하, User-Agent가 다르다. Telnet을 이용하여 다시 보내본다. 제대로 응답이 온다.

그런데, uno, cid, sid는 대체 어디서 구하는가. GetStreamingKey.asp를 부르는 페이지를 다시 찾아보았다.
http://www.dosirak.com/DosirakPlayer/MusicService/j_StreamingList.asp?streaminglist=57504097&usepage=asp
여기다.

이 페이지를 한 번 들어가본다. 어라. 로그인을 했을 때만 나온다. 그렇다면 당연히 쿠키가 바뀌었다는 것이다. 그래서 무료 사용자일 때와 유료 사용자일 때의 결과값을 비교해보았다. STREAMING_URL의 pv 부분이 Y, N으로 다르게 나타난다. 아하, Preview의 줄임말이구나. 이렇게 예상하고 한 번 바꾸어 넣어본다. 어라. 유료 사용자일 때는 다르게 나타나지만, 무료 사용자일 때는 똑같이 안 나온다. 결국 유료만 바라는 건가. 아니, 그 전에 이 페이지가 언제 나오는 건지 살펴봐야겠다. 이리저리 조작해본 결과, 곡이 바뀔 때 마다 계속 열린다. 저기에 있는 곡 번호만 바꾸면 되겠구나아.

아니, 어느 순간부터 이건 구조 살피기가 아니라, 자세히 파헤치는 것이 되었다. 대충 구조는 다 나온 것 같으니 제목을 바꾸자.

3. 자세히 파헤치기
여기서는 쿠키 등 자세한 사항을 받아와야 했기 때문에 Packetyzer를 사용했다. 물론 사용법은 복잡하다-_-;; 각자 잘 쓰는 스니퍼가 있다면 알아서 쓰도록.

j_streaming과 getstreamingkey. 이 둘 사이에 무슨 일이 벌어지는가. 일단 쿠키에서 알아보았다. 살펴보니, getstreamingkey에서는 sInfo와 streamToken이 있다. 게다가 무료일 때와 유료일 때를 살펴보았더니, 길이가 다르다-_-;; 분명 두 정보는 Base64로 인코드된 것이니 당연히 길이가 다르다면 정보도 다르다는 것. 혹시 그 정보도 계속 바뀌나 살펴보았다. 계속 바뀐다. 이런 낭패가-_-;; 어라? 그런데 유료 사용자의 쿠키라면 내용이 달라도 여전히 곡 주소가 제대로 나온다. 오키. 그럼 이거 하나만 떼 와서 사용하면 되겠다.

4. 중간 정리
곡 목록에서 곡 번호는 나타난다.
http://www.dosirak.com/DosirakPlayer/MusicService/j_StreamingList.asp?streaminglist=57504097&usepage=asp
위 페이지의 streaminglist에 곡 번호만 바꿔서 페이지를 열어본다.
그리고 쿠키와 pv 값을 유료 사용자인 것처럼 바꿔버리고 GetStreamingKey.asp를 호출한다.
http://www.dosirak.com/Global/CDN/GetStreammingKey.asp?uno=8381237&cid=57504097&sid=0060200910&pv=N&mul=/QP/5/57504097/57504097_192K.wma&NonStreamPrdt=N&Cashtype=
이 페이지에서 음원 주소를 획득한다.
mms://stm.dosirak.com/QP/5/57504097/57504097_192K.wma?mky=00730105-113-0220072-047-076-0520118-07100620107&uno=8381237&cid=57504097&sid=0060200910&Cashtype=
그리고 위 주소로 다운로드를 한다.

끝!

아참, 이건 경험상이지만, mms://보다는 rtsp://가 음악을 더 빠르게 받을 수 있다. 패킷 스니퍼로 확인해보라. mms를 rtsp로 우회해서 스트리밍 받는다.

5. 이제 프로그램으로 제작
내가 DosirakDownload를 만드는 데 무려 2주일이나 걸렸다. 그건 다름아닌 RTSP 녀석 때문에. 기본적으로 .NET Framework는 HTTP나 FTP같은 널리 쓰이는 프로토콜에 대해서는 클래스를 제공해준다. 그러나 RTSP와 같은 프로토콜은 자신이 직접 만들어야한다-_-;;

그 때문에 내가 처음으로 RFC 문서를 읽어보게 되었다.
이것들은 내가 참조한 문서다.

[MS-RTSP].pdf

rfc2326.pdf

rfc3550.pdf


위 문서를 보면서, 그리고 패킷 스니핑을 하면서 열심히 프로그램을 만들었다.

RTSP 프로토콜의 절차는 다음과 같다.

stm.dosirak.com:554 로 접속한다.

DESCRIBE를 통해 ASF 파일의 헤더를 획득한다. 이 헤더는 a=pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,의 뒷 부분을 Base64로 디코딩한 결과 그대로이다. 이 자체를 파일에 출력하면 된다. 물론 파일마다 곡 정보가 누락된 것도 있다. 그 때는 a=pgmpu:data:application/x-wms-contentdesc 부분을 RFC 문서를 보고 분석하면서 넣든지 말던지, 혹은 j_streaming에 앨범 이미지를 포함한 곡의 모든 정보가 들어있으니 이를 분석해서 넣든지 말던지 하라. 나는 그 작업은 힘들어서 포기했다.

이 작업이 끝나면, SETUP을 통해 파일을 스트리밍할 것임을 알려주어라. 이 때 반드시 추가해야할 정보는 다음과 같다. 아니, SETUP 시 어떠한 방법으로 명령을 전달하는지 남겨놓겠다. 내가 이 작업을 하는데 며칠을 소모한 것 같다.


그리고, PLAY를 통해 패킷을 받아라. 이 작업에서 RTP 문서를 참조해야한다. 귀찮으면 함께 첨부해둔 MS-RTSP 문서를 참조하라. 살짝 골치아프다. 뭐가 뭔지 알아야 코딩할 터.
또한 PLAY에 어떤 인자가 들어가야 하는지가 중요하다. 기껏 SETUP까지 해도, 제대로 인자를 넣지 못하면 받을 수가 없다. 역시 이것때문에 며칠 소비했다.

PLAY에서 Speed와 X-Accelerate-Streaming은 중요하다. 그거 제대로 지정 안 해주면... 거북이와 같은 속도로 다운로드 되다가 Timeout 된다.
아차, 이 작업을 깜박했다. SETUP에서 Session이 넘어올 것이다. 그 Session을 PLAY할 때 넘겨주어야 한다.

그럼 이제 RTP 패킷이 계속 넘어올 거다. 이 패킷 분석하는 것도 매우 힘들다-_-;;...
소스코드에 이렇게 남겨놓았다.
                 RTSP Header : 20 byte - Mark:$
                 Other : Data
패킷을 받아오면, RTSP Header에 패킷 크기가 넘어온다. 그건 RFC 문서 혹은 MS-RTSP 문서를 참조하라. 그 크기만큼 패킷을 받아와서 맨 처음을 제외하곤 RTSP 헤더와 함께 파일에 저장하라.

그렇다면 패킷의 끝은 어떻게 아는가? 마지막에는 이와 같은 응답이 나타난다.

그걸 내가 어떻게 알라고? 일단 기본적으로 RTSP 패킷의 맨 첫 글자는 $ 이다. 맨 첫 글자가 $가 아니면 명령임을 알면 된다. 그것도 아니라면 SET가 가장 처음 나타나면 종료하도록 하라.

이것으로 파일 다운로드는 모두 끝이 났다.

6. 정리
처음 해 보는 사람은 몇날 며칠을 허비해야하는 어려운 작업이다-_-;; 그 중 한 사람이었던 나도 매우 힘들었다.

이렇게 도시락을 침투해보는 글 하나를 남겼다. 도시락 관계자가 보면 어떡하나 하는 생각도 든다. 여기에 Muz Downloader 개발기와는 비교도 할 수 없을 만큼 굉장히 자세한 글을 남겼기에 이 글을 참고로 시도해본다면 좋은 결과를 얻을 수 있을 것이다.

참고로 여기에 나타난 사용자 일련번호와 쿠키는 조작해서 올렸다. 그러므로 이 글을 그대로 복사하면 제대로 안 나올 것이다.

이 작업을 따라하다가 도움이 필요하면,,,,,,

안 들어주겠다.

직접 시행착오를 겪으면서 시도해보라.


반응형
Posted by Taekhan
|