Salama daholo.
Izahay, Victor Antipov sy Ilya Aleshin, dia hiresaka momba ny traikefanay miasa amin'ny fitaovana USB amin'ny alàlan'ny Python PyUSB ary kely momba ny reverse engineering.

prehistory
Tamin'ny taona 2019, ny didim-panjakana 224 ao amin'ny Federasiona Rosiana "Momba ny fankatoavana ny fitsipika momba ny fametahana ny vokatra paraky miaraka amin'ny fomba famantarana sy ny endri-javatra amin'ny fampiharana ny rafitry ny fampahalalam-baovaom-panjakana amin'ny fanaraha-maso ny fiparitahan'ny entana iharan'ny fametahana marika miaraka amin'ny fomba famantarana. momba ny vokatra paraky” dia nanan-kery.
Hazavain’ilay antontan-taratasy fa manomboka ny 1 Jolay 2019, dia tsy maintsy manisy marika isaky ny fonosana paraky ny mpanamboatra. Ary ny mpaninjara mivantana dia tsy maintsy mahazo ireo vokatra ireo miaraka amin'ny fanatanterahana ny antontan-taratasy fifindran'ny rehetra (UDD). Ny fivarotana indray dia mila manoratra ny fivarotana ny vokatra misy marika amin'ny alàlan'ny rejisitra.
Ary koa, manomboka ny 1 Jolay 2020, dia voarara ny fiparitahan'ny vokatra paraky tsy misy marika. Midika izany fa ny fonosana sigara rehetra dia tsy maintsy asiana marika manokana Datamatrix barcode. Ankoatra izany - teboka manan-danja - dia hita fa ny Datamatrix dia tsy ho mahazatra, fa inverse. Izany hoe tsy code mainty amin'ny fotsy, fa ny mifamadika amin'izany.
Nanandrana ny scanner izahay, ary hita fa ny ankamaroan'izy ireo dia mila averina / averina, raha tsy izany dia tsy afaka miasa ara-dalàna amin'ity barcode ity izy ireo. Io fihodin'ny zava-nitranga io dia niantoka ny aretin'andoha mafy, satria ny orinasanay dia manana fivarotana be dia be izay miparitaka amin'ny faritany midadasika. Rejistra vola an'aliny maro – ary fotoana kely.
Inona no tokony hatao? Misy safidy roa. Voalohany: ny injeniera eny an-toerana dia manitsy sy manitsy ny scanner. Faharoa: miasa lavitr'ezaka izahay ary, tsara kokoa, mandrakotra scanner maro indray mandeha amin'ny indray mandeha.
Ny safidy voalohany, mazava ho azy, dia tsy mety aminay: tsy maintsy mandany vola amin'ny injeniera mpitsidika izahay, ary amin'ity tranga ity dia sarotra ny mifehy sy mandrindra ny dingana. Fa ny tena zava-dehibe dia ny fiasan'ny olona, izany hoe, mety hahazo fahadisoana be dia be isika ary mety tsy mahafeno ny fe-potoana.
Ny safidy faharoa dia tsara ho an'ny rehetra, raha tsy amin'ny zavatra iray. Ny mpivarotra sasany dia tsy nanana ny fitaovana tselatra lavitra ilaintsika ho an'ny rafitra fiasana rehetra ilaina. Ary satria efa lany ny fe-potoana, dia tsy maintsy nieritreritra tamin'ny lohako aho.
Manaraka izany dia holazainay aminao ny fomba namolavolanay fitaovana ho an'ny scanner tànana ho an'ny Debian 9.x OS (any amin'ny Debian daholo ny rejisitra misy anay).
Vahaolana ny ankamantatra: ny fomba tselatra scanner
Victor Antipov mitatitra.
Ny fitaovana ofisialy omen'ny mpivarotra dia miasa amin'ny Windows, ary miaraka amin'ny IE ihany. Ny fitaovana dia afaka mitselatra sy manamboatra ny scanner.
Satria ny rafitra kendrenay dia Debian, nametraka mpizara usb-redirector amin'ny Debian izahay ary mpanjifa usb-redirector amin'ny Windows. Amin'ny fampiasana fitaovana usb-redirector, nafindranay ny scanner avy amin'ny milina Linux mankany amin'ny milina Windows.
Nisy fitaovana iray avy amin'ny mpivarotra Windows nahita ny scanner ary namela azy io ara-dalàna mihitsy aza. Noho izany, nanao ny fehin-kevitra voalohany izahay: tsy misy na inona na inona miankina amin'ny OS, resaka momba ny protocol flash izany.
OK. Nihazakazaka ny flashing tamin'ny milina Windows izahay, ary nesorinay ny fanariam-pako tamin'ny milina Linux.
Nofonosinay tao amin'ny WireShark ilay fanariam-pako ary... nalahelo izahay (Afoiko ny antsipirihan'ny fanariam-pako, tsy mahaliana azy ireo).
Ny nasehon'ilay fanariam-pako anay:


Ny adiresy 0000-0030, raha tsarain'ny Wireshark, dia fampahalalana momba ny serivisy USB.
Nahaliana anay ny ampahany 0040-0070.
Tsy nisy nazava tamin'ny rafitra fampitana iray afa-tsy ny tarehin-tsoratra MOCFT. Ireo endri-tsoratra ireo dia nivadika ho tarehin-tsoratra avy amin'ny rakitra firmware, ary koa ireo endri-tsoratra sisa tavela hatramin'ny faran'ny frame (nasongadina ny rakitra firmware):

Inona no dikan'ireo marika fd 3e 02 01 fe, izaho manokana, toa an'i Ilya, dia tsy nahafantatra.
Nijery ity frame manaraka ity aho (efa nesorina teto ny fampahalalana momba ny serivisy, nasongadina ny rakitra firmware):

Inona no lasa nazava? Ny bita roa voalohany dia karazana tsy miova. Ny sakana rehetra manaraka dia nanamafy izany, saingy talohan'ny fiafaran'ny sakana fampitana:

Nahatalanjona ihany koa ity frame ity, satria niova ny tsy miova (nasongadina) ary, mahagaga, nisy ampahany tamin'ilay rakitra. Ny haben'ny bytes nafindran'ny rakitra dia nampiseho fa 1024 bytes no nafindra. Tsy fantatro indray ny dikan'ny bytes sisa.
Voalohany indrindra, amin'ny maha-anaram-bositra BBS taloha ahy, dia nandinika ny protocols fandefasana mahazatra aho. Tsy misy protocole nampitaina 1024 bytes. Nanomboka nianatra ny fitaovana aho ary nahita ny protocol 1K Xmodem. Namela ny famindrana ny 1024, fa miaraka amin'ny fampitandremana: tamin'ny voalohany 128 ihany, ary raha tsy misy ny fahadisoana, ny protocol dia nampitombo ny isan'ny bytes nafindra. Avy hatrany dia nahazo famindrana 1024 bytes aho. Nanapa-kevitra ny hianatra ny protocol transmissions aho, ary indrindra ny X-modem.
Nisy karazany roa ny modem.
Voalohany, ny endrika fonosana XMODEM miaraka amin'ny fanohanana CRC8 (ny XMODEM tany am-boalohany):

Faharoa, ny endrika fonosana XMODEM miaraka amin'ny fanohanana CRC16 (XmodemCRC):

Mitovitovy ihany izy io, afa-tsy ny SOH, ny laharan'ny fonosana ary ny CRC ary ny halavan'ny fonosana.
Nijery ny fiandohan'ny sakana fampitana faharoa aho (ary nahita indray ny rakitra firmware, saingy efa voasokitra 1024 bytes):

Hitako ilay lohapejy mahazatra fd 3e 02, fa efa niova ny bytes roa manaraka: 01 fe io, ary lasa 02 fd. Dia nahatsikaritra aho fa misy laharana 02 izao ny bloc faharoa ka azoko hoe: teo anoloako ny laharan'ny bloc transmission. Ny fitaovana 1024 voalohany dia 01, ny faharoa dia 02, ny fahatelo dia 03 sy ny sisa (fa amin'ny hex, mazava ho azy). Inona anefa no dikan'ny fiovan'ny fe ho fd? Ny maso dia nahita fihenan'ny 1, ny atidoha dia nampahatsiahy fa ny programmer dia manisa avy amin'ny 0, fa tsy 1. Fa maninona no 1 ny sakana voalohany, fa tsy 0? Mbola tsy hitako ny valin'io fanontaniana io. Saingy azoko ny fomba fanisana ny andiany faharoa. Ny sakana faharoa dia tsy mihoatra ny FF – (minus) ny isan'ny sakana voalohany. Noho izany, ny sakana faharoa dia voatondro ho = 02 (FF-02) = 02 FD. Ny famakiana ny fanariam-pako taty aoriana dia nanamafy ny hevitro.
Avy eo dia nanomboka nipoitra ity sarin'ny fampitana manaraka ity:
Manomboka ny fampitana
fd 3e 02 – Manomboka
01 FE – kaontera fampitana
Famindrana (34 blocs, 1024 bytes nafindra)
fd 3e 1024 octets ny angon-drakitra (mizara ho 30 byte blocs).
Faran'ny fampitana
fd 25
Ny angon-drakitra sisa tavela hifanaraka amin'ny 1024 bytes.
Manao ahoana ny endriky ny rafitra fiafaran'ny fandefasana sakana:

fd 25 – famantarana hamaranana ny fifindran'ny sakana. Manaraka 2f 52 - ny ambiny amin'ny rakitra hatramin'ny 1024 ots ny habeny. 2f 52, raha tsaraina amin'ny protocol, dia 16-bit CRC checksum.
Ho an'ny taloha, dia nanao fandaharana amin'ny C aho izay nisintona 1024 bytes tamin'ny rakitra iray ary nanao kajy CRC 16-bit. Nasehon'ny fandefasana ny programa fa tsy CRC 16-bit ity. Stupor indray - mandritra ny telo andro. Nandritra izany fotoana izany dia niezaka ny hahatakatra izay mety ho izy, raha tsy checksum. Teo am-pandalinana ireo tranonkala amin'ny teny anglisy aho dia nahita fa ny X-modem dia mampiasa ny kajy checksum azy manokana - CRC-CCITT (XModem). Tsy nahita fampiharana C an'ity kajy ity aho, fa nahita tranokala iray nanao kajy an-tserasera ity checksum ity. Rehefa avy namindra 1024 bytes ny rakitrako tao amin'ny pejin-tranonkala, ny tranokala dia naneho ahy checksum izay mifanaraka tanteraka amin'ny checksum avy amin'ny rakitra.
Hooray! Voavaha ny ankamantatra farany, mila manamboatra ny firmware-ko manokana aho izao. Avy eo, nampita ny fahalalako aho (ary nijanona tao an-dohako ihany) tamin'i Ilya, izay mahafantatra ny Python fitaovana mahery vaika.
Mamorona programa
Tatitra i Ilya Aleshin.
Tena “faly” aho rehefa nahazo ny toromarika mety.
Aiza no hanombohana? Marina izany, hatramin’ny voalohany. Avy amin'ny fakana fanariam-pako avy amin'ny seranan-tsambo USB.
Sokafy ny USB-pcap
Safidio ny seranan-tsambo izay mampifandray ny fitaovana sy ny rakitra izay hamonjena ny fanariam-pako.

Ampifandraisinay amin'ny milina iray misy ny rindrambaiko EZConfigScanning teratany ho an'ny Windows ny scanner.

Ao anatin'izany no ahitantsika ny singa handefasana baiko amin'ny fitaovana. Ahoana anefa ny ekipa? Aiza no ahazoako azy ireo?
Rehefa manomboka ny fandaharana, dia hodinihina ho azy ny fitaovana (ho hitantsika aoriana kely izany). Ary nisy barcode fanofanana avy amin'ny antontan-taratasy ofisialy fitaovana. DEFALT. Ity ny ekipanay.

Voaray ny angona ilaina. Sokafy ny dump.pcap amin'ny alalan'ny wireshark.
Sakanana rehefa manomboka EZConfigScanning. Misy marika mena ny toerana tokony hojerenao.


Sambany vao nahita an’izany rehetra izany aho, dia very hevitra. Tsy fantatra hoe aiza no handavaka manaraka.
Fihetseham-po kely sy-sy-ary... Aha! Ao amin'ny fanariam-pako avy - dia inary in izany avy.
Nijery ny atao hoe URB_INTERRUPT aho. Hitako fa fomba famindrana angon-drakitra izany. Ary misy fomba 4 toy izany: fanaraha-maso, interrupt, isochronous, bulk. Afaka mamaky momba azy ireo mitokana ianao.
Ary ny adiresin'ny teboka farany amin'ny seha-pifandraisana USB dia azo alaina amin'ny alalan'ny baiko "lsusb -v" na amin'ny fampiasana pyusb.
Ankehitriny dia mila mitady fitaovana rehetra miaraka amin'ity VID ity isika. Azonao atao ny mikaroka manokana amin'ny VID:PID.
![]()
Toy izao izany:


Noho izany, manana ny fampahalalana ilaina izahay: ny baiko P_INFO. na DEFALT, adiresy hoe aiza no hanoratana baiko endpoint=03 ary aiza no hahazoana ny valiny endpoint=86. Ny hany sisa tavela dia ny mamadika ny baiko ho hex.
![]()

Koa satria efa hitanay ilay fitaovana, andao hanaisotra azy amin'ny kernel...

...ary manorata amin'ny teboka farany misy adiresy 0x03,

... ary vakio avy eo ny valiny avy amin'ny teboka farany misy adiresy 0x86.

Valiny voarafitra:
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: 0x6986Hitanay ao amin'ny dump.pcap ity angona ity.



Mahafinaritra! Hanova ny barcodes rafitra ho hex. Izay ihany, efa vonona ny asa fanofanana.
Ahoana ny momba ny firmware? Toa mitovy daholo ny zava-drehetra, saingy misy ny nuance.
Rehefa avy nanao fanariam-pako tanteraka ny fizotran'ny tselatra izahay, dia azonay tamin'ny ankapobeny ny zavatra niatrehanay. Ity misy lahatsoratra momba ny XMODEM, izay tena nanampy tamin'ny fahatakarana ny fandehan'ity fifandraisana ity, na dia amin'ny ankapobeny aza: Manoro hevitra aho hamaky azy io.
Raha mijery ny fanariam-pako ianao dia hitanao fa 1024 ny haben'ny frame, ary 64 ny haben'ny data URB.

Noho izany - 1024/64 – mahazo tsipika 16 ao anaty sakana iray isika, vakio ny rakitra firmware 1 isaky ny mandeha ary manangana sakana. Mameno andalana 1 ao anaty sakana misy tarehintsoratra manokana fd3e02 + laharan'ny sakana.
Ny andalana 14 manaraka dia ampiana fd25 +, amin'ny fampiasana XMODEM.calc_crc() dia kajy ny checksum ny sakana iray manontolo (nandany fotoana be vao nahatakatra fa ny "FF - 1" dia CSUM) ary ny laharana faha-16 farany dia ampiana. sy fd3e.
Toa izany no izy, vakio ny rakitra firmware, tsindrio ny sakana, esory ny scanner amin'ny kernel ary alefaso any amin'ny fitaovana. Saingy tsy dia tsotra izany. Ny scanner dia tsy maintsy avadika amin'ny mode firmware,
отправив ему NEWAPP = ‘\xfd\x0a\x16\x4e\x2c\x4e\x45\x57\x41\x50\x50\x0d’.
Avy aiza ity ekipa ity?? Avy amin'ny fanariam-pako.

Saingy tsy afaka mandefa sakana iray manontolo amin'ny scanner izahay noho ny fetra 64:
![]()
Eny, tsy manaiky hex ny scanner amin'ny fomba tselatra NEWAPP. Noho izany dia tsy maintsy mandika ny andalana tsirairay bytes_array ianao
[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]Ary avy eo dia alefaso any amin'ny scanner ity data ity.
Azontsika ny valiny:
[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]Raha mijery ny lahatsoratra momba ny XMODEM ianao dia hazava: nekena ny angona.

Rehefa avy nafindra ny sakana rehetra dia vitantsika ny famindrana END_TRANSFER = 'xfdx01x04'.
Eny, satria ireo sakana ireo dia tsy mitondra fampahalalana ho an'ny olon-tsotra, dia hametraka ny firmware amin'ny fomba miafina izahay. Ary raha sanatria, handamina bara fandrosoana amin'ny alàlan'ny tqdm izahay.
![]()
Raha ny marina, dia resaka zavatra kely izany. Ny hany sisa tavela dia ny famenoana ny vahaolana amin'ny script ho an'ny replication faobe amin'ny fotoana voafaritra mazava, mba tsy hampiadana ny dingan'ny fiasana amin'ny checkout, ary ampio ny logging.
Ny vokany
Rehefa nandany fotoana sy ezaka ary volo teo amin'ny lohanay izahay, dia afaka namolavola ny vahaolana nilainay, ary nahafeno ny fe-potoana ihany koa. Mandritra izany fotoana izany, ny scanner dia reflashed sy retrained afovoany, mazava tsara mifehy ny dingana manontolo. Namonjy fotoana sy vola ny orinasa, ary nahazo traikefa sarobidy tamin'ny fitaovana injeniera mivadika toy izany izahay.
Source: www.habr.com
