Phân tích Y!M Protocol (Part1)

Giới thiệu chủ đề

Ta đã biết Instance Message là một nguồn thu lợi nhuận khổng lồ trong lĩnh vực Information & Communication Technology (ICT). Bên cạnh đó Yahoo Messenger là chương trình phổ biến ở Việt Nam cũng như trên toàn thế giới.

Bài viết này sẽ tìm hiểu Protocol của Y!M, nhằm phục vụ cho việc thiết kế các chương trình có khả năng tuỳ biến nội dung chat (Ví dụ: Center Tra cứu thông tin, các công cụ tinh chỉnh, ngăn quảng cáo phiền phức, hoặc dựa vào đó để viết ứng dụng trên nền mobile J2ME. …).
Các tài liệu liên quan hiện có từ nguồn Internet đều thuộc dạng “Không chính quy” (Unofficial documentation) do những nhóm người đi đầu trong việc “mổ xẻ” Yahoo biên soạn (Yahoo! chỉ chính thức phát hành các tài liệu cho việc thiết kế plugin đi kèm sản phẩm Y!M của họ). Dĩ nhiên Yahoo không hề mong chờ kiểu tài liệu unofficial này- một điều rất dễ hiểu là các ứng dụng “không chính quy” đã không hiển thị các hợp đồng quảng cáo của Yahoo!Inc, mà còn làm điều ngược lại: tự quảng cáo bằng hình tức tin nhắn quảng bá (spam – broadcast msgs).

image003

YMSG Protocol

Yahoo Messenger Protocol (YMSG) là một Protocol tầng Application chạy trên nền TCP, hoặc HTTP, SOCKS. (Tham khảo thêm các định nghĩa về TCP, HTTP, SOCKS nếu muốn tìm hiểu thêm)

Với YMSG Protocol, Yahoo có 3 kiểu kết nối chính đến server:

- Kết nối trực tiếp (Direct connection)
- Kết nối qua Http
- Kết nối qua Socks (Socks 4, Socks 5)

Chúng ta sẽ tìm hiểu kiểu kết nối trực tiếp (Direct connection) đến server cn.csc.msg.yahoo.com csc.msg.yahoo.com [port 5050] – sẽ trình bày chi tiết ở các phần sau.

Mô hình phân tích & Công cụ:

+ Một máy client sử dụng modem ADSL, default config, nghĩa là kết nối được Internet :)

+ Yahoo Messenger version 8.x (Thời điểm mình bắt đầu thực hiện thì bản mới nhất là 9.0 chỉ đang là thử nghiệm- beta test)

+ Wireshark version 1.0.2 (Dùng để bắt gói tin)

I) GIỚI THIỆU CHUNG

1. YMSG Packet

Qua quá trình capture Y!M packets từ phía client, ta thấy được YMSG luôn có cấu trúc gói tin (Packet) như sau:
[ YMSG || Version || Packet Length || Service || Status || Session ID || Content ]

Trong đó:
YMSG:

Độ dài: 4 bytes (2 words)
Giá trị: Tên của protocol, luôn có ở đầu mọi Packets liên lạc giữa server-client (SC)

Version:

Độ dài: 4 bytes
Giá trị: Chỉ rõ version của giao thức kết nối
Ví dụ: version 15 là: 0×00, 0x0f, 0×00, 0×00 (thường thấy với bản client 8.x) Các bye 00 chỉ là các byte đệm.

Packet Length:

Độ dài: 2 bytes
Giá trị: Chỉ rõ số bytes của section Content gửi đi. Về lý thuyết giá trị tối đa là 0xffff = 65535 (2 bytes long) nhưng thực tế độ dài các gói tin chỉ nhỏ hơn 1000.

Service:

Độ dài: 2 bytes
Giá trị: Nói rõ cho SC biết dịch vụ nào cần được request/respond

Status:

Độ dài: 4 bytes
Giá trị: Chỉ rõ mã trạng thái của dịch vụ đang thực hiện (success/ failure/ ack/ etc..)

Session ID:

Độ dài: 4 bytes
Giá trị: Cho biết mã hiệu của kết nối SC đang thực hiện, giá trị do server khởi tạo, và đôi lúc có sự thay đổi trong 1 phiên làm việc (hiếm gặp), lúc đó client cũng phải thay đổi session ID theo giá trị mới này.
(Giá trị này cho thấy 1 server phục vụ được tối đa 0xff ff ff ff lượt truy cập)

Content

Độ dài: Bằng độ dài được chỉ rõ ở section Packet Length
Giá trị: Đây là một chuỗi các giá trị đi theo cặp như kiểu vertor (key/value). Key có định dạng String, Value có các kí tự thuộc kiểu ASCII, đôi lúc có giá trị là null. VD: 1 == 0×31; 21 == 0×32 0×31;
Các cặp trong trường Content này được phân cách nhau bởi cặp dấu “phẩy” theo chuẩn Yahoo {0×30 0xc080}

Ví dụ 1 đoạn Packet đã Decoded ra mã text (ASCII):

Version: 15

Packet Length: 12

Service: Authentication (87)

Status: Default (0)

Session ID: 0xb9f54600

Content: 1300200viet_vq300200

Kết luận:

+ Tổng độ dài phần header của 1 đoạn Packet luôn là 20bytes

+ Giá trị version luôn là 15 (0x0F) cho Y!M 8.x

  • ViệtQ

Part 1

Part 2

Part 3

3 thoughts on “Phân tích Y!M Protocol (Part1)

  1. Hi, mình cũng đang quan tâm đến các giao thức này, thank bạn nhiều, hãy tiếp tục di bạn ui :)

  2. 25. I was suggested this website by my cousin. I’m not sure whether this post is written by him as no one else know such detailed about my problem. You are amazing! Thanks!

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>