Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Sveiki visiem

Mēs, Viktors Antipovs un Iļja AleÅ”ins, Å”odien runāsim par savu pieredzi darbā ar USB ierÄ«cēm, izmantojot Python PyUSB, un nedaudz par reverso inženieriju.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Aizvēsture

2019. gadā Krievijas Federācijas valdÄ«bas dekrēts Nr. 224 ā€œPar noteikumu apstiprināŔanu tabakas izstrādājumu marÄ·Ä“Å”anai ar identifikācijas lÄ«dzekļiem un valsts informācijas sistēmas ievieÅ”anas pazÄ«mēm to preču aprites uzraudzÄ«bai, kurām obligāti jāmarķē ar identifikācijas lÄ«dzekļiem attiecÄ«bā uz tabakas izstrādājumiemā€ stājās spēkā.
Dokumentā paskaidrots, ka no 1. gada 2019. jÅ«lija ražotājiem ir jāmarķē katrs tabakas iepakojums. Un tieÅ”ajiem izplatÄ«tājiem Å”ie produkti ir jāsaņem, noformējot universālo nodoÅ”anas dokumentu (UDD). Savukārt veikaliem ar kases aparāta starpniecÄ«bu jāreÄ£istrē marķētās produkcijas tirdzniecÄ«ba.

Tāpat no 1.gada 2020.jÅ«lija ir aizliegta nemarķēto tabakas izstrādājumu aprite. Tas nozÄ«mē, ka visas cigareÅ”u paciņas ir jāmarķē ar Ä«paÅ”u Datamatrix svÄ«trkodu. Turklāt - svarÄ«gs punkts - izrādÄ«jās, ka Datamatrix nebÅ«s parasta, bet gan apgriezta. Tas ir, nevis melns kods uz balta, bet otrādi.

Mēs pārbaudÄ«jām savus skenerus, un izrādÄ«jās, ka lielākā daļa no tiem ir jāatjauno / jāapmāca, pretējā gadÄ«jumā tie vienkārÅ”i nevar normāli strādāt ar Å”o svÄ«trkodu. Šāds notikumu pavērsiens mums garantēja pamatÄ«gas galvassāpes, jo mÅ«su uzņēmumam ir daudz veikalu, kas izkaisÄ«ti plaŔā teritorijā. Vairāki desmiti tÅ«kstoÅ”u kases aparātu ā€“ un ļoti maz laika.

Kas bija jādara? Ir divi varianti. Pirmkārt: uz vietas esoÅ”ie inženieri manuāli atsvaidzina un pielāgo skenerus. Otrkārt: mēs strādājam attālināti un, vēlams, vienā iterācijā aptveram vairākus skenerus vienlaikus.

Pirmais variants, acÄ«mredzot, mums nebija piemērots: mums bÅ«tu jātērē nauda, ā€‹ā€‹apmeklējot inženierus, un Å”ajā gadÄ«jumā bÅ«tu grÅ«ti kontrolēt un koordinēt procesu. Bet pats galvenais, lai cilvēki strādātu, proti, mēs potenciāli dabÅ«tu daudz kļūdu un, visticamāk, neiekļūtu termiņā.

Otrais variants ir labs visiem, ja ne vienai lietai. Dažiem pārdevējiem nebija attālās mirgoÅ”anas rÄ«ku, kas mums bija nepiecieÅ”ami visām nepiecieÅ”amajām operētājsistēmām. Un tā kā termiņi tuvojās beigām, man bija jādomā ar savu galvu.

Tālāk mēs jums pastāstīsim, kā mēs izstrādājām rīkus rokas skeneriem operētājsistēmai Debian 9.x (visi mūsu kases aparāti ir Debian).

Atrisiniet mīklu: kā mirgot skenerim

Viktors Antipovs ziņo.

Pārdevēja nodroÅ”inātā oficiālā utilÄ«ta darbojas operētājsistēmā Windows un tikai ar IE. LietderÄ«ba var mirgot un konfigurēt skeneri.

Tā kā mūsu mērķa sistēma ir Debian, mēs instalējām usb-redirector serveri Debian un usb-redirector klientu operētājsistēmā Windows. Izmantojot usb-redirector utilītas, mēs pārsūtījām skeneri no Linux iekārtas uz Windows iekārtu.

Windows pārdevēja utilÄ«ta redzēja skeneri un pat to normāli pazibināja. Tādējādi mēs izdarÄ«jām pirmo secinājumu: nekas nav atkarÄ«gs no OS, tas ir mirgojoŔā protokola jautājums.

LABI. Mēs palaidām mirgoÅ”anu operētājsistēmā Windows un noņēmām izgāztuves operētājsistēmā Linux.

Mēs iebāzām izgāztuvi WireShark un... kļuva skumji (es izlaidÄ«Å”u dažas izgāztuves detaļas, tās neinteresē).

Ko izgāztuve mums parādīja:

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Adreses 0000-0030, spriežot pēc Wireshark, ir USB pakalpojuma informācija.

Mūs interesēja daļa 0040-0070.

No viena pārraides kadra nekas nebija skaidrs, izņemot MOCFT rakstzÄ«mes. Å Ä«s rakstzÄ«mes izrādÄ«jās rakstzÄ«mes no programmaparatÅ«ras faila, kā arÄ« atlikuŔās rakstzÄ«mes lÄ«dz kadra beigām (programmaparatÅ«ras fails ir iezÄ«mēts):

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Ko nozīmēja simboli fd 3e 02 01 fe, man personīgi, tāpat kā Iļjam, nebija ne jausmas.

Es paskatÄ«jos uz Ŕādu rāmi (Å”eit ir noņemta pakalpojuma informācija, programmaparatÅ«ras fails ir izcelts):

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Kas kļuva skaidrs? Ka pirmie divi baiti ir sava veida konstante. Visi nākamie bloki to apstiprināja, bet pirms pārraides bloka beigām:

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Å is kadrs bija arÄ« satriecoÅ”s, jo konstante bija mainÄ«jusies (izcelta) un, dÄ«vainā kārtā, bija daļa no faila. Faila pārsÅ«tÄ«to baitu lielums liecināja, ka tika pārsÅ«tÄ«ti 1024 baiti. Es atkal nezināju, ko nozÄ«mē atlikuÅ”ie baiti.

Pirmkārt, kā vecs BBS segvārds, es pārskatÄ«ju standarta pārraides protokolus. Neviens protokols nepārsÅ«tÄ«ja 1024 baitus. Es sāku pētÄ«t aparatÅ«ru un saskāros ar 1K Xmodem protokolu. Tas ļāva pārsÅ«tÄ«t 1024, taču ar piesardzÄ«bu: sākumā tikai 128, un tikai tad, ja nebija kļūdu, protokols palielināja pārsÅ«tÄ«to baitu skaitu. Man uzreiz bija 1024 baitu pārsÅ«tÄ«Å”ana. Es nolēmu izpētÄ«t pārraides protokolus un Ä«paÅ”i X-modemu.

Modemam bija divas variācijas.

Pirmkārt, XMODEM pakotnes formāts ar CRC8 atbalstu (oriģinālais XMODEM):

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Otrkārt, XMODEM pakeŔu formāts ar CRC16 atbalstu (XmodemCRC):

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Tas izskatās līdzīgi, izņemot SOH, iepakojuma numuru un CRC un iepakojuma garumu.

Es paskatījos uz otrā pārraides bloka sākumu (un atkal redzēju programmaparatūras failu, bet jau ar 1024 baitiem atkāpi):

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Es redzēju pazÄ«stamo galveni fd 3e 02, bet nākamie divi baiti jau bija mainÄ«juÅ”ies: tas bija 01 fe un kļuva par 02 fd. Tad es pamanÄ«ju, ka otrais bloks tagad ir numurēts ar 02 un tādējādi sapratu: manā priekŔā bija pārraides bloka numerācija. Pirmais 1024 pārnesums ir 01, otrais ir 02, treÅ”ais ir 03 un tā tālāk (bet, protams, seÅ”stÅ«rÄ«). Bet ko nozÄ«mē pāreja no fe uz fd? Acis redzēja samazinājumu par 1, smadzenes atgādināja, ka programmētāji skaita no 0, nevis 1. Bet kāpēc tad pirmais bloks ir 1, nevis 0? Es joprojām neesmu atradis atbildi uz Å”o jautājumu. Bet es sapratu, kā tiek skaitÄ«ts otrais bloks. Otrais bloks ir nekas cits kā FF ā€“ (mÄ«nus) pirmā bloka numurs. Tādējādi otrais bloks tika apzÄ«mēts kā = 02 (FF-02) = 02 FD. Turpmākā izgāztuves lasÄ«Å”ana apstiprināja manu minējumu.

Tad sāka parādÄ«ties Ŕāds pārraides attēls:

Pārraides sākums
fd 3e 02 ā€“ Sākt
01 FE ā€“ pārraides skaitÄ«tājs
PārsÅ«tÄ«Å”ana (34 bloki, pārsÅ«tÄ«ti 1024 baiti)
fd 3e 1024 baiti datu (sadalīti 30 baitu blokos).
Pārraides beigas
fd 25

AtlikuÅ”ie dati jāsaskaņo ar 1024 baitiem.

Kā izskatās bloka transmisijas gala rāmis:

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

fd 25 ā€“ signāla uz beigu bloka pārraide. Nākamais 2f 52 ā€“ pārējais fails lÄ«dz 1024 baitiem. 2f 52, spriežot pēc protokola, ir 16 bitu CRC kontrolsumma.

Veco laiku labā es izveidoju programmu C valodā, kas no faila izvilka 1024 baitus un aprēķināja 16 bitu CRC. Programmas palaiÅ”ana parādÄ«ja, ka Ŕī nav 16 bitu CRC. Atkal stupors - apmēram trÄ«s dienas. Visu Å”o laiku mēģināju saprast, kas tas varētu bÅ«t, ja ne kontrolsumma. Studējot angļu valodas vietnes, atklāju, ka X-modems izmanto savu kontrolsummas aprēķinu - CRC-CCITT (XModem). Es neatradu nevienu Ŕī aprēķina C ievieÅ”anu, bet es atradu vietni, kas aprēķināja Å”o kontrolsummu tieÅ”saistē. PārsÅ«tot uz tÄ«mekļa lapu 1024 baitus no mana faila, vietne man parādÄ«ja kontrolsummu, kas pilnÄ«bā atbilda faila kontrolsummai.

Urrā! Pēdējā mÄ«kla tika atrisināta, tagad man vajadzēja izveidot savu programmaparatÅ«ru. Tālāk es nodevu savas zināŔanas (un tās palika tikai manā galvā) Iļjam, kurÅ” ir pazÄ«stams ar jaudÄ«go rÄ«ku komplektu Python.

Programmas izveide

Iļja AleÅ”ins ziņo.

Saņēmis atbilstoÅ”os norādÄ«jumus, es biju ļoti ā€œlaimÄ«gsā€.

Kur sākt? TieÅ”i tā, no sākuma. ļŠ No USB porta noņemÅ”anas.

Palaidiet USB-pcap https://desowin.org/usbpcap/tour.html

Atlasiet portu, kuram ierīce ir pievienota, un failu, kurā saglabāsim izgāztuvi.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Mēs savienojam skeneri ar iekārtu, kurā ir instalēta sākotnējā EZConfigScanning programmatūra operētājsistēmai Windows.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Tajā mēs atrodam vienumu komandu nosÅ«tÄ«Å”anai uz ierÄ«ci. Bet kā ar komandām? Kur tās var dabÅ«t?
Programmai startējot, iekārta tiek aptaujāta automātiski (to redzēsim nedaudz vēlāk). Un tur bija mācību svītrkodi no oficiālajiem ekipējuma dokumentiem. DEFALT. Šī ir mūsu komanda.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

NepiecieÅ”amie dati ir saņemti. Atveriet dump.pcap, izmantojot wireshark.

Bloķēt, startējot EZConfigScanning. Vietas, kurām jāpievērÅ” uzmanÄ«ba, ir atzÄ«mētas ar sarkanu krāsu.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Pirmo reizi to visu redzot, es zaudēju sirdi. Nav skaidrs, kur rakt tālāk.

Neliela prāta vētra un-un-un... Aha! Izgāztuvē ārā - Vai inUn in Å”is ārā.

Pameklēju googlē, kas ir URB_INTERRUPT. Uzzināju, ka Ŕī ir datu pārsÅ«tÄ«Å”anas metode. Un ir 4 Ŕādas metodes: kontrole, pārtraukums, izohrons, lielapjoma. Par tiem var lasÄ«t atseviŔķi.

Un galapunktu adreses USB ierÄ«ces saskarnē var iegÅ«t, izmantojot komandu ā€œlsusb ā€“vā€, vai izmantojot pyusb.

Tagad mums ir jāatrod visas ierÄ«ces ar Å”o VID. Varat meklēt Ä«paÅ”i pēc VID:PID.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Tas izskatās Ŕādi:

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Tātad, mums ir nepiecieÅ”amā informācija: P_INFO komandas. vai DEFALT, adreses, kur rakstÄ«t komandas endpoint=03 un kur iegÅ«t atbildi endpoint=86. Atliek tikai konvertēt komandas uz hex.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Tā kā ierīci jau esam atraduŔi, atvienosim to no kodola...

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

...un rakstiet galapunktam ar adresi 0x03,

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

... un pēc tam nolasiet galapunkta atbildi ar adresi 0x86.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Strukturēta atbilde:

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

Mēs redzam Å”os datus dump.pcap.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Lieliski! Konvertējiet sistēmas svītrkodus uz hex. Tas arī viss, apmācības funkcionalitāte ir gatava.

Kā ar programmaparatūru? Šķiet, ka viss ir tāpat, bet ir kāda nianse.

Pēc pilnÄ«gas mirgoÅ”anas procesa izgāztuves mēs aptuveni sapratām, ar ko mums ir darÄ«Å”ana. Å eit ir raksts par XMODEM, kas bija ļoti noderÄ«gs, lai saprastu, kā notiek Ŕī saziņa, lai gan vispārÄ«gi: http://microsin.net/adminstuff/others/xmodem-protocol-overview.html Iesaku izlasÄ«t.

Aplūkojot izgāztuvi, jūs varat redzēt, ka kadra izmērs ir 1024, bet URB datu izmērs ir 64.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Tātad ā€“ 1024/64 ā€“ blokā iegÅ«stam 16 rindiņas, pa 1 rakstzÄ«mei nolasām programmaparatÅ«ras failu un veidojam bloku. 1 rindiņas papildināŔana blokā ar speciālajām rakstzÄ«mēm fd3e02 + bloka numurs.
Nākamās 14 rindas tiek papildinātas ar fd25 +, izmantojot XMODEM.calc_crc() aprēķinām visa bloka kontrolsummu (pagāja daudz laika, lai saprastu, ka ā€œFF ā€“ 1ā€ ir CSUM) un tiek papildināta pēdējā, 16. rinda. ar fd3e.

Å Ä·iet, ka viss, izlasiet programmaparatÅ«ras failu, nospiediet blokus, atvienojiet skeneri no kodola un nosÅ«tiet to uz ierÄ«ci. Bet tas nav tik vienkārÅ”i. Skeneris ir jāpārslēdz uz programmaparatÅ«ras režīmu,
Š¾Ń‚ŠæрŠ°Š²ŠøŠ² ŠµŠ¼Ńƒ NEWAPP = ā€˜\xfd\x0a\x16\x4e\x2c\x4e\x45\x57\x41\x50\x50\x0dā€™.
No kurienes Ŕī komanda?? No izgāztuves.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Bet mēs nevaram nosÅ«tÄ«t visu bloku skenerim 64 ierobežojuma dēļ:

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Nu, skeneris NEWAPP mirgoÅ”anas režīmā nepieņem hex. Tāpēc jums bÅ«s jātulko katra rinda bytes_array

[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]

Un pēc tam nosÅ«tiet Å”os datus uz skeneri.

Mēs saņemam atbildi:

[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]

Pārbaudot rakstu par XMODEM, kļūs skaidrs: dati ir pieņemti.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

Kad visi bloki ir pārsÅ«tÄ«ti, mēs pabeidzam pārsÅ«tÄ«Å”anu END_TRANSFER = 'xfdx01x04'.

Tā kā Å”ie bloki nesniedz nekādu informāciju parastajiem cilvēkiem, mēs pēc noklusējuma instalēsim programmaparatÅ«ru slēptā režīmā. Un katram gadÄ«jumam mēs organizēsim progresa joslu, izmantojot tqdm.

Uzdevums izstrādātājam jeb tas, kā mēs zibspuldzi izmantojām rokas skenerus bez pārdevēja

PatiesÄ«bā tad runa ir par sÄ«kumiem. Atliek tikai ietÄ«t risinājumu skriptos masveida replikācijai skaidri noteiktā laikā, lai nepalēninātu darba procesu pie kasēm, un pievienot reÄ£istrÄ“Å”anu.

Kopsavilkums

Patērējot daudz laika un pūļu un matus uz galvas, mēs varējām izstrādāt nepiecieÅ”amos risinājumus, kā arÄ« ievērot termiņu. Tajā paŔā laikā skeneri tagad tiek atjaunināti un atkārtoti apmācÄ«ti centralizēti, mēs skaidri kontrolējam visu procesu. Uzņēmums ietaupÄ«ja laiku un naudu, un mēs guvām nenovērtējamu pieredzi Ŕāda veida reversās inženierijas iekārtās.

Avots: www.habr.com

Pievieno komentāru