[App 개발] MSN 메신저 프로토콜
본문
------------------------------------------------------------------------------------
MSN 메신저 프로토콜
MSN 을 써 보시면서 이것이 어떤 원리로 동작되는지 궁금하셨을 것입니다. 저는 이 글에서 MSN 이 어떻게 움직이는지 뿐만 아니라 어떻게 여러분 자신만의 MSN 메신저를 만들 수 있는지도 알려드리고자 합니다.
MSN 메신저의 동작은 크게 두 가지 경우로 나눌 수 있습니다.
? 로그인 단계
? 메세지 전달 단계
로그인 단계에서는 MSN 메신저 서버의 로그인과 친구 리스트를 받아내는 과정입니다. 메세지 전달 단계는 인스턴트 메세징 전송/수신 요구의 접수와 실제 메세지 전송/수신으로 나누어집니다.
MSN 메신저 프로토콜은 ASCII 기반 프로토콜입니다. 말하자면 완전 영어로 구성된 명령어들입니다. 첫 번째 단계는 MSN 메신저 서버로의 접속입니다. 우리는 먼저 서버 64.4.13.58:1863 (MSN 메신저는 포트 1863으로 움직입니다) 으로 접속해야 합니다.
접속이 완료되면 그 다음 로그인 과정으로 넘어갑니다. 첫 번째 과정은 버젼 검사입니다. 여기서는 클라이언트 (여러분의 프로그램) 가 지원하는 버젼을 서버로 전송한 다음 서버로부터의 응답을 기다립니다.
VER 0 MSNP7 MSNP6 MSNP5 MSNP4 CVRO
MSN 메신저 프로토콜의 모든 명령과 함께 “trial id”가 함께 전송됩니다. Trial id 는 0부터 시작해서 서버가 클라이언트의 명령을 성공적으로 응답할 때마다 증가하게 됩니다.위의 명령에 따라 서버는 다음과 같이 응답하게 됩니다.
VER 0 MSNP7 MSNP6 MSNP5 MSNP4
클라이언트와 서버가 서로 교신할 프로토콜 버젼을 맞추게 됩니다.
다음으로 클라이언트가 서버에 로그인에 필요한 보안 패키지의 이름을 요구하게 됩니다.
INF 1
야후 등의 메신저와는 달리 MSN 은 패스워드를 그대로 전송하지 않고 암호화를 가하여, 누군가 포트를 모니터링하면서 패스워드가 들통나지 않도록 합니다.
서버는 다음과 같이 반응하게 됩니다.
INF 1 MD5
여기서 MD5 는 서버가 현재 지원하는 보안 패키지의 이름입니다. (Message Digest ver. 5 라는 뜻이겠지요? 역자주)
그 다음으로 클라이언트는 userid 를 서버에 전송합니다.
USR 2 MD5 I venky_dude@hotmail.com
서버는 로그인하려는 사용자의 관련 정보가 있는지를 검사하며, 만약 정보가 없다면 다음과 같은 메세지를 반송합니다.
XFR 2 NS 64.4.13.55:1863 0
이 메세지는 클라이언트가 Notification Server(NS) 주소 64.4.13.55 포트 1863 으로 접속하라는 뜻입니다. 현재 접속을 끊고 동일한 과정을 새 서버 64.4.13.55 에 접속하여 반복하게 됩니다.
(클라이언트) VER 3 MSNP7 MSNP6 MSNP5 MSNP4 CVRO
(서버) VER 3 MSNP7 MSNPP6 MSNP5 MSNP4
(클라이언트) INF 4
(서버) INF 4 MD5
(클라이언트) USR 5 MD5 I venky_dude@hotmail.com
이번에는 서버에 로그인할 사용자 관련 정보가 담겨 있습니다. 서버는 다음과 같이 응답합니다.
USR 5 MD5 S 989048851.1851137130
서버로부터 전송된 문자열은 “MD5 해쉬” 입니다. 이것은 서버로부터 생성된 해쉬로서 사용자 인증 과정에 사용됩니다. 이제 클라이언트는 MD5 암호화 기법을 이용하여 패스워드를 전송해야 합니다. 실제적으로 클라이언트는 MD5 해쉬를 이용한 고유한 MD5 equivalent 를 전송합니다. 예를 들어 패스워드와 MD5 해쉬 989048851.1851137130 을 조합한 MD5 equivalent 3b7926d277068ec49576a0c40598ff21 을 전송하게 됩니다.
USR 6 MD5 S 3b7926d277068ec49576a0c40598ff21
패스워드가 정확하다면 서버는 다음과 같이 응답합니다.
USR 6 OK venky_dude@hotmail.com venkat
여기서 마지막 문자열은 유저가 사용하는 닉네임입니다.
새 프로토콜 (MSNP7) 에서는 서버가 유저의 일반 정보와 함께 여러 가지 작업에 사용되는 쿠키와 같은 종류의 인증 코드를 함께 전송합니다.
MSG Hotmai Hotmail 362
MIME-Version: 1.0
Content-Type: text/x-msmsgspro file; charset=UT
LoginTime: 1011252477
EmailEnabled: 1
MemberIdHigh: 84736
MemberIdLow: - 1434729391
lang _preference: 103
preferredEmai l: venky_dude@hotmail.com
country: IN
PostalCode:
Gender: M
Kid:0
Age: 22
sid: 517
kv: 2
MSPAuth: 2AAAAAAAADU0p4uxxxJtDJozJSlUTS0i7YpwnC9PUHRv56YKxxxCTWmg$$
서버에 접속은 하긴 했지만 아직 상태는 오프라인입니다. 이제 우리는 현재 상태를 online 으로 바꾸어 메세지를 전송할 수 있도록 합니다. 클라이언트에서 다음과 같은 메세지를 전송합니다.
CHG 7 NLN
서버는 현재 여러 상태로 온라인중인 친구들의 이름을 전송합니다.
CHG 7 NLN
ILN 7 NLN btxxxe@hotmail.com nick
ILN 7 AWY wmpyxxx@msn.com mike
ILN 7 BSY tehpxxpxx@hotmail.com yeaxxx
MSG Hotmail Hotmail 223
MIME-Version: 1.0
Content-Type: text/x-msmsgsinitialemailnotification; charset=UTF-8
Inbox-Unread: 293
Folders-Unread: 0
Inbox-URL: /cgi-bin/HoTMaiL
Folders-URL: /cgi-bin/folders
Post-URL: http://www.hotmail.com
서버로 전송하는 다음 명령에는 현재 사용하고 있는 클라이언트의 버젼을 함께 보냅니다. 여기에는 현재 버젼 번호와 함께 사용하는 컴퓨터와 OS, build 정보를 포함합니다.
CVR 8 0x0409 win 4.10 i386 MSMSGS 4.5.0127 MSMSGS
0x0409 win 4.10.i386 은 클라이언트가 인텔 프로세서와 win98 에서 움직이고 있다는 뜻이며, MSMSGS 4.5.0127 MSMSGS 는 현재 버젼과 msmsgs.exe 의 빌드 넘버 (기본적으로 MSN 메신저의 버젼 번호) 입니다.
서버는 최신 버젼을 다운로드할 수 있는 url 과 함께 기타 정보를 전송합니다.
CVR 8 4.5.0127 4.5.0127 1.0.0863 http://download.microsoft.com/download/msnmessenger/install/4.5/win98me/en-us/mmssetup.exe http://messenger.microsoft.com
CVR 명령을 반드시 보낼 필요는 없습니다. 명령을 보내지 않더라도 메신저 프로토콜은 정상적으로 동작합니다.
친구 목록에 등록된 모든 사람들의 이름을 얻기 위해서 다음의 명령을 사용합니다.
LST 9 RL
이 명령은 서버로부터 reverse list 를 얻어낼 수 있습니다. 리버스 리스트는 온라인 상태에서 메세지를 보낼 수 있는 사람들의 리스트입니다. 그 외에 forward list 를 LST 9 FL 명령으로 얻을 수도 있습니다. 포워드 리스트는 his/her list 에 등록한 모든 사람들의 이름을 포함하는 리스트입니다.
서버에서 전송되는 메세지는 이런 식입니다.
LST 9 RL 69 1 19 venky_dude@hotmail.com venkat
LST 9 RL 69 2 19 puxxxxx@hotmail.com PUJA
LST 9 RL 69 3 19 vancxxxxx@hotmail.com ramachandran
LST 9 RL 69 4 19 moxxxxx@hotmail.com chandramouli
LST 9 RL 69 5 19 v_n_xxxxx@hotmail.com Narayanaswamy
LST 9 RL 69 6 19 dexxxxx@hotmail.com Venkatesh
LST 9 RL 69 7 19 lousydxxxxx@hotmail.com deepika%20kalyani%20Vairam
LST 9 RL 69 8 19 hexxxxxr@hotmail.com Hetchar%20Ramachandran
LST 9 RL 69 9 19 ambxxxxx@hotmail.com Aiyer
LST 9 RL 69 10 19 suxxx@hotmail.com Ganesh
LST 9 RL 69 11 19 deexxxxx@hotmail.com Deepak
LST 9 RL 69 12 19 anilxxxxx@hotmail.com anil
LST 9 RL 69 13 19 dixxxxx@hotmail.com <Diamond>
LST 9 RL 69 14 19 nvxxxx@hotmail.com giri
LST 9 RL 69 15 19 shxxx@hotmail.com Hari
LST 9 RL 69 16 19 radhikashuxxxxx@hotmail.com radhika
LST 9 RL 69 17 19 eskaxxxxx@hotmail.com kannan
LST 9 RL 69 18 19 shaxxxxx@hotmail.com Shankar
LST 9 RL 69 19 19 puneetagarxxxxx@hotmail.com puneet
친구가 온라인 상태가 되면 서버 (NS)는 다음과 같은 메세지를 전송합니다.
NLN 10NLN deaxxxx@hotmail.com Venkatesh
그리고 친구가 오프라인이 되면 서버는 다음의 메세지를 전송합니다.
FLN 10 FLN deaxxxx@hotmail.com
MSNP7 프로토콜에서 MSN 은 새로운 챌린지 인증 구조를 채용하였습니다. 세션을 계속 유지하기 위해서는 MSN 서버가 보내는 챌린지 키를 이용하여 사용자가 인증을 하여야 합니다.
CHL 0 20881396011366812350
클라이언트는 위의 MD5 해쉬와 함께 문자열 “Q1P7W2E4J9R8U3S5” 를 결합한 MD5 equivalent 를 서버에 전송하여야 합니다. 따라서 MD5string(20881396011366812350Q1P7W2E4J9R8U3S5 ) 의 결과로 나오는 MD5 equivalent 를 서버에 전송합니다.
클라이언트의 응답은 다음과 같이 됩니다.
QRY 18 msmsgs@msnmsgr.com 32
0212eaad0876afb8505859ca75d21a78
여기서 18은 trial id 입니다. 여러분의 프로그램에서는 적절한 trial id 로 바꿔넣어 주어야 합니다.
인증이 정확하다면 서버에서는 다음과 같은 메세지를 보냅니다.
QRY 18
이제 우리는 MSN 메신저 서버에 성공적으로 접속하였습니다. 다음은 인스턴트 메세징 과정입니다.
MSN 메신저의 인스턴트 메세징은 세션 기반입니다. 대화를 시작하려는 사람들은 모두 세션 모드로 되어야 합니다. 유저와 챗 세션을 시작할 수 없으면 메세지를 주고받을 수 없습니다.
유저가 챗 세션 상태가 되는 것은 두 가지 경우가 있습니다.
? 유저가 다른쪽 유저에게 챗 세션 요구를 보내는 경우
? 상대방 유저로부터 챗 세션 요구를 받는 경우
유저가 챗 세션 요구를 보내는 경우
클라이언트(유저) 는 서버에게 스위치보드(SB) 서버의 주소를 요구합니다. 모든 인스턴트 메세징 대화는 스위칭보드 서버를 통해서 이루어집니다.
XFR 9 SB
서버는 스위칭보드 서버의 주소와 접속할 수 있는 포트번호, 그리고 CKI 해쉬를 함께 보내옵니다. CKI 는 보안 패키지이며 클라이언트는 이 해쉬를 이용하여 스위치보드 서버에 접속해야 합니다.
XFR 9 SB 64.4.13.88:1863 CKI 989487642.2070896604
이제 스위칭보드 서버와 새로운 접속을 시도해야 합니다. MSN 메신저 서버와의 접속은 계속 유지하고 있어야 합니다. 만약 그 접속이 끊어지게 되면 우리는 로그아웃 상태가 됩니다.
스위칭보드 서버와 접속하고 나면 다음과 같은 메세지를 스위칭보드 서버에 전송합니다.
USR 1 venky_dude@hotmail.com 989487642.2070896604
만약 전송받은 CKI 해쉬가 정확하다면 스위칭보드 서버는 다음과 같이 응답합니다.
USR 1 OK venky_dude@hotmail.com venkat
위의 작업이 끝나면 유저는 다른 유저를 다음과 같은 명령으로 챗 세션으로 불러냅니다.
CAL 2 deadxxx@hotmail.com
서버는 다른 유저에게 보낸 것과 동일한 세션 아이디를 보내옵니다.
CAL 2 RINGING 11717653
상대방 유저가 반응하고 나서 챗을 할 준비가 되면 서버는 다음과 같은 명령을 보내옵니다.
JOI deadlee@hotmail.com Venkatesh
이것은 상대 유저가 대화에 참여했으며 메세지를 주고받을 준비가 되었음을 뜻합니다.
유저가 챗 세션 요구를 받는 경우
우리가 다른 유저로부터 챗 세션 요구를 받았을 경우 서버(NS)는 다음과 같은 메세지를 전송합니다.
RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 deaxxxx@hotmail.com Venkatesh
여기서 서버(NS)는 세션 아이디, 스위치보드 서버의 IP 주소, 접속할 포트 번호, CKI 해쉬, 그리고 대화를 시작하려는 사람의 이름을 전송합니다.
이제 스위치보드 서버와 접속을 시도해야 합니다. MSN 메신저 서버와의 접속은 그대로 유지해야 합니다. 만약 접속이 끊어지면 우리는 로그아웃 상태가 됩니다.
스위치보드 서버와 접속한 후 다음과 같은 명령을 보냅니다.
ANS 1 venky_dude@hotmail.com 989495494.750408580 11742066
여기서 로그인 이름, 전송되었던 CKI 해쉬, 그리고 전송되었던 세션 아이디를 보냅니다.
서버는 다음과 같이 응답합니다.
IRO 1 1 1 deaxxxx@hotmail.com Venkatesh
그리고
ANS 1 OK
이제 메세지를 주고받을 준비가 되었습니다.
메세지 전송을 알아보기 전에 먼저 메세지가 어떻게 완성되는지 보겠습니다.
메세지를 전송할 때 다음과 같은 방법으로 헤더를 만듭니다.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22
메세지를 보낼 때에는 다음과 같은 방법으로 보냅니다.
MSG 2 N 137
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22
hello
여기서 2는 trial id 로서 메세지를 보낼 때마다 하나씩 증가합니다. 137 은 메세지의 총 길이로서, 헤더와 실제 전송하는 메세지, 여기서는 ‘hello’ 를 포함한 길이입니다.
메세지를 받는 과정도 대동소이합니다.
다음은 수신된 메세지의 예입니다.
MSG deaxxxx@hotmail.com Venkatesh 137
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22
hello
상대 유저가 타이핑을 할 때에는 다음과 같은 메세지를 받게 됩니다.
MSG deaxxxx@hotmail.com Venkatesh 100
MIME-Version: 1.0
Content-Type: text/x-msmsgscontrol
TypingUser: deaxxxx@hotmail.com
참고자료:
다음 사이트에서 더 자세한 내용을 볼 수 있습니다.
이곳은 마이크로소프트에서 발행된 원본 프로토콜입니다.
http://www.tlsecurity.net/Textware/Misc/draft-movva-msn-messenger-protocol-00.txt
이곳은 MD5 홈페이지로서 MD5 암호화 기법의 프로그램 코드를 얻을 수 있습니다.
http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html
최신글이 없습니다.
최신글이 없습니다.
댓글목록 1
장재균님의 댓글
다음 이나 네이트온도 거의 비슷한 프로토콜을 사용하죠 ^^