Както всички знаем, Tencent използваше Activex за реализиране на QQ fast login, използвайки го в непознат браузър, и първото нещо, което трябваше да направи, беше да инсталира контрола QuickLogin.
Точно когато не знам кога, бързото влизане изведнъж вече не се нуждае от контролите.
Тогава бях много озадачен какъв странен метод използва Tencent за взаимодействие с локални приложения?
Без плъгини, уеб страниците не би трябвало да могат да взаимодействат директно с локални приложения (освен ако не е дефиниран протокол, който може да бъде извикан само и не и резултатите, предоставени от програмата).
Случайно (просто ми беше скучно да гледам диспечера на задачите, да открия нативния httpd и да намеря Apache работещ), изведнъж осъзнах една възможност: ако QQ отвори локален порт, създаде уеб сървър, тоест TCP сървър, който отговаря на HTTP протокола, и тогава уеб страницата ajax направи заявка към този QQ (в момента като уеб сървър), може ли да се получи резултатът?
И това наистина е резултатът.
Web JS инициира GET заявка към http://localhost.ptlogin2.qq.com (портове от 4300 до 4308, един по един за успех).
Ping-ът ще види, че е 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 акаунта","face_index":-1,"gender":0,"прякор":"Вашият 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 тук е адресът на дестинацията
Тази заявка ще върне всички необходими бисквитки и ще влезете в системата.
След като научи протокола, беше открит сериозен проблем: какво се случва, ако (черносърдечна) програма направи тези неща от името на потребителя?
Започнете сега!
Имах само 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 интерфейс (който не е публикуван тук), а публикацията е успешна.
Какво означава това? Това означава, че докато програмата работи локално, има шанс да завършиш QQ вход вместо теб и да извършиш някои тайни операции на платформи като QQ пространство, които не изискват вторична автентикация
|