Zoals we allemaal weten, gebruikte Tencent Activex om QQ fast login te implementeren, via een onbekende browser, en het eerste wat werd gedaan was het installeren van de QuickLogin-controle.
Net als ik niet weet wanneer, heeft de snelle login ineens geen bediening meer nodig.
Op dat moment was ik erg verbaasd: welke vreemde methode gebruikte Tencent om met lokale applicaties te interageren?
Zonder plugins zouden webpagina's niet direct met lokale applicaties moeten kunnen communiceren (tenzij er een protocol is gedefinieerd, maar alleen kan worden opgeroepen en niet de resultaten die door het programma worden geleverd).
Toevallig (nou ja, gewoon verveeld door in Taakbeheer te kijken en de native httpd te ontdekken, en Apache draaiende te vinden), realiseerde ik me ineens een mogelijkheid: als QQ een lokale poort opent, een webserver maakt, dat wil zeggen een TCP-server die voldoet aan het HTTP-protocol, en dan doet de webpagina ajax een verzoek aan die QQ (op dit moment als webserver), kun je dan het resultaat krijgen?
En dat is eigenlijk het resultaat.
Web JS start een GET-verzoek naar http://localhost.ptlogin2.qq.com (poorten van 4300-4308, één voor één naar succes).
Als je pingt, zie je dat het 127.0.0.1 is, en als je de poort controleert, is het inderdaad QQ in gebruik.
Eerste verzoek: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk van cookies, wat het ook is; r is een willekeurig getal
Het resultaat dat wordt teruggegeven is een JSON-array:
var var_sso_uin_list=[{"account":"Inlogd QQ account","face_index":-1,"gender":0,"nickname":"Your QQ nickname","uin":"Still your QQ account","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Gebruik vervolgens http://ptlogin2.qq.com/getface om QQ-avatars te krijgen, waar hier niet over gesproken zal worden
Op deze manier kunnen je QQ-informatie op de webpagina worden weergegeven.
Wanneer je op je avatar drukt (wanneer je deze login selecteert)
De volgende verzoeken worden gegenereerd:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Evenzo is r een willekeurig getal, pt_local_tk afkomstig is van een koekje, local_token
Wat doet dit verzoek?
Nou, Set-Cookie.
Ga dan verder met het verzoek
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
De enige U1 hier is het bestemmingsadres
Dit verzoek geeft alle cookies terug die je nodig hebt en je bent ingelogd.
Dus na het leren van het protocol werd een serieus probleem ontdekt: wat gebeurt er als een (zwart-hartig) programma deze dingen namens de gebruiker doet?
Begin nu!
Ik had alleen een Mac bij de hand, dus schreef ik het in Obj-C.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" kop:nul];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Opmerking: Vanwege mijn eerdere ervaring met QQ-bots (gebaseerd op het WebQQ-protocol): de Referer-header is erg belangrijk (het moet een .qq.com domeinnaam zijn), en zodra deze verkeerd is, zal hij zeker falen. Dus hier zijn er geen rotondes
Trouwens, ik was toen nieuw bij Obj-C, en sommige code lijkt misschien wat onzinnig, vergeef me alsjeblieft.
//cookiedata是个NSDictionary
Op deze manier wordt de login voltooid, kun je een QQ-ruimteinterface vinden (hier niet geplaatst), en is het bericht succesvol.
Wat betekent dit? Dit betekent dat zolang het een programma lokaal draait, er een kans is om in plaats van jou in te loggen met QQ, en om stiekeme handelingen uit te voeren op platforms zoals QQ space die geen secundaire authenticatie vereisen
|