Jak wszyscy wiemy, Tencent użył Activex do implementacji szybkiego logowania QQ, używając go w nieznanej przeglądarce, a pierwszą rzeczą do zrobienia była instalacja panelu QuickLogin.
Właśnie gdy nie wiem kiedy, szybkie logowanie nagle przestaje mieć dostęp do sterowania.
Wtedy byłem bardzo zdezorientowany, jaką dziwną metodę używa Tencent do interakcji z lokalnymi aplikacjami?
Bez wtyczek strony internetowe nie powinny mieć możliwości bezpośredniej interakcji z lokalnymi aplikacjami (chyba że zdefiniowany jest protokół, ale może być wywołany tylko i nie wynikami dostarczanymi przez program).
Przypadkiem (no, po prostu znudził mnie przegląd menedżera zadań, odkrycie natywnego httpd i uruchomienie Apache), nagle uświadomiłem sobie możliwość: jeśli QQ otworzy port lokalny, utworzy serwer WWW, czyli serwer TCP zgodny z protokołem HTTP, a strona ajax wyśle żądanie do tego QQ (obecnie jako serwera WWW), czy można uzyskać wynik?
I to jest naprawdę efekt.
Web JS inicjuje żądanie GET do http://localhost.ptlogin2.qq.com (porty z 4300-4308, jeden po drugim do sukcesu).
Pinguj, pokażesz, że jest to wersja 127.0.0.1, a po sprawdzeniu portu faktycznie jest to QQ w użyciu.
Pierwsze żądanie: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk od ciasteczek, cokolwiek to jest; r jest liczbą losową
Wynik zwracany to tablica JSON:
var var_sso_uin_list=[{"account":"zalogowany na konto QQ","face_index":-1,"gender":0,"nickname":""Twój pseudonim QQ","uin":"Wciąż twoje konto QQ","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Następnie użyj http://ptlogin2.qq.com/getface, aby uzyskać awatary QQ, o których tu nie będę mówić
Dzięki temu Twoje informacje QQ mogą być wyświetlane na stronie internetowej.
Kiedy naciśniesz awatar (gdy wybierasz to logowanie)
Generowane są następujące żądania:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Podobnie r jest liczbą losową, pt_local_tk pochodzi z ciasteczka, local_token
Co robi ta prośba?
No cóż, Set-Cookie.
Następnie przejdź do wykonania prośby
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
Jedynym U1 tutaj jest adres docelowy
To żądanie zwróci wszystkie potrzebne pliki cookie i zostaniesz zalogowany.
Po nauczeniu się protokołu odkryto poważny problem: co się stanie, jeśli (niezdarny) program zrobi to w imieniu użytkownika?
Zacznij już teraz!
Miałem pod ręką tylko Maca, więc napisałem to w 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网页上的数据
Uwaga: Ze względu na moje wcześniejsze doświadczenie z botami QQ (opartymi na protokole WebQQ): nagłówek Referer jest bardzo ważny (musi to być domena .qq.com), jeśli się pomyli, na pewno się nie uda. Więc tutaj nie ma ronda
A tak przy okazji, byłem wtedy nowy w Obj-C i niektóre części kodu mogą wydawać się trochę głupie, proszę wybaczcie.
//cookiedata是个NSDictionary
W ten sposób logowanie zostaje zakończone, znajdziesz interfejs QQ space (nie jest tu opublikowany), a post jest pomyślny.
Co to oznacza? Oznacza to, że dopóki program działa lokalnie, istnieje szansa na wykonanie logowania do QQ zamiast Ciebie i wykonanie podstępnych operacji na platformach takich jak QQ Space, które nie wymagają uwierzytelniania dodatkowego
|