Lieber Zuschauer, dieser Untertitel wurde automatisch generiert von YouTube und dementsprechend (sehr) fehlerhaft. Wenn du kannst, hilf uns bitte gute Untertitel zu erstellen: https://c3subtitles.de/talk/2277 Danke!
ich hoffe ihr seid bereit für diesen
Talk von jn hacking a set Receiver wir
werden heute ein Einblick in firilmware
hacking bekommen es geht um
firmwareformate framebffer Eigenheiten
der MIPS Architektur und Linux viel
Spaß ja genau ähm ich habe hier dieses
kleine Gerät ein satre Receiver der hat
auch ein paar Anschlüsse dran irgendwie
was für die Antenne USB
HDMI noch was anderes SC und seriellen
Port immer sehr nützlich wenn man Sachen
hacken will und ein paar Buttons auch
sehr schön und wenn man
reinschaut sieht man irgendwie ein
bisschen Flash das sieht man jetzt im
Bild nicht ganz so gut aber kleine
Bauteil und hier unter dem
Kühler einen ziemlich obskuren Chip mit
MIPS Prozessoren
drin um da jetzt irgendwas drüber
rauszufinden habe ich den Flash
ausgelesen und mal reingeschaut und dann
diese Struktur
gefunden da sind so ein paar Namen die
sind irgendwie
lesbar AV CPU IMG Demo weiter unten
resource und Logo sieht ja schon mal
interessant aus stellt sich dann heraus
es ist mehr oder weniger eine
Partitionstabelle die sagt wo im Flash
welche Daten
liegen also habe ich die extrahiert
äh und dann mal geschaut
und das ist schon mal interessant ein
paar davon sind komprimiert mit LZMA ein
übliches
Kompressionsverfahren und da in der
Mitte ist dieses ähm dieses jpack das
Logo
das ist eigentlich das Herstellerlogo
aber das habe ich ersetzt
mm und diese Partition Demo die da
relativ weit oben in der Liste ist das
ist MIPS Code wenn man das dekomprimiert
und den Disassembler wirft hier sieht
man jetzt irgendwie da werden Dinge
initialisiert das ist halt der Anfang
von der Firmware von
der fernsehanwendung die da
normalerweise drauf läuft
so wie bringe ich jetzt eigentlich
meinen eigenen Code da rein na ja ich
habe erstmal das Minimum geschrieben was
man an halbwegs nützlich im Code haben
kann eine kleine Schleife die den
Buchstaben A aus dem seriellen Port
rauswirft so oft wie möglich
m das dann installiert und nach
ein bisschen fluchen weil das nicht
alles so war wie erwartet hat das dann
funktioniert ich habe den Buchstaben A
rausgekriegt aus dem aus dem seriellen
Port der ja freundlicherweise verbaut
wurde aber das natürlich nicht besonders
nützlich ähm dieses Programm ähm also
habe ich ein anderes Programm da
reingeschrieben in den Flash ähm das so
ein bisschen Peak und poke erlaubt also
ähm Speicher und
ähm Register von den ähm von der
Peripherie
lesen und schreiben um
ähm um damit interaktiver mit der
Hardware umgehen zu können
die nächste Frage war wo ist eigentlich
mein framebffer denn hier aus diesem
HDMI Port kommt ja ein Bild raus und das
würde ich gerne beeinflussen können
ähm da hilft natürlich dass nach dem
Starten schon dieses Logo angezeigt
wurde also habe ich ähm
m mir so ein kleines Stückchen Code
geschrieben was
den das Programm auf dem
dieses Monitorprogramm fernsteuert und
m durch den RAM durchgeht und hier
jetzt alle 4 kilbte jeweils die ersten
32 Bit anzeigt das seht ihr rechts im
Bild und das ist so ein Bereich der ganz
interessant aussieht das oben oben
passiert nichts und in der Mitte
passiert so ein bisschen und unten
passiert wieder nichts
das scheint ja dem Bild zu entsprechen
im Bild von dem
Hai W man dann genauer hinguckt sieht
man die einzelnen Zeilen
wo anfängt was zu passieren die sind
genau
192 lang also eine Rasterzeile kann man
sich denken
das ist hier HDMI auf
1920 Pixel mal
1080 also dachte ich mir wenn ich den
framewfer anscheinend habe kann ich den
ja mal verschieben gucken was passiert
würde jetzt erwarten dass der HA sich
hochverschiebt aber das hat nicht so
ganz funktioniert es hat sich nur die
Farbe verschoben nicht die Helligkeit
das ist ja
interessant aber woanders an der anderen
Stelle konnte ich dann die Helligkeit
unabhängig von der Farbe beeinflussen
heißt wir haben eigentlich nicht einen
framewffer sondern zwei Stück einmal für
die den Farbton und einmal für die
Helligkeit mit etwas mehr
herumprobieren zeigte sich dann dass der
Farbraum aus diesen drei
Komponenten
hier so aussieht
also y cbcr das ist Helligkeit oder Luma
und Farbwert in blau und in rot Richtung
also Chroma blue und Chroma
red und das nächstes eigentlich kann man
da Linux drauf
tun der Hersteller hat kein Linux
verwendet sondern irgendwas
eigenes also musste ich mir das selber
basteln aber ja darauf kann Linux laufen
ähm noch nicht so komplett aber gut
verbessern geht immer
ähm ja wie wie portiert man jetzt
eigentlich Linux
ähm ähm das erste was man eigentlich
braucht ist irgendwie dem dem Linux die
Möglichkeit zu geben irgendwas
auszugeben damit man sieht was
passiert einmal für den Code der
den den Kernel nimmt und
dekomprimiert weil
der weil er eben um Platz zu sparen
komprimiert abgeschmeichert ist und dann
geladen wird und dekomprimiert wird das
ist
unter MIPS unter der MIPS Architektur
die die komon n Z Boot
m und das
das early print K tut eigentlich das
Gleiche aber für den Kernel wennner
schon geladen ist
und der der Treiber an der Stelle ist
auch relativ kurz der muss halt nur
wissen wie man einzeichen
ausgibt von daher war das noch relativ
schnell zu
machen
ähm unter MIPS ist es dann so wenn man
Linux
auf MIPS Chip
portiert da muss man dann irgendwie ein
bisschen einmal angeben was ist das
eigentlich also wie wie heißt
wie heißt meine meine
chipfilie und was kann die eigentlich
also hier z.B habe ich angegeben ist
irgendwie 32 B little iion es hat zboot
es hat early print K die Features die
eben schon erwähnt
wurden und dann muss man noch irgendwie
ein paar Funktionen schreiben die
irgendwie sagen ja wie wie heißt dieses
Gerät das H dieses get System type
und was mache ich um festzustellen wo
mein RAM liegt den lese ich ja aus dem
Device
stree Interrupts sind auch sehr wichtig
ir Linux laufen
soll hier dieser Chip hat einen eigenen
Interrupt Controller der der sorgt dafür
dass die interupts von der den
verschiedenen
Peripheriegeräten in geordneter Weise
bei der CPU ankommen da muss man so ein
paar Sachen schreiben irgendwie
wie demaskiere ich interupt also dass
der auch
durchkommt wie sage ich dem Interrupt
Controller dass ich jetzt fertig bin und
dass der nächste interupt bald laufen
kann
und und dann deklariere ich im device
tree auf der rechten
Seite wo dieser Interrupt Controller
ist und hier hier sind jetzt zwei
interupt Controller eingetragen das das
erste ist dieser CPU interupt Controller
das
ist Standardkomponente
von von
MIPS
und der untere ist der wür ich den een
Treiber geschrieben habe die sind
hintereinander
geschaltet das hat dann noch nicht so
ganz
funktioniert und das Linux hat sich
relativ schnell
aufgehängt an der Stelle
wo Interrupts bis zur CPU durchgelassen
werden also die Funktion local IRQ
enable
in Linux Sourcecode
äh das war
seltsam es stellte sich dann heraus im
[Musik]
im Handbuch von dem
speziellen MIPS Prozessor core der da
drin ist in diesem Chip MIPS
24k ist dokumentiert es gibt so
einen vector Interrupt
Mode und wenn ich meinem Linux nicht
sage dass der benutzt werden soll dann
geht alles furchtbar
schief ja also
das kann man irgendwie nur durch blind
rumstochern rausfinden oder
so als nächstes will ich irgendwie
meinen serienport komplett benutzen also
vorher hatte ich ja nur ein sehr kleinen
Treiber geschrieben der Zeichen ausgeben
kann aber das ist reicht noch nicht wenn
ich dar irgendwie jetzt mit B
interagieren will und Befehle eingeben
ähm das Linux Subsystem
für für serielle Ports und andere Sachen
allgemeiner für tty stehen auch für
teletype also alle Arten Terminals das
das Linux Subsystem dafür ist ein
bisschen schwierig und
selten modernisiert deshalb man das
jetzt irgendwie 300 50 Zeilen für
grundlegende Funktionalität die nötig
ist für
diesen Treiber für den seriellen
Port na ja aber am Ende hat's
funktioniert USB wä auch ganz cool sind
ja usbports am Gerät da ist auch
eigentlich ein
Standard
Standard USB Controller verbaut ähm
äh nennt sich EHCI das ist eine
Spezifikation die auss die äh festlegt
wie ein USB Host Controller aussehen
kann
ähm linux hat dafür natürlich Treiber
weil das
weil EHCI sehr verbreitet ist
aber das das habe ich nicht g aufen
gekriegt also
ähm es funktioniert so ein bisschen ähm
äh es stellt fest dass ich ein Gerät
einstecke aber wenn es dann versucht
herauszufinden welches Gerät es
ist funktioniert irgendwas nicht mehr
deshalb
ähm da
äh gerne helfen falls ihr mehr wisst
ähm jetzt ist das ja so wenn ich über
ein seriellen Port meinen Linux immer
reinlade
wenn ich irgendwas geändert habe dauert
das sehr lange das ist irgendwie das der
seri Port läuft maximal irgendwie auf
ein auf ein mega baut also 1 Million
Bits pro Sekunde das wären im
Optimalfall dann 20 Sekunden aber
eher mehrere Minuten nicht so cool würde
ich gerne die Bagger so ein GdB gegen
halalten es gibt auch Funktionalität in
Linux dass man
da
GdB oder irgendeinen anderen Debugger
ich weiß nicht Visual Studio Code
debagger wenn sowas gibt dagegen halten
kann
aber das braucht noch weitere Features
in meinem Treiber für den seriellen
Port habe ich noch nicht
implementiert ja fir haacken sehr
interessant das hier es gibt Welten zu
entdecken diese Welt hier Gerät hat 26 €
gekostet
und Linux portieren ist es macht Spaß
für gewisse Werte von Spaß
ja jetzt bin ich schon quasi
durch weitere Informationen zum Projekt
findet ihr auf Github auf
neuschäfer/m88cs8001 das ist ein der
Name von von dem Chip der der da verbaut
ist
und jetzt
äh gerne
Fragen Dank für den spannend Talk es
hörte sich an wie ein besser Verwendung
für so ein Gerät ist damit Fernsehen zu
gucken ja genau Fernsehen ist das
normale aber das ist ja zu langweilig
das ist auf jeden Fall viel
spannender ja ich habe B hier eine Frage
mm und das
war wenn du Geräte kaufst um die zu
hacken welche Merkmal beachtest du so
welche Einzelheiten können angeben dass
eine Gerät zugänglich
ist hier in dem Fall ist jetzt dieser
serielle Port sehr nützlich denn das ist
ein relativ einfacher Weg sowohl auf
Hardware Ebene als auch auf softwareben
ne
um Daten in ein Gerät und wieder
rauszukriegen
und dafür auch interaktive Software zu
schreiben dass man mit mit Tastatur und
Bildschirm darauf interagieren kann das
noch häufig vor mit SerialPort mein
nicht nicht so häufig ich war überrascht
dass dieses Gerät so ein Ding
hat oft muss man auf dem Mainboard dann
sehr genau suchen bis man ein
seriellenport findet oder man findet gar
keinen was anderes ist hier dieser Flash
dieses diese kleinen hier 4 x 5 mm oder
so ein seug 8 Chip s OIC
die sind gut weil man damit relativ da
einfach relativ einfach dran kann mit so
einer speziellen Klammer um um den Flash
auszulesen und neu
zuschreiben mhm alles
klar ich guck mal den noch in die Zeit
Fragen
reinbekommen leider keine
anderen aber ja vielen Dank noch
mal
[Musik]