Som vi alle vet, brukte Tencent Activex for å implementere QQ fast login, i en ukjent nettleser, og det første som ble gjort var å installere QuickLogin-kontrollen.
Akkurat når jeg ikke vet når, trenger plutselig ikke hurtigpålogging kontrollene lenger.
På den tiden var jeg veldig forvirret, hvilken merkelig metode brukte Tencent for å samhandle med lokale applikasjoner?
Uten plugins skal nettsider ikke kunne samhandle direkte med lokale applikasjoner (med mindre en protokoll er definert, men det kan bare åpnes og ikke resultatene som vises av programmet).
Ved en tilfeldighet (vel, bare lei meg av å se på oppgavebehandleren og oppdage den native httpd-en, og finne Apache kjørende), innså jeg plutselig en mulighet: hvis QQ åpner en lokal port, lager en webserver, altså en TCP-server som følger HTTP-protokollen, og så sender nettsidens ajax en forespørsel til den QQ (på dette tidspunktet som webserver), kan du få resultatet?
Og det er egentlig resultatet.
Web JS initierer en GET-forespørsel til http://localhost.ptlogin2.qq.com (porter fra 4300-4308, én etter én til suksess).
Ping vil finne at det er 127.0.0.1, og når du sjekker porten, er det faktisk QQ i bruk.
Første forespørsel: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk fra kjeks, hva det enn er; r er et tilfeldig tall
Resultatet som returneres er et JSON-array:
var var_sso_uin_list=[{"account":"Logget inn QQ-konto","face_index":-1,"gender":0,"kallenavn":"Ditt QQ-kallenavn","uin":"Fortsatt din QQ-konto","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Bruk deretter http://ptlogin2.qq.com/getface for å få QQ-avatarer, som ikke vil bli diskutert her
På denne måten kan QQ-informasjonen din vises på nettsiden.
Når du trykker på avataren din (når du velger denne innloggingen)
Følgende forespørsler genereres:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
På samme måte er r et tilfeldig tall, pt_local_tk kommer fra en kjeks, local_token
Hva gjør denne forespørselen?
Vel, Set-Cookie.
Gå deretter videre med forespørselen
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
Den eneste U1 her er destinasjonsadressen
Denne forespørselen vil returnere alle informasjonskapsler du trenger, og du er logget inn.
Så etter å ha lært protokollen, ble et alvorlig problem oppdaget: hva skjer hvis et (svart-hjertet) program gjør disse tingene på vegne av brukeren?
Kom i gang nå!
Jeg hadde bare en Mac tilgjengelig, så jeg skrev det i 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网页上的数据
Merk: På grunn av min tidligere erfaring med QQ-boter (basert på WebQQ-protokollen): Referer-headeren er veldig viktig (det må være et .qq.com-domenenavn), og når den er feil, vil den definitivt feile. Så det finnes ingen rundkjøringer her
Forresten, jeg var ny på Obj-C på den tiden, og noe av koden kan virke litt tullete, vær så snill å tilgi meg.
//cookiedata是个NSDictionary
På denne måten er innloggingen fullført, og du kan finne et QQ-romgrensesnitt (ikke postet her), og innlegget er vellykket.
Hva betyr dette? Dette betyr at så lenge det er et program som kjører lokalt, er det en sjanse for å fullføre QQ-pålogging i stedet for deg, og gjøre noen lure operasjoner på plattformer som QQ Space som ikke krever sekundær autentisering
|