डेवलपर के लिए कार्य, या हमने बिना विक्रेता के हाथ के स्कैनर कैसे स्कैन किए

सभी को नमस्कार।

हम, विक्टर एंटिपोव और इल्या अलेशिन, आज पाइथन पायसबी के माध्यम से यूएसबी उपकरणों के साथ हमारे अनुभव के बारे में बात करेंगे और रिवर्स इंजीनियरिंग के बारे में थोड़ा जानेंगे।



पृष्ठभूमि


2019 में, रूसी संघ की सरकार की डिक्री संख्या 224 "तंबाकू उत्पादों के संबंध में तंबाकू उत्पादों की लेबलिंग के नियमों के अनुमोदन पर और तंबाकू उत्पादों के संबंध में पहचान के माध्यम से अनिवार्य लेबलिंग के लिए माल के संचलन की निगरानी के लिए एक राज्य सूचना प्रणाली शुरू करने की बारीकियों" में प्रवेश किया।
दस्तावेज़ बताता है कि 1 जुलाई 2019 से, निर्माताओं को तंबाकू के प्रत्येक पैक को लेबल करना आवश्यक है। और प्रत्यक्ष वितरकों को इन उत्पादों को एक सार्वभौमिक हस्तांतरण दस्तावेज़ (यूपीडी) के डिजाइन के साथ प्राप्त करना चाहिए। दुकानें, बदले में, नकदी रजिस्टर के माध्यम से लेबल वाले उत्पादों की बिक्री को पंजीकृत करने की आवश्यकता होती है।

इसके अलावा, 1 जुलाई, 2020 से, अचिह्नित तंबाकू उत्पादों पर प्रतिबंध लगा दिया गया है। इसका मतलब है कि सिगरेट के सभी पैक्स को एक विशेष डाटामेट्रिक्स बारकोड के साथ लेबल किया जाना चाहिए। और - एक महत्वपूर्ण बिंदु - यह पता चला कि डाटामेट्रिक्स साधारण नहीं होगा, बल्कि उलटा होगा। यही है, सफेद पर एक काला कोड नहीं है, लेकिन इसके विपरीत।

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

क्या किया जाना था? दो विकल्प हैं। पहली: इस सुविधा के इंजीनियर मैन्युअल रूप से स्कैनरों को फिर से व्यवस्थित और समायोजित करते हैं। दूसरा: हम दूरस्थ रूप से काम करते हैं और, अधिमानतः, हम एक बार में कई स्कैनर को एक पुनरावृत्ति में कवर करते हैं।

पहला विकल्प, जाहिर है, हमें शोभा नहीं देता: हमें इंजीनियरों की फील्ड यात्राओं पर पैसा खर्च करना होगा, और इस मामले में प्रक्रिया को नियंत्रित करना और समन्वय करना मुश्किल है। लेकिन सबसे महत्वपूर्ण बात यह है कि लोग काम करेंगे, यानी, संभवतः हमें बहुत सारी गलतियाँ मिलेंगी और सबसे अधिक संभावना है कि यह समयसीमा पूरी नहीं होगी।

दूसरा विकल्प सभी के लिए अच्छा है, अगर एक के लिए नहीं, लेकिन। कुछ विक्रेताओं के पास रिमोट फ्लैशिंग टूल नहीं थे जो हमें सभी आवश्यक ऑपरेटिंग सिस्टम के लिए आवश्यक थे। और जब से समय सीमा समाप्त हो रही थी, मुझे अपने सिर के साथ सोचना पड़ा।

इसके बाद, हम वर्णन करेंगे कि हमने डेबियन 9.x ओएस के लिए हाथ में स्कैनर के लिए उपकरण कैसे विकसित किए (हमारे पास सभी डेबियन बॉक्स ऑफिस हैं)।

:


विक्टर एंटिपोव कहते हैं।

विक्रेता द्वारा दी गई आधिकारिक उपयोगिता विंडोज के तहत काम करती है, और केवल IE के साथ। उपयोगिता फ्लैश और स्कैनर को कॉन्फ़िगर कर सकती है।

चूंकि टारगेट सिस्टम डेबियन है, इसलिए हमने विंडोज पर usb-redirector सर्वर और Windows पर usb-redirector क्लाइंट इंस्टॉल किया। Usb-redirector उपयोगिताओं का उपयोग करके, स्कैनर को लिनक्स मशीन से विंडोज मशीन में भेज दिया गया था।

विंडोज विक्रेता से उपयोगिता ने स्कैनर को देखा और यहां तक ​​कि इसे सामान्य रूप से फ्लैश किया। इस प्रकार, पहला निष्कर्ष बनाया गया था: कुछ भी ओएस पर निर्भर नहीं करता है, मामला फ्लैशिंग प्रोटोकॉल में है।

ठीक। विंडोज मशीन पर एक फ्लैशिंग शुरू की गई थी, और एक लिनक्स मशीन पर एक डंप हटा दिया गया था।

उन्होंने डंप को वायरशर्क में भर दिया और ... उदास थे (मैं डंप विवरण का हिस्सा छोड़ दूंगा, वे कोई दिलचस्पी नहीं हैं)।

डंप ने हमें क्या दिखाया:





0000-0030 के पते, Wireshark द्वारा, USB सेवा की जानकारी है।

हमें भाग 0040-0070 में रुचि थी।

MOCFT वर्णों को छोड़कर, एक ट्रांसमिशन फ्रेम से कुछ भी स्पष्ट नहीं था। ये प्रतीक फ़र्मवेयर फ़ाइल से प्रतीक बन गए, साथ ही साथ बाकी के प्रतीकों को फ्रेम के अंत तक (फ़र्मवेयर फ़ाइल हाइलाइट किया गया है):



प्रतीकों ने क्या किया fd 3e 02 01 fe मतलब, मैं व्यक्तिगत रूप से, इल्या की तरह, कोई विचार नहीं था।

मैंने अगले फ्रेम को देखा (सेवा की जानकारी यहां हटा दी गई है, फ़र्मवेयर फ़ाइल हाइलाइट की गई है):



क्या स्पष्ट हुआ? यह कि पहले दो बाइट्स कुछ प्रकार के होते हैं। सभी बाद के ब्लॉकों ने इसकी पुष्टि की, लेकिन ट्रांसमिशन ब्लॉक के अंत से पहले:



इस फ्रेम ने भी एक स्तूप में प्रवेश किया, चूंकि निरंतर परिवर्तन (हाइलाइट) और, अजीब तरह से, फ़ाइल का एक हिस्सा था। फ़ाइल के संचरित बाइट्स का आकार इंगित करता है कि 1024 बाइट्स स्थानांतरित किए गए थे। शेष बाइट्स का क्या मतलब था - मुझे फिर से पता नहीं था।

सबसे पहले, एक पुराने बीबीएस उपनाम की तरह, मैंने मानक हस्तांतरण प्रोटोकॉल को संशोधित किया। 1024 बाइट्स, कोई प्रोटोकॉल पास नहीं हुआ। उन्होंने मैटरियल का अध्ययन करना शुरू किया और 1 के एक्समोडेम प्रोटोकॉल पर ठोकर खाई। इसने 1024 को प्रसारित करने की अनुमति दी, लेकिन एक बारीकियों के साथ: पहले केवल 128 पर, और केवल त्रुटियों की अनुपस्थिति में प्रोटोकॉल ने प्रेषित बाइट्स की संख्या में वृद्धि की। मेरे पास तुरंत 1024 बाइट्स का प्रसारण था। मैंने ट्रांसमिशन प्रोटोकॉल और विशेष रूप से एक्स-मॉडेम का अध्ययन करने का फैसला किया।

मॉडेम के दो रूपांतर थे।

सबसे पहले, CRC8 समर्थन (मूल XMODEM) के साथ XMODEM पैकेज का प्रारूप:



दूसरे, CRC16 समर्थन (XmodemCRC) के साथ XMODEM पैकेट प्रारूप:



यह SOH, पैकेट नंबर और CRC के अपवाद और पैकेट की लंबाई के साथ समान दिखता है।

मैंने दूसरे ट्रांसमिशन ब्लॉक की शुरुआत में देखा (और फ़र्मवेयर फ़ाइल को फिर से देखा, लेकिन 1024 बाइट्स के इंडेंट के साथ):



मैंने परिचित हेडर fd 3e 02 देखा, लेकिन अगले दो बाइट्स पहले ही बदल चुके हैं: यह 01 fe था, और यह 02 fd बन गया। तब मैंने देखा कि दूसरा ब्लॉक अब 02 नंबर पर है और इस प्रकार समझा जाता है: मेरे सामने ट्रांसमिशन ब्लॉक की संख्या है। पहला 1024 ट्रांसमिशन 01, दूसरा 02, तीसरा 03 और इसी तरह (लेकिन हेक्स में, निश्चित रूप से) है। लेकिन fe से fd में क्या बदलाव आता है? आँखों ने 1 की कमी देखी, मस्तिष्क ने याद दिलाया कि प्रोग्रामर 0 से गिनती करते हैं, 1 से नहीं। लेकिन फिर पहला ब्लॉक 1 क्यों है, 0 नहीं? मुझे इस सवाल का जवाब नहीं मिला। लेकिन मैं समझ गया कि दूसरा ब्लॉक कैसे माना जाता है। दूसरा ब्लॉक एफएफ से ज्यादा कुछ नहीं है - (माइनस) पहले ब्लॉक की संख्या। इस प्रकार, दूसरा ब्लॉक = 02 (एफएफ -02) = 02 एफडी के रूप में नामित किया गया था। इसके बाद डंप के पढ़ने ने मेरे कूबड़ की पुष्टि की।

फिर कार्यक्रम की निम्नलिखित तस्वीर उभरने लगी:

कार्यक्रम की शुरुआत
fd 3e 02 - प्रारंभ
01 FE - ट्रांसमिशन काउंटर
ट्रांसमिशन (34 ब्लॉक, 1024 बाइट्स प्रसारित होते हैं)
fd 3e 1024 बाइट्स डेटा (30 बाइट्स के ब्लॉक में विभाजित)।
पारेषण की समाप्ति
fd 25

1024 बाइट्स से संरेखित करने के लिए डेटा के अवशेष।

ब्लॉक ट्रांसफर एंड फ्रेम कैसा दिखता है:



एफडी 25 - ब्लॉक ट्रांसफर के अंत तक सिग्नल। अगला 2f 52 - 1024 बाइट तक फ़ाइल का अवशेष। 2f 52, प्रोटोकॉल को देखते हुए, 16-बिट CRC चेकसम है।

पुरानी मेमोरी के आधार पर, मैंने C में एक प्रोग्राम बनाया, जिसने एक फाइल से 1024 बाइट्स निकाले और 16-बिट CRC को पढ़ा। कार्यक्रम के शुभारंभ से पता चला कि यह 16-बिट सीआरसी नहीं है। फिर से मूर्ख - लगभग तीन दिनों के लिए। इस बार मैंने यह समझने की कोशिश की कि चेकसम नहीं तो क्या हो सकता है। अंग्रेजी-भाषा साइटों का अध्ययन करते हुए, मैंने पाया कि एक्स-मॉडेम अपनी स्वयं की चेकसम गणना - सीआरसी-सीसीआईटीटी (एक्समोड) का उपयोग करता है। मुझे इस गणना के लिए C में कोई कार्यान्वयन नहीं मिला, लेकिन मुझे एक साइट मिली, जिसने इस चेकसम को ऑनलाइन पढ़ा। मेरी फ़ाइल के 1024 बाइट्स को वेब पेज पर अपलोड करके, साइट ने मुझे एक चेकसम दिखाया जो पूरी तरह से फ़ाइल से चेकसम के साथ मेल खाता था।

हुर्रे! अंतिम पहेली हल हो गई है, अब आपको अपना फर्मवेयर बनाना होगा। फिर मैंने अपने ज्ञान को स्थानांतरित कर दिया (और वे केवल मेरे सिर में रह गए) इल्या, जो शक्तिशाली साधनों से परिचित है - पायथन।

कार्यक्रम निर्माण


इल्या अलेशिन द्वारा सुनाई गई।

उपयुक्त निर्देश प्राप्त करने के बाद, मैं बहुत खुश था।

कहाँ से शुरू करें? शुरू से ही सही। । एक यूएसबी पोर्ट से डंपिंग से।

USB- pcap https://desowin.org/usbpcap/tour.html चलाएं

उस पोर्ट का चयन करें जिससे डिवाइस कनेक्ट है और वह फाइल जहां हम डंप को सेव करेंगे।



हम स्कैनर को उस मशीन से जोड़ते हैं जहां विंडोज के लिए देशी EZConfigScanning सॉफ्टवेयर स्थापित है।



इसमें हम डिवाइस पर कमांड भेजने का बिंदु पाते हैं। लेकिन टीमों के बारे में क्या? उन्हें कहां से लाएं?
जब कार्यक्रम शुरू होता है, तो उपकरण स्वचालित रूप से पूछताछ की जाती है (हम इसे थोड़ा बाद में देखेंगे)। और आधिकारिक उपकरण दस्तावेजों से प्रशिक्षण बारकोड थे। DEFALT। यह हमारी टीम है।



आवश्यक डेटा प्राप्त होता है। डंपर के माध्यम से ओपन डंप।

स्टार्टअप EZConfigScanning पर ब्लॉक करें। लाल बिंदुओं पर ध्यान देने के स्थान हैं।





पहली बार यह सब देखकर मेरा दिल टूट गया। आगे कहां खोदना है यह स्पष्ट नहीं है।

थोड़ा मंथन और-और ... आहा! एक डंप में, बाहर है में , और में है बाहर

URB_INTERRUPT क्या है पता चला कि यह एक डेटा ट्रांसफर विधि है। और ऐसी 4 विधियाँ हैं: नियंत्रण, व्यवधान, समकालिक, थोक। आप उनके बारे में अलग से पढ़ सकते हैं।

और USB डिवाइस इंटरफ़ेस में एंडपॉइंट पते "lsusb –v" कमांड के माध्यम से या pyusb के माध्यम से प्राप्त किए जा सकते हैं।

अब आपको इस VID वाले सभी उपकरणों को खोजने की आवश्यकता है। आप विशेष रूप से VID: PID द्वारा खोज सकते हैं।



यह इस तरह दिख रहा है:





इसलिए, हमारे पास आवश्यक जानकारी है: P_INFO कमांड। या DEFALT, पते को लिखते हैं जहां कमांड एंडपॉइंट = 03 लिखना है और जहां उत्तर समापन बिंदु = 86 प्राप्त करना है। यह केवल हेक्स में आदेशों का अनुवाद करने के लिए रहता है।





चूँकि हमने पहले से ही डिवाइस पाया है, इसे कर्नेल से डिस्कनेक्ट करें



... और एड्रेस 0x03 के साथ एंडपॉइंट पर लिखें



... और फिर एड्रेस 0x86 के साथ एंडपॉइंट से रिस्पॉन्स पढ़ें।



संरचित उत्तर:

P_INFOfmt: 1
mode: app
app-present: 1
boot-present: 1
hw-sn: 18072B44CA
hw-rev: 0x20
cbl: 4
app-sw-rev: CP000116BBA
boot-sw-rev: CP000014BAD
flash: 3
app-m_name: Voyager 1450g
boot-m_name: Voyager 1450g
app-p_name: 1450g
boot-p_name: 1450g
boot-time: 16:56:02
boot-date: Oct 16 2014
app-time: 08:49:30
app-date: Mar 25 2019
app-compat: 289
boot-compat: 288
csum: 0x6986

हम इस डेटा को डंप.कैप में देखते हैं।







ठीक! हम हेक्स के लिए सिस्टम बारकोड का अनुवाद करते हैं। सब कुछ, प्रशिक्षण की कार्यक्षमता तैयार है।

फर्मवेयर के साथ क्या करना है? ऐसा लगता है कि सब कुछ समान है, लेकिन एक अति सूक्ष्म अंतर है।

चमकती प्रक्रिया का एक पूरा डंप हटाने के बाद, हम मोटे तौर पर समझ गए कि हम किसके साथ काम कर रहे थे। यहाँ एक्समोडेम के बारे में एक लेख है जो वास्तव में यह समझने में मदद करता है कि यह संचार कैसे होता है, सामान्य शब्दों में यद्यपि: http://microsin.net/adminstuff/others/xmodem-protocol-overview.html मैं इसे पढ़ने की सलाह देता हूं

डंप में देखते हुए, आप देख सकते हैं कि फ़्रेम का आकार 1024 है, और URB-data का आकार 64 है।



इसलिए, 1024/64, हमें एक ब्लॉक में 16 लाइनें मिलती हैं, फर्मवेयर फ़ाइल को 1 वर्ण द्वारा पढ़ें और एक ब्लॉक बनाएं। विशेष वर्ण fd3e02 + ब्लॉक संख्या के साथ एक ब्लॉक में 1 पंक्ति का पूरक।
अगली 14 पंक्तियों को fd25 + के साथ पूरक किया गया है, XMODEM.calc_crc () का उपयोग करके हम पूरे ब्लॉक के चेकसम की गणना करते हैं (यह समझने में बहुत समय लगता है कि "FF - 1" CSUM है) और अंतिम 16 वीं पंक्ति fd3e के साथ पूरक है।

ऐसा लगता है कि सब कुछ, फर्मवेयर फ़ाइल पढ़ें, ब्लॉक मारा, कर्नेल से स्कैनर को डिस्कनेक्ट करें और इसे डिवाइस पर भेजें। लेकिन इतना सरल नहीं है। स्कैनर को
NEWAPP = '\\ xfd \\ x0a \\ x16 \\ x4e \\ x2c \\ x4e \\ x45e \\ x57 \\ x57 \\ x50 \\ x50 \\ x50 \\ x0d' भेजकर फर्मवेयर मोड में डालना होगा
यह आज्ञा कहाँ से आती है ?? डंप से।



लेकिन 64 के प्रतिबंध के कारण हम पूरे ब्लॉक को स्कैनर को नहीं भेज सकते:



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

[253, 10, 22, 78, 44, 78, 69, 87, 65, 80, 80, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

और पहले से ही इस डेटा को स्कैनर को भेजें।

हमें जवाब मिलता है:

[2, 1, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

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



सभी ब्लॉकों को स्थानांतरित कर दिए जाने के बाद, हम हस्तांतरण END_TRANSFER = '\ xfd \ x01 \ x04' पूरा करते हैं।

खैर, चूंकि ये ब्लॉक आम लोगों के लिए कोई जानकारी नहीं रखते हैं, इसलिए हम फर्मवेयर को डिफ़ॉल्ट रूप से छिपे हुए मोड में बनाते हैं। और सिर्फ मामले में, tqdm के माध्यम से हम एक प्रगति बार आयोजित करेंगे।



दरअसल, बाकी हिस्सा छोटा है। यह केवल स्पष्ट रूप से परिभाषित समय पर बड़े पैमाने पर प्रतिकृति के लिए लिपियों में समाधान लपेटने के लिए रहता है, ताकि बॉक्स ऑफिस पर काम करने की प्रक्रिया को धीमा न करें, और लॉगिंग जोड़ें।

संपूर्ण


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

All Articles