Peretasan API Terjemahan Google

Google nawakake API Tarjamahan Google kanthi struktur biaya adhedhasar panggunaan minangka bagean saka Google Cloud. Uga ana API sing ora didokumentasikake sing bisa digunakake tanpa tombol , nanging nolak bisa digunakake sawise sawetara panjaluk. Nalika nggunakake fungsi terjemahan situs web Google Chrome, bakal katon yen kaca bisa diterjemahake kanthi kualitas apik banget tanpa watesan sing jelas.


Ketoke model nmt canggih wis digunakake ing kene. Nanging API Google Chrome sing digunakake internal kanggo nerjemahake konten lan apa API iki uga bisa ditangani kanthi langsung - sanajan ing sisih server? Kanggo nganalisis lalu lintas jaringan, alat kayata Wireshark utawa Telerik Fiddler , sing uga bisa nganalisa lalu lintas sing dienkripsi, disaranake. Nanging Chrome malah ngirim panjaluk sing dikirim kanggo terjemahan kaca kanthi gratis: Kabeh bisa dideleng kanthi gampang nggunakake Chrome DevTools:

Yen sampeyan nindakake terjemahan, coba pilih POST panjaluk penting kanggo https://translate.googleapis.com liwat "Salin> Salin minangka cURL (bash)" lan eksekusi ing alat kaya Postman , kayata, sampeyan bisa ngirim panjaluk maneh tanpa ana masalah:

Makna paramèter URL uga wis ketok:

KunciNilai contoTegese
anno3Mode anotasi (mengaruhi format bali)
kliente_libInformasi klien (beda-beda, regane "webapp" liwat antarmuka web Google Translate; pengaruhe ing format bali lan watesan tarif)
formathtmlFormat string (penting kanggo nerjemahake tag HTML)
v1.0Nomer versi Google Translate
kunciAIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgwKunci API (deleng ngisor)
log logvTE_20200210_00Versi protokol
sldeBasa sumber
tlenTarget basa
spnmtModel ML
tc1dingerteni
sr1dingerteni
tk709408.812158Token (ndeleng ngisor)
Pantun1dingerteni

Sawetara header panjaluk uga disetel - nanging umume bisa diabaikan. Sawise batal milih kabeh header, kalebu saka agen pangguna , ditemokake masalah enkode nalika ngetik karakter khusus (ing kene nalika nerjemahake " Hello World "):

Yen sampeyan ngaktifake maneh agen pangguna (sing umume ora mbebayani), API bakal ngasilake karakter enkode UTF-8:

Apa kita wis ana lan apa duwe kabeh informasi kanggo nggunakake API iki ing sanjabane Google Chrome? Yen sampeyan ngganti senar karakter supaya diterjemahake (kolom data q panjaluk POST) saka, contone, "Hello world" dadi "Hello world ! ", Kita entuk pesen kesalahan:

Saiki kita terjemah iki sing dimodifikasi maneh ing Google Chrome nggunakake fungsi terjemahan situs web lan nemokake, kajaba parameter q , parameter tk uga wis diganti (kabeh parameter liyane tetep padha):

Temenan, iku token sing gumantung saka senar, strukture ora gampang dideleng. Nalika miwiti terjemahan situs web, file ing ngisor iki bakal dimuat:

  • 1 file CSS: translateelement.css
  • 4 grafis: translate_24dp.png (2x), gen204 (2x)
  • 2 file JS: main_de.js , element_main.js

Kaloro file JavaScript obfuscated lan minimal. Alat kaya JS Nice lan de4js saiki mbantu kita nggawe file kasebut luwih bisa diwaca. Kanggo debug langsung, disaranake Chrome Extension Request, sing ngatur file jarak jauh kanthi lokal:

Saiki kita bisa debug kode ( CORS luwih dhisik kudu diaktifake ing server lokal). Bagean kode sing cocog kanggo ngasilake token katon didhelikake ing bagean iki ing file element_main.js:

b7739bf50b2edcf636c43a8f8910def9

Ing kene teks kasebut dikumbah kanthi sawetara pangowahan . Nanging sayangé, kita isih isih kekurangan salah sawijining bedhekan: Saliyane argumen a (yaiku teks sing bakal diterjemahake), argumen liyane b diwenehake menyang fungsi Bp () - jinis wiji sing katon beda-beda banjur kalebu mili menyang hashing. Nanging asale saka ngendi? Yen mlebu telpon fungsi Bp () , temokake bagean kode ing ngisor iki:

b7739bf50b2edcf636c43a8f8910def9

Fungsi Hq dinyatakake sadurunge kaya ing ngisor iki:

b7739bf50b2edcf636c43a8f8910def9

Ing kene Deobfuscater ninggali sampah; Sawise kita ngganti String.fromCharCode ('...') karo senar karakter masing-masing, mbusak a () sing wis lawas lan selehake fungsi panggilan [c (), c ()] , asile:

b7739bf50b2edcf636c43a8f8910def9

Utawa malah luwih gampang:

b7739bf50b2edcf636c43a8f8910def9

Fungsi yq sadurunge ditetepake minangka:

b7739bf50b2edcf636c43a8f8910def9

Wiji kasebut kayane ana ing obyek global google.translate._const._ctkk , sing kasedhiya nalika runtime. Nanging ing endi diaturake? Ing liyane, file JS main_de.js sing sadurunge dimuat , paling ora uga kasedhiya ing wiwitan. Kita nambahake ing ngisor iki ing wiwitan:

b7739bf50b2edcf636c43a8f8910def9

Ing console, kita pancen entuk winih saiki:

Iki nggawe Google Chrome dhewe minangka pilihan pungkasan, sing ketoke nyedhiyakake wiji kasebut. Untunge, kode sumber (Chromium, kalebu komponen Translate) mbukak sumber mula kasedhiya ing masarakat. Kita narik repositori kanthi lokal lan nemokake panggilan menyang fungsi TranslateScript :: GetTranslateScriptURL ing file translate_script.cc ing komponen / translate / inti / folder browser:

b7739bf50b2edcf636c43a8f8910def9

Variabel kanthi URL wis ditemtokake ing file sing padha:

b7739bf50b2edcf636c43a8f8910def9

Yen saiki mriksa file element.js kanthi luwih cedhak (sawise deobfuscating maneh), kita nemokake entri sing disetel c._ctkk - obyek google.translate uga wis disetel lan mbukak kabeh aset sing relevan (sing wis ditemokake sadurunge) bakal diwiwiti:

b7739bf50b2edcf636c43a8f8910def9

Saiki tombol paramèter tetep dipertimbangkan (kanthi nilai AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw). Kayane kunci API browser umum (sing uga bisa ditemokake ing sawetara asil Google ). Wis disetel ing Chromium ing file translate_url_util.cc ing folder komponen / terjemahake / inti / browser:

b7739bf50b2edcf636c43a8f8910def9

Tombol kui ing google_apis / google_api_keys.cc saka nilai dummy:

b7739bf50b2edcf636c43a8f8910def9

Nanging, tes nuduhake manawa panggilan API bisa digunakake tanpa parameter kunci iki. Yen sampeyan nyoba nganggo API, sampeyan bakal entuk kode status 200 yen sukses. Yen sampeyan entuk watesan, sampeyan bakal entuk kode status 411 kanthi pesen " POST panjaluk mbutuhake header dawa isi ". Mula disaranake nyakup header iki (sing kanthi otomatis disetel minangka header sementara ing Postman).

Format bali saka senar sing diterjemahake ora umum yen ana sawetara ukara ing sak panjaluk. Ukara individu ditutupi karo tag i- / b-HTML:

Uga, Google Chrome ora ngirim kabeh HTML menyang API, nanging ngirit nilai atribut kayata href ing panjaluk (lan malah nyetel indeks supaya tag mengko bisa diwenehake ing sisih klien):

Yen sampeyan ngganti regane klien kunci POST saka te_lib (Google Chrome) ing webapp (situs web Terjemahan Google ), sampeyan entuk tali terjemahan pungkasan:

Masalahe yaiku sampeyan luwih cenderung mbukak watesan dibandhingake liwat te_lib (kanggo perbandingan: kanthi webapp tekan 40.000 karakter, kanthi te_lib ora ana watesan watesan). Dadi, kita kudu luwih tliti babagan carane Chrome ngrampungake asil kasebut. Kita bakal nemokake ing kene ing element_main.js:

b7739bf50b2edcf636c43a8f8910def9

Yen sampeyan ngirim kabeh kode HTML menyang API, bakal ninggalake atribut ing respon terjemahan. Mulane, kita ora kudu niru kabeh prilaku parse, nanging mung ngekstrak string sing diterjemahake saka respon. Kanggo nindakake iki, kita nggawe parser tag HTML cilik sing mbuwang tag <i> paling njaba kalebu isi lan mbusak tag <b> paling njaba. Kanthi kawruh iki kita saiki bisa (sawise nginstal dependensi karo komposer mbutuhake fzaninotto / faker vielhuber / stringhelper ) mbangun versi server-side saka terjemahan API:

b7739bf50b2edcf636c43a8f8910def9

Ing ngisor iki minangka asil tes awal sing ditindakake ing limang macem-macem sistem kanthi bandwidth beda lan alamat IP:

WatakeKarakter saben panjalukDurationTingkat kesalahanBiaya liwat API resmi
13.064.662~25003: 36: 17h0%237,78€
24.530.510~25011: 09: 13h0%446,46€
49.060.211~25020: 39: 10h0%892,90€
99.074.487~100061: 24: 37h0%1803,16€
99.072.896~100062: 22: 20h0%1803,13€
Σ284.802.766~ Ø550Σ159: 11: 37h0%€ 5183,41

Cathetan: Posting blog iki kalebu kabeh skrip ditulis mung kanggo tujuan tes. Aja nggunakake Tulisan kanggo nggunakake produktif, tinimbang bisa karo resmi API Google Translation .

Bali