รูปแบบสตรีมผู้ชมของ League of Legends


12

Intro

ฉันเล่นซอกับระบบผู้ชมสำหรับ LoL ด้วยความหวังว่าในที่สุดจะทำการคัดลอกข้อมูลจากสตรีมและสร้างชุดข้อมูลเพื่อทำการวิเคราะห์ ฉันเข้าใจว่ามี API และเทคนิคที่ไม่เป็นทางการอยู่แล้ว แต่ฉันกำลังมองหากิจกรรมเกมที่เฉพาะเจาะจงจริงๆ (การฆ่าแชมป์, การฆ่าป้อมปืน, puchases รายการ, การฆ่าม็อบป่า, การรวมกลุ่มสำหรับเหตุการณ์เฉพาะ ฯลฯ )

สิ่งที่ฉันคิดได้จนถึงตอนนี้

เมื่อคุณเริ่มชมเกม (ใน NA) ไคลเอ็นต์ของคุณเชื่อมต่อกับโฮสต์ต่อไปนี้:

spectator.na.lol.riotgames.com:8088

ฉันคิดว่าโฮสต์นี้ได้รับการสนับสนุนโดย Amazon AWS หรือคล้ายกัน อย่างไรก็ตามสิ่งต่อไปที่เกิดขึ้นคือไคลเอนต์ส่งคำขอรุ่นไปยังเซิร์ฟเวอร์ spectate:

GET / โหมดผู้สังเกตการณ์ / ส่วนที่เหลือ / ผู้บริโภค / รุ่น

สิ่งนี้จะคืนสิ่งที่เวอร์ชันเซิร์ฟเวอร์ผู้ชมปัจจุบันคืออะไร เช่น: '1.80.54'

ถัดไปลูกค้าส่งคำร้องขอข้อมูลเมตาของเกม:

GET / ผู้สังเกตการณ์โหมด / ที่พัก / ผู้บริโภค / getGameMetaData / NA1 / [gameid] / [nonce สุ่มบาง] / โทเค็น

ส่งคืนข้อมูลเมตาเกี่ยวกับเกม ตัวอย่างของข้อมูลนี้: http://pastebin.com/3N4qs0hx

ตอนนี้ไคลเอนต์ทราบพารามิเตอร์ที่เซสชันของเซสชันควรดำเนินการ มันพยายามค้นหาชิ้นข้อมูลล่าสุดโดยโทร:

GET / โหมดผู้สังเกตการณ์ / ที่พัก / ผู้บริโภค / getLastChunkInfo / NA1 / [gameid] / 30000 / โทเค็น

ตัวอย่างของข้อมูลนี้: http://pastebin.com/Cj7dEAr9

เมื่อมีการระบุชิ้นข้อมูลพวกเขาจะถูกร้องขอ:

GET / ผู้สังเกตการณ์โหมด / ที่พัก / ผู้บริโภค / getGameDataChunk / NA1 / [gameid] / [token #] / token

ตัวอย่างข้อมูลโทเค็น (แปลงเป็นฐานสิบหก): http: // pastebin.com / GyqPRP5J

รอบเกมระหว่างการเรียกใช้ getLastChunkInfo และ getGameDataChunk เมื่อข้อมูลพร้อมใช้งานจากสตรีมการเล่นซ้ำ นอกจากนี้ยังมีการโทรที่เกิดขึ้นหลังจากจับชิ้นงานได้ประมาณ 5 ชิ้นต่อไปนี้:

GET / ผู้สังเกตการณ์โหมด / ที่พัก / ผู้บริโภค / getKeyFrame / NA1 / [gameid] / [somechunkid] / โทเค็น

ฉันเชื่อว่าการโทรนี้จะเกิดขึ้นเมื่อเริ่มเล่นซ้ำและเมื่อใดก็ตามที่ผู้ใช้ค้นหาเวลาอื่น

ฉันรู้ว่าเกมใช้การเข้ารหัสในบางระดับ ฉันเชื่อว่าเป็น Blowfish ECB พร้อมกับคีย์จริงที่ระบุในบรรทัดคำสั่ง ฉันได้พยายามถอดรหัสโทเค็นเหล่านี้โดยใช้คีย์ของเซสชันแล้ว แต่ก็ยังดูสุ่มอยู่

แก้ไข 3/23/2013

  • ฉันได้พิจารณาแล้วว่าโทเค็นส่วนใหญ่ไม่ได้เข้ารหัสโดยการแก้ไขอาร์กิวเมนต์บรรทัดคำสั่งที่มีคีย์และเปิดตัวเกมใหม่จากดีบักเกอร์ (โหลดรีเพลย์อย่างถูกต้อง)
  • โทเค็นดูเหมือนจะถูกบีบอัด มีการเรียกรูทีนย่อยซึ่งหากส่งคืนจำนวนเต็มที่ไม่ใช่ศูนย์จะทริกเกอร์สิ่งต่อไปนี้:

    if ( sub_B71120(v21, v15, (int *)&Size, *(_DWORD *)(v6 + 108)) )
    {
    sub_BAD700(
    (int)"!\"Error Decompressing data chunk.\"",
    (int)"D:\\jenkins\\workspace\\Code-CI-Releases-Public\\code\\HeroWars_clientServer\\Sources\\ReplaySystem\\ReplayServerConnection.cpp",
    6,
    (int)"Riot::Replay::ReplayServerConnection::GetChunk",
    (int)"Assert occurred, game may crash.");
    sub_9BB750("ReplayServerConnection GetChunk error. Error decompressing chunk data. Error: %d\n");
    }
  • เมื่อตรวจสอบ sub_B71120 ฉันได้พบสายที่ในที่สุดก็เข้าสู่ฟังก์ชั่นที่มีขนาดใหญ่พอสมควร ฟังก์ชั่นนี้มีสตริงเช่น:

    • "ตรวจสอบส่วนหัวไม่ถูกต้อง"
    • "วิธีการบีบอัดที่ไม่รู้จัก"
    • "ขนาดหน้าต่างไม่ถูกต้อง"
  • การค้นหาสตริงอย่างรวดเร็วของ Google จะแสดงรายการต่อไปนี้: http://www.opensource.apple.com/source/zlib/zlib-22/zlib/inflate.c

  • ฉันยังได้พบการอ้างอิงสตริง "1.2.3" ในการเรียกใช้ฟังก์ชันก่อนการเรียกไปยังวิธี inflate.c เช่นเดียวกับการอ้างอิงอื่น "ขยาย 1.2.3 ลิขสิทธิ์ 1995-2005 Mark Adler" ดูเหมือนว่าพวกเขากำลังใช้ Zlib เวอร์ชั่น 1.2.3 สำหรับการบีบอัดโทเค็น ฉันไม่สามารถให้พวกมันขยายขนาดไฟล์ได้โดยไม่คำนึงว่าไฟล์ออฟเซ็ตใดที่ฉันเริ่ม

คำถามของฉัน

ไม่มีใครรู้ว่า 'โทเค็น' เหล่านี้อาจจัดรูปแบบอย่างไรหรือหากมีการบีบอัด / เข้ารหัสบางประเภทที่ฉันไม่รู้จัก? ฉันสงสัยว่ามันเป็นแพ็คเก็ตอีเธอร์เน็ตที่ถูกบีบอัดหรือบีบอัดที่ใช้ในระหว่างการเล่นสดซึ่งมีการเล่นภายในเพื่อลูกค้า

ทุกคนสามารถคิดวิธีอื่นที่จะขูดข้อมูลนี้โดยไม่เรียกใช้ไคลเอนต์เกมจริง โปรดทราบว่าฉันต้องการดึงข้อมูลจากสตรีมจำนวนมากพร้อมกัน


1
วิธีที่ฉันคิดว่าจะทำคือหยิบไฟล์รีเพลย์จาก LOLReplay ให้ได้มากที่สุดและบีบอัดไฟล์เหล่านั้น นั่นคือฉันคิดว่าไฟล์เก็บถาวรแบบเปิดที่ผู้คนสามารถอัปโหลดเกมของตัวเองและฉันคิดว่าโหมดผู้ชมใหม่ให้ลูกค้า Replay คว้าข้อมูลได้มากกว่าที่เคยเป็นมา
Robert S.

มี API และเทคนิคอื่นใดอีกบ้าง ทำไมคุณถึงคิดว่ามีการเข้ารหัส? ฉันพบสิ่งนี้ใน GetGameMetaData: "encryptionKey": "" และ "decodedEncryptionKey": ""
Nathan Goings

ในฐานะที่เป็น FYI สำหรับผู้ที่เชื่อมโยงไปถึงคำถามนี้จากฟอรัม LoL ต่างๆเห็นชื่อของฉันในโพสต์ภายใต้ "แก้ไขโดย" และส่งอีเมลถึงฉันเพื่อถามเกี่ยวกับหัวข้อ ... ฉันไม่รู้อะไรเกี่ยวกับ LoL หรือ รูปแบบของสตรีม โปรดอย่าส่งอีเมลถึงฉันเกี่ยวกับเรื่องนี้

คำตอบ:


4

ฉันค้นคว้าสิ่งเดียวกันและพบว่าrepo นี้มีประโยชน์อย่างยิ่ง ไฟล์ decrypt.rb ถอดรหัสทั้งชิ้นและคีย์เฟรม

แก้ไข: ตรวจสอบกระทู้นี้ Redditเกินไป


ยอดเยี่ยม ลิงค์แรกตอบคำถามของฉันอย่างแม่นยำ ลิงค์ที่สองก็มีประโยชน์จริงๆ ขอบคุณตัน!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.