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 สำหรับการบีบอัดโทเค็น ฉันไม่สามารถให้พวกมันขยายขนาดไฟล์ได้โดยไม่คำนึงว่าไฟล์ออฟเซ็ตใดที่ฉันเริ่ม
คำถามของฉัน
ไม่มีใครรู้ว่า 'โทเค็น' เหล่านี้อาจจัดรูปแบบอย่างไรหรือหากมีการบีบอัด / เข้ารหัสบางประเภทที่ฉันไม่รู้จัก? ฉันสงสัยว่ามันเป็นแพ็คเก็ตอีเธอร์เน็ตที่ถูกบีบอัดหรือบีบอัดที่ใช้ในระหว่างการเล่นสดซึ่งมีการเล่นภายในเพื่อลูกค้า
ทุกคนสามารถคิดวิธีอื่นที่จะขูดข้อมูลนี้โดยไม่เรียกใช้ไคลเอนต์เกมจริง โปรดทราบว่าฉันต้องการดึงข้อมูลจากสตรีมจำนวนมากพร้อมกัน