Google अनुवाद एपीआई हैकिंग

Google Google अनुवाद API को अपने Google क्लाउड के भाग के रूप में उपयोग-आधारित लागत संरचना प्रदान करता है। एक अनकम्फर्टेड एपीआई भी है जिसे बिना चाबी के इस्तेमाल किया जा सकता है, लेकिन जो थोड़े से अनुरोध के बाद काम करने से मना कर देता है। Google Chrome के वेबसाइट अनुवाद फ़ंक्शन का उपयोग करते समय, यह ध्यान देने योग्य है कि पृष्ठों को किसी भी ध्यान देने योग्य सीमा के बिना बहुत अच्छी गुणवत्ता में अनुवाद किया जा सकता है।


जाहिरा तौर पर उन्नत एनएमटी मॉडल पहले से ही यहां इस्तेमाल किया जा रहा है। लेकिन सामग्री का अनुवाद करने के लिए Google Chrome आंतरिक रूप से किस API का उपयोग करता है और क्या इस API को सर्वर पर भी - सीधे संबोधित किया जा सकता है? नेटवर्क ट्रैफ़िक का विश्लेषण करने के लिए, Wireshark या Telerik Fiddler जैसे उपकरण, जो एन्क्रिप्टेड ट्रैफ़िक का विश्लेषण भी कर सकते हैं, की सिफारिश की जाती है। लेकिन Chrome उन अनुरोधों को भी वितरित करता है जो इसे पृष्ठ अनुवाद के लिए नि: शुल्क भेजते हैं : क्रोम देवटूल का उपयोग करके उन्हें आसानी से देखा जा सकता है:

यदि आप एक अनुवाद करते हैं, तो https://translate.googleapis.com के माध्यम से "PO> कॉपी के रूप में cURL (bash)" के माध्यम से महत्वपूर्ण पोस्ट अनुरोध को पकड़ लें और पोस्टमैन जैसे उपकरण में निष्पादित करें, उदाहरण के लिए, आप बिना किसी समस्या के फिर से अनुरोध भेज सकते हैं।:

URL पैरामीटर का अर्थ भी काफी हद तक स्पष्ट है:

चाभीउदाहरण मूल्यअर्थ
anno3एनोटेशन मोड (रिटर्न फॉर्मेट को प्रभावित करता है)
ग्राहकte_libग्राहक जानकारी (बदलता है, मान Google अनुवाद के वेब इंटरफ़ेस के माध्यम से "वेबएप" है; रिटर्न फॉर्मेट और रेट लिमिट पर प्रभाव पड़ता है)
प्रारूपएचटीएमएलस्ट्रिंग प्रारूप (HTML टैग्स के अनुवाद के लिए महत्वपूर्ण)
v1.0Google अनुवाद संस्करण संख्या
चाभीAIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgwएपीआई कुंजी (नीचे देखें)
logldvTE_20200210_00प्रोटोकॉल संस्करण
slडेस्रोत भाषा
tlenलक्ष्य भाषा
एसपीNMTएमएल मॉडल
टीसी1अनजान
sr1अनजान
TK709408.812158टोकन (नीचे देखें)
फैशन1अनजान

कुछ अनुरोध हेडर भी सेट किए गए हैं - लेकिन इन्हें ज्यादातर अनदेखा किया जा सकता है। उपयोगकर्ता एजेंट सहित उन सभी हेडर को मैन्युअल रूप से रद्द करने के बाद, विशेष वर्ण दर्ज करते समय एक एन्कोडिंग समस्या की खोज की जाती है (यहां " हैलो वर्ल्ड " का अनुवाद करते समय):

यदि आप उपयोगकर्ता एजेंट (जो आमतौर पर कोई नुकसान नहीं करते हैं) को पुन: सक्रिय करते हैं, तो API UTF-8 एन्कोडेड वर्णों को वितरित करता है:

क्या हम पहले से ही वहां हैं और क्या हमारे पास Google Chrome के बाहर इस API का उपयोग करने की सभी जानकारी है? यदि आप अनुवाद करने के लिए स्ट्रिंग बदलते हैं (POST अनुरोध के डेटा फ़ील्ड q ), उदाहरण के लिए, "हैलो वर्ल्ड" से "हैलो वर्ल्ड" ! “, हमें एक त्रुटि संदेश मिलता है:

अब हम Google Chrome में वेबसाइट अनुवाद फ़ंक्शन का उपयोग करते हुए एक बार फिर से इसका अनुवाद करते हैं और पाते हैं कि, पैरामीटर q के अलावा, पैरामीटर tk भी बदल गया है (अन्य सभी पैरामीटर समान रहे हैं):

स्पष्ट रूप से यह एक टोकन है जो स्ट्रिंग पर निर्भर है, जिसकी संरचना को देखना आसान नहीं है। जब आप वेबसाइट अनुवाद शुरू करते हैं, तो निम्न फाइलें लोड होती हैं:

  • 1 सीएसएस फ़ाइल: Translateelement.css
  • 4 ग्राफिक्स: Translate_24dp.png (2x), gen204 (2x)
  • 2 जेएस फाइलें: main_de.js , element_main.js

दो जावास्क्रिप्ट फ़ाइलों obfuscated और minified हैं। JS Nice और de4js जैसे उपकरण अब इन फ़ाइलों को अधिक पठनीय बनाने में हमारी मदद कर रहे हैं। उन्हें लाइव डिबग करने के लिए, हम Chrome एक्सटेंशन का अनुरोध करते हैं, जो स्थानीय रूप से मक्खी पर दूरस्थ फ़ाइलों को सुरंग करता है:

अब हम कोड को डीबग कर सकते हैं ( कोर को पहले स्थानीय सर्वर पर सक्रिय होना चाहिए)। टोकन बनाने के लिए संबंधित कोड अनुभाग इस अनुभाग में element_main.js फ़ाइल में छिपा हुआ प्रतीत होता है:

b7739bf50b2edcf636c43a8f8910def9

यहां कुछ बिट शिफ्ट्स की मदद से टेक्स्ट को हैश किया गया है । लेकिन दुर्भाग्य से हम अभी भी पहेली का एक टुकड़ा याद कर रहे हैं: तर्क एक के अतिरिक्त (है जो अनुवाद किया जाना पाठ), एक और तर्क समारोह बीपी () को पारित कर दिया है - बीज का एक प्रकार है कि समय-समय पर परिवर्तन करने लगता है और वह भी शामिल है हैशिंग में बहती है। लेकिन वह कहां से आता है? यदि हम Bp () के फ़ंक्शन कॉल पर जाते हैं, तो हमें निम्नलिखित कोड अनुभाग मिलते हैं:

b7739bf50b2edcf636c43a8f8910def9

फंक्शन Hq को पहले से घोषित किया गया है:

b7739bf50b2edcf636c43a8f8910def9

यहाँ देओफुसकैटर ने कुछ बकवास छोड़ दिया; जब हमने संबंधित चरित्र स्ट्रिंग्स के साथ String.fromCharCode ('...') को बदल दिया है, तो अप्रचलित ए () और टुकड़े को एक साथ हटा दें फ़ंक्शन कॉल [सी (), सी ()] , परिणाम है:

b7739bf50b2edcf636c43a8f8910def9

या और भी आसान:

b7739bf50b2edcf636c43a8f8910def9

फ़ंक्शन yq को पहले के रूप में परिभाषित किया गया है:

b7739bf50b2edcf636c43a8f8910def9

यह बीज वैश्विक ऑब्जेक्ट google.translate._const._ctkk में लगता है, जो रनटाइम पर उपलब्ध है। लेकिन यह कहां सेट है? दूसरे में, पहले से लोड की गई JS फाइल main_de.js, कम से कम शुरुआत में भी उपलब्ध है। हम शुरुआत में निम्नलिखित जोड़ते हैं:

b7739bf50b2edcf636c43a8f8910def9

कंसोल में हम वास्तव में वर्तमान बीज प्राप्त करते हैं:

यह Google Chrome को ही छोड़ देता है, जो अंतिम विकल्प के रूप में, जाहिर तौर पर बीज प्रदान करता है। सौभाग्य से, इसका स्रोत कोड (क्रोमियम, अनुवाद घटक सहित) खुला स्रोत है और इसलिए सार्वजनिक रूप से उपलब्ध है। हम रिपॉजिटरी को स्थानीय रूप से खींचते हैं और कॉल को ट्रांसस्क्रिप्ट के लिए पाते हैं :: GetTranslateScriptURL फंक्शन का अनुवाद घटकों में Translate_script.cc फ़ाइल / अनुवाद / कोर / ब्राउज़र फ़ोल्डर में:

b7739bf50b2edcf636c43a8f8910def9

URL के साथ चर उसी फ़ाइल में हार्ड-डिफाइन होता है:

b7739bf50b2edcf636c43a8f8910def9

यदि हम अब तत्व की जांच करते हैं। जेएस फ़ाइल को अधिक बारीकी से (फिर से deobfuscating के बाद), हम हार्ड-सेट प्रविष्टि c._ctkk पाते हैं - google.translate ऑब्जेक्ट भी तदनुसार सेट किया गया है और सभी संबंधित संपत्तियों (जो हमने पहले ही खोज लिया है) की लोडिंग चालू है:

b7739bf50b2edcf636c43a8f8910def9

अब पैरामीटर कुंजी विचार के लिए बनी हुई है (मूल्य AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw के साथ)। यह एक सामान्य ब्राउज़र एपीआई कुंजी (जो कुछ Google परिणामों में भी पाया जा सकता है) प्रतीत होता है। यह क्रोमियम में फाइल घटक / फोल्डर / ट्रांसलेशन / कोर / ब्राउजर में Translate_url_util.cc में सेट है:

b7739bf50b2edcf636c43a8f8910def9

कुंजी डमी मूल्य से google_apis / google_api_keys.cc में बनाई गई है:

b7739bf50b2edcf636c43a8f8910def9

हालांकि, एक परीक्षण से पता चलता है कि एपीआई कॉल इस प्रमुख पैरामीटर के बिना ही काम करता है। यदि आप एपीआई के साथ प्रयोग करते हैं, तो आपको सफल होने पर स्टेटस कोड 200 वापस मिल जाएगा। यदि आप एक सीमा में भागते हैं, तो आपको " POST अनुरोधों के लिए सामग्री-लंबाई शीर्ष लेख की आवश्यकता होती है " संदेश के साथ स्थिति कोड 411 वापस मिलता है। इसलिए इस हेडर को शामिल करना उचित है (जो स्वचालित रूप से पोस्टमैन में एक अस्थायी हेडर के रूप में सेट है)।

अनुवादित स्ट्रिंग्स का रिटर्न फॉर्मेट असामान्य है जब एक अनुरोध में कई वाक्य होते हैं। व्यक्तिगत वाक्य i- / b-HTML टैग द्वारा संलग्न हैं:

इसके अलावा, Google Chrome संपूर्ण HTML को API के लिए नहीं भेजता है, लेकिन विशेषता मानों को बचाता है जैसे अनुरोध में href (और इसके बजाय सूचकांकों को सेट करता है ताकि टैग को बाद में क्लाइंट पक्ष में असाइन किया जा सके):

यदि आप te_lib (Google Chrome) से POST कुंजी क्लाइंट का मान बदलते हैं वेबएप ( Google अनुवाद वेबसाइट ) पर, आपको अंतिम अनुवादित स्ट्रिंग मिलती है:

(: Webapp के साथ इस 40,000 वर्ण के बाद तक पहुँच जाता है, te_lib साथ कोई सीमित दर है तुलना के लिए) समस्या यह है कि आप और अधिक के माध्यम से te_lib से सीमित दर में चलाने की संभावना है। इसलिए हमें इस बात पर ध्यान देने की आवश्यकता है कि क्रोम परिणाम कैसे प्राप्त करता है। हम इसे यहां element_main.js में पाएंगे:

b7739bf50b2edcf636c43a8f8910def9

यदि आप संपूर्ण HTML कोड एपीआई को भेजते हैं, तो यह अनुवादित प्रतिक्रिया में विशेषताओं को छोड़ देता है। इसलिए हमें पूर्ण पार्स व्यवहार का अनुकरण करने की आवश्यकता नहीं है, लेकिन प्रतिक्रिया से केवल अंतिम, अनुवादित स्ट्रिंग निकालें। ऐसा करने के लिए, हम एक छोटे से HTML टैग पार्सर का निर्माण करते हैं जो उनकी सामग्री सहित सबसे बाहरी <i> टैग को हटाता है और सबसे बाहरी <b> टैग को निकालता है। इसे ध्यान में रखते हुए, अब हम अनुवाद एपीआई के सर्वर-साइड संस्करण का निर्माण कर सकते हैं:

b7739bf50b2edcf636c43a8f8910def9

निम्नलिखित एक प्रारंभिक परीक्षण के परिणाम हैं जो अलग-अलग बैंडविंड और आईपी पते के साथ पांच अलग-अलग प्रणालियों पर किए गए थे:

चरित्रअनुरोध के अनुसार वर्णअवधित्रुटि दरआधिकारिक एपीआई के माध्यम से लागत
13.064.662~25003: 36: 17 ह0%237,78€
24.530.510~25011: 09: 13 ह0%446,46€
49.060.211~25020: 39: 10 ह0%892,90€
99.074.487~100061: 24: 37 ह0%1803,16€
99.072.896~100062: 22: 20 ह0%1803,13€
Σ284.802.766~ Ø550Σ159: 11: 37h0%Σ € 5183.41

नोट: यह ब्लॉग पोस्ट सभी लिपियों सहित केवल परीक्षण के उद्देश्य से लिखी गई थी। उत्पादक उपयोग के लिए स्क्रिप्ट का उपयोग करें, इसके बजाय आधिकारिक Google अनुवाद एपीआई के साथ काम करें।

वापस