Як усім відомо, Tencent використовувала Activex для реалізації швидкого входу QQ, застосовуючи його в незнайомому браузері, і першим кроком було встановити контроль QuickLogin.
Щойно я не знаю коли, швидкий вхід раптом перестає потребувати керування.
Тоді я був дуже здивований, який дивний метод використовував Tencent для взаємодії з локальними додатками?
Без плагінів веб-сторінки не повинні безпосередньо взаємодіяти з локальними додатками (якщо не визначено протокол, який може бути викликаний лише за результатами, які надає програма).
Випадково (ну, просто нудно дивитися в диспетчер завдань, знаходити нативний httpd і знаходити Apache запущеним), я раптом зрозумів можливість: якщо QQ відкриває локальний порт, створює веб-сервер, тобто TCP-сервер, що відповідає протоколу HTTP, а веб-сторінка ajax робить запит до цього QQ (на той момент як веб-сервер), чи можна отримати результат?
І це справді результат.
Web JS ініціює GET-запит на http://localhost.ptlogin2.qq.com (порти з 4300-4308, один за одним для успіху).
Пінг показує, що це 127.0.0.1, і коли ви перевіряєте порт, це дійсно QQ у використанні.
Перший запит: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk з печива, що б це не було; r — випадкове число
Отриманий результат — масив JSON:
var var_sso_uin_list=[{"account":"Увійшов у QQ account","face_index":-1,"gender":0,"nickname":"Ваш нікнейм QQ","uin":"Все ще ваш акаунт QQ","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Потім використовуйте http://ptlogin2.qq.com/getface, щоб отримати аватари QQ, про що тут не говоритиму
Таким чином, ваша інформація про QQ може відображатися на веб-сторінці.
Коли ви натискаєте аватар (коли обираєте цей логін)
Генеруються такі запити:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Аналогічно, r — це випадкове число, pt_local_tk походить із печива, local_token
Що робить цей запит?
Ну, Сет-Кукі.
Потім продовжуйте виконати запит
http://ptlogin2.qq.com/jump?clientuin=你的QQ号&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
Єдина U1 тут — адреса призначення
Цей запит поверне всі потрібні вам файли cookie, і ви увійдете в систему.
Отже, після вивчення протоколу було виявлено серйозну проблему: що станеться, якщо (чорнодушна) програма робить це від імені користувача?
Починайте вже зараз!
У мене був лише Mac під рукою, тому я писав його в Obj-C.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" header:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Примітка: Завдяки моєму попередньому досвіду роботи з ботами QQ (на основі протоколу WebQQ): заголовок Referer дуже важливий (це має бути доменне ім'я .qq.com), якщо він помиляється, він точно вийде з ладу. Отже, тут немає кільцевих розв'язок
До речі, я тоді був новачком в Obj-C, і деякі частини коду можуть здатися трохи дивними, будь ласка, вибачте мене.
//cookiedata是个NSDictionary
Таким чином, вхід завершено, і ви можете знайти інтерфейс QQ space (не опублікований тут), і пост успішний.
Що це означає? Це означає, що якщо це локальна програма, є шанс завершити QQ-ухід замість вас і виконати деякі приховані операції на платформах, таких як QQ-space, які не потребують вторинної автентифікації
|