ইন্ট্রো
বিশ্লেষণের জন্য শেষ পর্যন্ত স্ট্রিমগুলি থেকে ডেটা স্ক্র্যাপ করা এবং এটির সাথে একটি ডেটাসেট তৈরির প্রত্যাশায় আমি এলওএলটির জন্য দর্শকের সিস্টেমটি ঘুরে বেড়াচ্ছি। আমি বুঝতে পেরেছি যে এরই মধ্যে কয়েকটি বেসরকারি এপিআই এবং কৌশল রয়েছে তবে আমি সত্যিই নির্দিষ্ট গেম ইভেন্টগুলি (চ্যাম্পিয়ন কিলস, ট্যারিট কিলস, আইটেম পুচেসস, জঙ্গল মব কিলস, বিশেষ ইভেন্টগুলির জন্য চ্যাম্পিয়ন কো-অর্ডস ইত্যাদি) খুঁজছি।
আমি এতক্ষণ যা বের করেছিলাম
আপনি যখন কোনও খেলা দেখানো শুরু করেন (এনএ তে), আপনার ক্লায়েন্টটি নিম্নলিখিত হোস্টের সাথে সংযুক্ত রয়েছে:
spectator.na.lol.riotgames.com:8088
আমি ধরে নিই যে এই হোস্টটি অ্যামাজন এডাব্লুএস বা অনুরূপ দ্বারা সমর্থিত। যাইহোক, পরবর্তী যেটি ঘটে তা হ'ল ক্লায়েন্টটি দর্শনীয় সার্ভারে একটি সংস্করণ অনুরোধ প্রেরণ করে:
জিইটি / পর্যবেক্ষক-মোড / বিশ্রাম / গ্রাহক / সংস্করণ
এটি বর্তমান দর্শকের সার্ভার সংস্করণ যাই হোক না কেন ফেরত দেয়। উদা: '1.80.54'
এর পরে, ক্লায়েন্ট গেম মেটাডেটার জন্য একটি অনুরোধ প্রেরণ করে:
জিইটি / পর্যবেক্ষক-মোড / বিশ্রাম / গ্রাহক / গেমমেটাডেটা / এনএ 1 / [গেমিড] / [কিছু কিছু এলোমেলো নন] / টোকেন
এটি গেমটি সম্পর্কে মেটাডেটা ফিরিয়ে দেয়। এই ডেটার একটি উদাহরণ: http://pastebin.com/3N4qs0hx
ক্লায়েন্ট এখন প্যারামিটারগুলি জানে যার মাধ্যমে দর্শনীয় সেশনের অগ্রগতি হওয়া উচিত। এটি কল করে সর্বশেষতম ডেটা অংশ সনাক্ত করার চেষ্টা করে:
GET / পর্যবেক্ষক-মোড / বিশ্রাম / গ্রাহক / getLastChunkInfo / NA1 / [গেমিড] / 30000 / টোকেন
এই ডেটার নমুনা: http://pastebin.com/Cj7dEAr9
একবার ডেটা খণ্ডগুলি চিহ্নিত হয়ে গেলে, তাদের অনুরোধ করা হয়:
জিইটি / পর্যবেক্ষক-মোড / বিশ্রাম / গ্রাহক / গেমডেটাঙ্কাঙ্ক / এনএ 1 / [গেমিড] / [টোকেন #] / টোকেন
একটি টোকেনের ডেটার নমুনা (বাইনারি হেক্সে রূপান্তরিত হয়েছে): HTTP: // পেস্টবিন.কম / জিকিআরপিআরপি 5 জ
রিপ্লে স্ট্রিম থেকে ডেটা উপলভ্য হওয়ার সাথে সাথে getLastChunkInfo এবং getGameDataChunk কল করার মধ্যে গেম চক্র রয়েছে। এখানে একটি কল আসে যা প্রায় 5 টি অংশ অনুসরণ করার পরে নিম্নলিখিতটিতে আসে:
জিইটি / পর্যবেক্ষক-মোড / বিশ্রাম / গ্রাহক / গেটকি ফ্রেম / এনএ 1 / [গেমিড] / [সামচুনকিড] / টোকেন
আমি বিশ্বাস করি যে এই কলটি কেবল পুনরায় খেলতে শুরু করার সময় এবং যখনই ব্যবহারকারী অন্য সময়ের জন্য অনুসন্ধান করে তখনই ঘটে।
আমি জানি গেমটি কোনও স্তরের এনক্রিপশন ব্যবহার করে। কমান্ড লাইনে নির্দিষ্ট প্রকৃত কী সহ আমি এটি ব্লোফিশ ইসিবি হিসাবে বিশ্বাস করি। আমি এই টোকেনগুলি সেশনটির কী ব্যবহার করে ডিক্রিপ্ট করার চেষ্টা করেছি, তবে এগুলি এখনও বেশ এলোমেলো দেখাচ্ছে।
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"); }
সাব_বি 71120 তদন্তের পরে আমি একটি কল পেয়েছি যা শেষ পর্যন্ত মোটামুটি বড় কার্যক্রমে প্রবেশ করে। এই ফাংশনটিতে স্ট্রিং রয়েছে:
- "ভুল শিরোনাম পরীক্ষা"
- "অজানা সংক্ষেপণ পদ্ধতি"
- "অবৈধ উইন্ডো আকার"
এই স্ট্রিংগুলির একটি দ্রুত গুগল অনুসন্ধান নিম্নলিখিত বিষয়গুলি প্রকাশ করে: http://www.opensource.apple.com/source/zlib/zlib-22/zlib/inflate.c
আমি inflate.c পদ্ধতিতে কল করার ঠিক আগে একটি ফাংশন কলের স্ট্রিং রেফারেন্স "1.2.3" পেয়েছি, পাশাপাশি অন্য একটি রেফারেন্স "1.2.3 কপিরাইট 1995-2005 মার্ক অ্যাডলার" স্ফীত করে। এটিকে অবশ্যই স্পষ্ট মনে হচ্ছে যে তারা টোকেনগুলির ডিকম্প্রেশনটির জন্য Zlib সংস্করণ 1.2.3 ব্যবহার করছে। আমি যে ফাইলটি অফসেটে শুরু করব তা নির্বিশেষে আমি তাদের সংক্ষেপণ করতে পারি না।
আমার প্রশ্নগুলো)
কেউ কীভাবে জানেন যে কীভাবে এই 'টোকেনগুলি' ফর্ম্যাট করা যেতে পারে বা যদি এমন কোনও ধরণের সংক্ষেপণ / এনক্রিপশন থাকে যা সম্পর্কে আমি অজানা? আমার সন্দেহ আছে যে এগুলি লাইভ প্লে চলাকালীন ব্যবহৃত ইথারনেট প্যাকেটের কিছু সংকুচিত বা প্যাকড ফর্ম যা কেবল ক্লায়েন্টের অভ্যন্তরীণভাবে খেলে।
বিকল্পভাবে, কেউ কি অন্য কোনও পদ্ধতির কথা ভাবতে পারে যার দ্বারা প্রকৃত গেম ক্লায়েন্টটি চালিয়ে না দিয়ে এই ডেটা স্ক্র্যাপ করে? মনে রাখবেন আমি একই সাথে অনেকগুলি স্ট্রিম থেকে ডেটা ধরতে চাই।