Tlaciaren Samsung ML-2525 - firmware
Moderátor: Moderátoři
Zistil som, ze to asi nebude len ID typu tlaciarne, ale pravdepodobne nejako suvisi aj s verziou firmwaru. Ale stale neviem, odkial to pochadza.
ML2520_V1.01.00.84.fls: 000F69A4
FIX_NU_0000-0000000000_ML2525_V1.01.00.85.hd: 000F69A5
ML2520_V1.01.00.86.fls: 000F69A5
FIX_NU_0000-0000000000_ML1660_V1.01.00.34.hd: 000F9082
FIX_0000-0000000000_ML1660_V1.01.00.35.hd: 000F9083
ML2520_V1.01.00.84.fls: 000F69A4
FIX_NU_0000-0000000000_ML2525_V1.01.00.85.hd: 000F69A5
ML2520_V1.01.00.86.fls: 000F69A5
FIX_NU_0000-0000000000_ML1660_V1.01.00.34.hd: 000F9082
FIX_0000-0000000000_ML1660_V1.01.00.35.hd: 000F9083
Tak jsem se v tom ještě chvíli vrtala. Zjistila jsem, že ten vlastní kernel (začíná na 0x1C00C a je dlouhý 0x41FEC) je šifrovaný pomocí nějakých dvou tabulek (proto v něm není čitelný žádný text). Flashovací program nejdříve testuje checksum toho nového image načteného z PC, ten zjevně sedí. Pak dešifruje do paměti jak ten nový, tak ten starý kernel a získá z nich jakási čísla, to jsou ta dvě čísla v [[[ ]]]. První je ze starého kernelu a druhé z nového. V algoritmu získání těch dvou čísel jsem se bohužel ztratila. Jen vím, že pokud vyjde to číslo záporné, hodí to chybu. A číslo patřící ke starému kernelu je záporné a tak to hodí "Image is invalid".
Porovnal som subory ML2520_V1.01.00.84.fls a ML2520_V1.01.00.86.fls, ktore maju rozdielne ID.
Prvy rozdiel je az na offsete 0x1c053, hned za zaciatkom nejakeho bloku (ked odrezem zo suboru hlavicku 45+12B, zacina tento blok presne na 0x1c000). Tento blok je cely zmeneny a je zjavne komprimovany (dalsia kompresia ho nezmensi). Ale nepasuje to na inflate, to by malo zacinat bajtom 0x78
Okrem tohoto bloku je zmena uz len na uplnom konci suboru, kde je priadny datum a posledne dva bajty, ktore su pravdepodobne checksum.
Prvy rozdiel je az na offsete 0x1c053, hned za zaciatkom nejakeho bloku (ked odrezem zo suboru hlavicku 45+12B, zacina tento blok presne na 0x1c000). Tento blok je cely zmeneny a je zjavne komprimovany (dalsia kompresia ho nezmensi). Ale nepasuje to na inflate, to by malo zacinat bajtom 0x78
Okrem tohoto bloku je zmena uz len na uplnom konci suboru, kde je priadny datum a posledne dva bajty, ktore su pravdepodobne checksum.
No to je ten vlastní kernel se svojí hlavičkou, první 4B je $NKF, další 4B je jakási adresa, se kterou se pak operuje v tom divném algoritmu a třetí 4B jsou délka kernelu.rnbw píše:zacina tento blok presne na 0x1c000
Jinak ten datum na konci je také důležitý, pokud je starší než datum uvedený ve flashovacím programu (tady 2008-04-02), tak vypíše chybu Can't Update Old Rom.
Edit: Co se do toho zkusit nabourat přes ten JTAG například pomocí OpenOCD? Tím by šla nejspíš přečíst a přepsat i ta flashka. ARM940T by měl umět.
Urobil som jednoduchy kabel len s odpormi - vid priloha (FET som vynechal pretoze CPU nema signal SRST). Zapojil som to podla jedineho dostupneho zapojenia pinov pre Jupiter4E (vid priloha 2).
Prvy pokus neuspesny:
Zistil som, ze signal nTRST je uzemneny cez R1 (33R), tak som ho odstranil. Teraz to asi funguje, len treba pouzit iny program (?):
Prvy pokus neuspesny:
Kód: Vybrat vše
$ jtag
UrJTAG 0.10 #1502
Copyright (C) 2002, 2003 ETC s.r.o.
Copyright (C) 2007, 2008, 2009 Kolja Waschk and the respective authors
UrJTAG is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
There is absolutely no warranty for UrJTAG.
WARNING: UrJTAG may damage your hardware!
Type "quit" to exit, "help" for help.
jtag> cable wiggler help
Usage: cable WIGGLER parallel PORTADDR [TDO,TRST,TDI,TCK,TMS,SRESET]
or: cable WIGGLER ppdev PPDEV [TDO,TRST,TDI,TCK,TMS,SRESET]
PORTADDR parallel port address (e.g. 0x378)
PPDEV ppdev device (e.g. /dev/parport0)
TDO, ... parallel port bit number, prepend '#' for inversion
default is '7,4,3,2,1,#0'
jtag> cable wiggler ppdev /dev/parport0
Initializing ppdev port /dev/parport0
jtag> detect
Warning: TDO seems to be stuck at 0
jtag> detect
Warning: TDO seems to be stuck at 0
jtag> print
Run "detect" first.
jtag> quit
Kód: Vybrat vše
$ jtag
UrJTAG 0.10 #1502
Copyright (C) 2002, 2003 ETC s.r.o.
Copyright (C) 2007, 2008, 2009 Kolja Waschk and the respective authors
UrJTAG is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
There is absolutely no warranty for UrJTAG.
WARNING: UrJTAG may damage your hardware!
Type "quit" to exit, "help" for help.
jtag> cable wiggler ppdev /dev/parport0
Initializing ppdev port /dev/parport0
jtag> detect
IR length: 4
Chain length: 1
Device Id: 0 (0x0000000000000000)
chain.c(149) Part 0 without active instruction
chain.c(200) Part 0 without active instruction
chain.c(149) Part 0 without active instruction
jtag> print
No. Manufacturer Part Stepping Instruction Register
------------------------------------------------------------------------------------------------------------------
0 (none) (none)
jtag> quit
- Přílohy
-
- jupiter4e.png
- (82.91 KiB) Staženo 51 x
-
- jtag_wiggler_unbuf.png
- (19.41 KiB) Staženo 62 x
Tak skutocne to zije. OpenOCD som skompiloval najnovsi. Prvy pokus:
Podla ID som nasiel na webe nejaky konfigurak, tak som ho upravil:
A uz to vyzera lepsie:
Flash zacina od adresy 0, takze sa to teraz nacitava (ide to hrozne pomaly).
Kód: Vybrat vše
# ./openocd -f ../tcl/interface/parport.cfg
Open On-Chip Debugger 0.6.1 (2013-03-14-20:43)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Warn : Adapter driver 'parport' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
parport port = 0x378
adapter speed: 1 kHz
Info : clock speed 1 kHz
Warn : There are no enabled taps. AUTO PROBING MIGHT NOT WORK!!
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -expected-id 0x10940f0f ..."
Warn : AUTO auto0.tap - use "... -irlen 4"
Warn : gdb services need one or more targets defined
Info : accepting 'telnet' connection from 4444
Kód: Vybrat vše
$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> scan_chain
TapName Enabled IdCode Expected IrLen IrCap IrMask
-- ------------------- -------- ---------- ---------- ----- ----- ------
0 auto0.tap Y 0x10940f0f 0x10940f0f 4 0x01 0x03
Kód: Vybrat vše
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME arm
}
if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}
if { [info exists CPUTAPID ] } {
set _CPUTAPID $CPUTAPID
} else {
# force an error till we get a good number
#set _CPUTAPID 0xffffffff
set _CPUTAPID 0x10940f0f
}
jtag newtap arm taptap -irlen 4 -ircapture 0x1 -irmask 0xf
target create arm arm9tdmi -endian big -variant arm940t -chain-position 0
reset_config trst_and_srst srst_pulls_trst
init
halt
poll off
#source scripts.cf
#dc
poll
#ic
armv4_5 reg
Kód: Vybrat vše
# ./openocd -f ../tcl/interface/parport.cfg -f test.cfg
Open On-Chip Debugger 0.6.1 (2013-03-14-20:43)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Warn : Adapter driver 'parport' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
parport port = 0x378
adapter speed: 1 kHz
Warn : Specify TAP 'arm.taptap' by name, not number 0
trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
Info : clock speed 1 kHz
Info : JTAG tap: arm.taptap tap/device found: 0x10940f0f (mfg: 0x787, part: 0x0940, ver: 0x1)
Warn : JTAG tap: arm.taptap UNEXPECTED: 0x10940f0f (mfg: 0x787, part: 0x0940, ver: 0x1)
Error: Trying to use configured scan chain anyway...
Warn : Bypassing JTAG setup events due to errors
Info : Embedded ICE version 2
Info : arm: hardware has 2 breakpoint/watchpoint units
background polling: off
TAP: arm.taptap (enabled)
target state: halted
target halted in ARM state due to breakpoint, current mode: Undefined instruction
cpsr: 0x4000001b pc: 0xffffffe8
DEPRECATED! use 'arm reg' not 'armv4_5 reg'
System and User mode registers
r0: e8bd87f0 r1: e1a01004 r2: e3a00000 r3: ebfffc02
r4: e3590000 r5: 0a000001 r6: e2650000 r7: e8bd87f0
r8: e1a00005 r9: e8bd87f0 r10: e8bd87f0 r11: 00000000
r12: 00000000 sp_usr: bc733a57 lr_usr: f31be6b3 pc: ffffffe8
cpsr: 4000001b
FIQ mode shadow registers
r8_fiq: 8253c6cf r9_fiq: d9cb4385 r10_fiq: d37bbf72 r11_fiq: 96cf8a74
r12_fiq: b0331b05 sp_fiq: 02000914 lr_fiq: db7b3335 spsr_fiq: 000000b9
Supervisor mode shadow registers
sp_svc: 0200162c lr_svc: 02602840 spsr_svc: 10000011
Abort mode shadow registers
sp_abt: 02001114 lr_abt: 7ecf2fa7 spsr_abt: 00000010
IRQ mode shadow registers
sp_irq: 02000d14 lr_irq: 7bb35be6 spsr_irq: 300000bd
Undefined instruction mode shadow registers
sp_und: 00000000 lr_und: 00000000 spsr_und: 80000031
Info : accepting 'telnet' connection from 4444
Kód: Vybrat vše
$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> mdw 0
0x00000000: e59ff060
> mdw 1000
0x000003e8: eafffff8
> dump_image dump.bin 0 524288