PDA

[HowTo] Patches porten





Archiv verlassen und diese Seite im Standarddesign anzeigen: [HowTo] Patches porten


hilmi01
10.07.2005, 00:44
Patches porten

Diskussions-Thread:
Patches Porten - Fragen und Antworten (http://forum.modopo.com/showthread.php?t=6089)

Aufgrund diverser Nachfragen hier mal eine Anleitung von BuG, wie der AT-CGSN-PAtch geportet wird. Mal so auf die Schnelle aus diversen PN's zusammengeschnitten.

Der Patch wurde entwickelt, um über Modem-AT-Befehle mittels eines seriellen Terminal-Programms oder des speziell dafür geschriebenen Programms „ATCGSN-Debugger“ den RAM des Handys zu analysieren. Aber hier geht's gar nicht um die Funktionalität des Patches, sondern darum, ihn zu Porten, weil er ein gutes Musterbeispiel ist.

Ich wollte gerne den Patch von der S65v43 auf die M65v43 porten. Die normalen Texte sind von BuG, meine Nachfragen kursiv. Habe unwesentlich weggekürzt.


--- W E R K Z E U G E ----------

- einen Hexeditor, mit dem man Hex-Strings mit Wildcards suchen kann (z.B. Winhex (http://www.x-ways.net/winhex/index-d.html))
- IDA - der Disassembler, um Sprungbefehle zu finden
- wenn der Patch läuft, braucht ihr natürlich noch das PC-Programm, um ihn zu benutzen: ATCGSN-Debugger (http://www.gsmdev.de/index.php?c=viewprojektinfo&id=24)


--- D I E P A T C H E S ----------

AT+CGSN für S65v43 (http://forum.modopo.com/showthread.php?t=4897)
AT+CGSN für M65v43 (http://forum.modopo.com/showthread.php?t=4893)
Die Anleitung beschreibt, wie man vom S65 zum M65-Patch kommt.


Wichtig wird folgendes des S65-Patches für uns:

0x00C11288: DF95BBA0 9D0A80A0
........
0x00800E00: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 490467A149FC66A16BFC66A1DF95BBA0
0x00800E10: FFFFFFFFFFFFFFFFFFFFFFFF 8597B3A05BA8B3A02191B3A0

Die erste Zeile ist der Entry-Point. In diesem Fall stehen erst am Ende des Patches die Sprungadressen, die aus dem Patch rausführen. Deshalb ist er so "leicht". :wink:


--- I D A ----------

Du kannst in IDA ein Patch-Menü freischalten. Dann kannst du gleich die Veränderung anschauen. Einfach die Datei C:\Programme\IDA\cfg\idagui.cfg editieren und DISPLAY_PATCH_SUBMENU auf YES setzen. Dann kannst du unter Edit -> Patch program -> Change Byte... direkt patchen (nur in IDA, am Fubu wird nichts verändert). Und wenn du gerade dabei bist, kannst du auch noch die C:\Programme\IDA\cfg\ida.cfg editieren und unter DEFAULT_PROCESSOR -> “bin” “arm710a” eintragen. Dann ersparst du dir künftig eine lästige Einstellung.
Außerdem solltest du noch OPCODE_BYTES = 4 einstellen, dann steht der Hex-Code gleich rechts neben den Adressen.

Wenn du ein Fubu mit IDA aufmachst, stellst du arm710a ein (auf “set” klicken). Im nächsten Dialog machst du ein Häkchen bei Create ROM section (kein Häkchen bei Create RAM section) und stellst bei “ROM start address” und “Loading address” 0xA0000000 ein. Dann geht es los.
Wenn IDA die Strings lädt, kannst du abbrechen.
Dann kannst du zu einer Stelle aus einem Patch springen (Taste g). Dort drückst du Alt+g und gibst in das Feld eine 1 ein. Der ARM Prozessor kennt nämlich zwei Befehlsmodi: 16 bit und 32 bit. Damit schaltest du das um. Welche Art Code benutzt wird, musst du individuell entscheiden. Meistens ist es 16 bit Code, aber wenn er nur Unfug ausspuckt, musst du umschalten.
Jetzt drückst du auf c und du bekommst Assembler Code.

Noch ne Frage zu IDA. “o” zu drücken bewirkt was genau? Da wird in IDA irgendein Offset gesetzt, wie ist der Kontext des Befehles, was passiert da dann?

Ich kenne den Befehl auch noch nicht sehr lange, ehrlich gesagt. Wenn dort an der Stelle eine Adresse in umgekehrter Bytefolge steht (z.B. 14 C3 E4 A0), dann bewirkt o, dass die richtige Adresse dort steht (unk_A0E4C314). Das hat den Vorteil, dass du die dann mit einem Doppelklick anspringen kannst.
Wenn an so einer Zieladresse was anderes steht (z.B. ein String), dann schreibt IDA den gleich hin und nicht die Adresse.
Übrigens gibt es seit einigen Tagen IDA 4.8 mit stark erweiterter ARM-Funktionalität. Jetzt muss ich die nur noch bekommen...


--- A T + C G S N P A T C H P O R T E N ----------

Vorlage war ein S65v43, den ich aufs M65v43 haben wollte. "M65" ersetzt ihr also einfach durch die Zielfirmware, das Prinzip bleibt ja das gleiche.

Als erstes machst du dir eine Arbeitskopie von deinem Fubu (S65), in die du den Patch mit V_Klay reinbaust. Damit hast du jetzt zwei Fubus, die du beide mit IDA aufmachst. Als erstes suchen wir den Entrypoint im ungepatchten Fubu. Drück g und gib ROM:A0C11288 ein. Da der Hexcode dort verdächtig nach Offset riecht, drückst du o und erhältst

ROM:A0C11288 DF 95 BB A0 DCD unk_A0BB95DF
Jetzt machst du einen Doppelklick auf unk_A0BB95DF und du springst zu dieser Stelle. Das merkwürdige bei diesen Sprüngen ist, dass die oft zu ungeraden Adressen führen. In so einem Fall gehst du eine Zeile höher. Wir sind jetzt also bei BB95DE.
Dort drückst du Alt+g und gibst in das Feld 1 ein, da es sich hier um 16bit-Code handelt. Jetzt drück c.

ROM:A0BB95DE ; ---------------------------------------------------------------------------
ROM:A0BB95DE CODE16
ROM:A0BB95DE 00 B5 PUSH {LR}
ROM:A0BB95E0 85 B0 SUB SP, SP, #0x14
ROM:A0BB95E2 81 F7 45 FA BL unk_A0B3AA70
ROM:A0BB95E6 68 46 MOV R0, SP
ROM:A0BB95E8 72 F5 22 E8 BLX sub_A092B630
ROM:A0BB95EC 00 A8 ADD R0, SP, #0
ROM:A0BB95EE 01 30 ADD R0, #1
ROM:A0BB95F0 81 F7 33 F9 BL loc_A0B3A85A
ROM:A0BB95F4 7F F7 94 FD BL unk_A0B39120
ROM:A0BB95F8 05 B0 ADD SP, SP, #0x14
ROM:A0BB95FA 00 BD POP {PC}
ROM:A0BB95FA ; ---------------------------------------------------------------------------
Was der Code im einzelnen bedeutet, interessiert uns für's Porten nicht. Wir müssen nur den gleichen Code im Fubu vom M65 finden. Was sich aber immer verändert, sind die Sprungadressen. Das heißt, dass wir die aus der Suche ausklammern müssen. Ich suche den Hexcode mit WinHex (http://www.x-ways.net/winhex/index-d.html).

Du musst dir also jetzt einen Suchstring zusammenbauen. Du siehst, dass die Bytes 00 B5 den Befehl PUSH {LR} darstellen. Der nächste Befehl ist entsprechend 85 B0.
Jetzt kommt unser Sprung 81 F7 45 FA (BL sub_A0B3AA70), den wir durch Wildcards ersetzen. Bei WinHex ist das ein bisschen merkwürdig, denn man kann nur einen Hexcode angeben, der als Joker benutzt wird. Ich habe mir dafür AA angewöhnt. Wir setzen jetzt also AA AA AA AA ein. Und noch 68 46 (MOV R0, SP). Das reicht, um die Stelle eindeutig zu identifizieren. Unser Suchstring ist also 00B585B0AAAAAAAA6846.

Jetzt machst du WinHex auf und öffnest die Fubus vom ungepatchten S65 und vom M65. Jetzt drückst du Strg+Alt+F und gibst unseren Suchstring ein (Jokerzeichen aa, in allen Fenstern suchen, Fundstellen archivieren). Los geht's, wir speichern 100 Adressen, oder von mir aus 1000.
Wir haben jetzt also BB95DE im S65 und B735B2 im M65 gefunden. Damit ist die Hauptaufgabe erfüllt.

Letzten Endes brauchen wir aber den Verweis zu unserem Stück Code. Zur Kontrolle suchst du unsere Sprungadresse A0BB95DF (+1 :!: ) im S65 in umgekehrter Bytefolge. Also DF95BBA0. Und voila, WinHex spuckt unsere Ausgangsadresse C11288 aus.
Das gleiche machst du jetzt mit dem M65. Du suchst also nach B335B7A0 und kommst bei BD7430 an.

So funktioniert es. Der Entrypoint beim M65 ist also:

0BD7430: B335B7A0 9D0A80A0

Wenn du den Rest des Codes porten willst, nimmst du das Fubu, in das du den Patch einspielt hast und gehst zu A0800880. Jetzt kannst du disassemblieren bis A0800E1B und den Code nach Sprungadressen durchsuchen. Alle Adressen, die wieder irgendwo in diesem Bereich enden, interessieren uns nicht. Wir brauchen nur die Adressen, die außerhalb ankommen. Hier ist es ganz praktisch, da alle am Ende stehen:

ROM:A0800E00 49 04 67 A1 DCD unk_A1670449
ROM:A0800E04 49 FC 66 A1 DCD unk_A166FC49
ROM:A0800E08 6B FC 66 A1 DCD unk_A166FC6B
ROM:A0800E0C DF 95 BB A0 DCD loc_A0BB95DE+1
ROM:A0800E10 85 97 B3 A0 DCD unk_A0B39785
ROM:A0800E14 5B A8 B3 A0 DCD loc_A0B3A85A+1
ROM:A0800E18 21 91 B3 A0 DCD unk_A0B39121

--------------------------------------

benj9 hat folgendes geschrieben:
Eins versteh ich in IDA noch nicht:

Wenn ich bei A0800880 starte zu disassemblieren, endet das Disassemblat wesentlich eher, und dann erscheinen nur noch DCB-Sequenzen. Wie finde ich denn so im Endgebiet des Patches, wo die Sprünge nach außen führen, einen Entry-Point für IDA?

Die einfachste Möglichkeit ist, wenn du den Cursor mit der Maus unter den Trennstrich setzt und wieder c drückst. Das machst du so oft, bis du am Ende von dem Patch bist. Oder du markierst das ganze Stück und drückst dann auf c und Analyze. Klappt halt nicht immer und gerade der AT+CGSN scheint von IDA in Teilen nicht richtig übersetzt zu werden.

_________________


PS: Die AT+CGSN-Patche stehen für die meisten Versionen in den entsprechenden Patch-Threads. Im ATCGSN-Debugger gibt es auch ein Verzeichnis mit den Patches für ältere Versionen. Viel Spaß beim Porten-Üben! :wink:

So, und hier noch die Suchstrings von BuG. Die kann man sich mit obiger Anleitung selbst erarbeiten, aber sie als Anfänger zu haben, um zu sehen, ob man alles richtig macht, ist ganz nützlich:

entry: 47534E0047534E00 + 0xC
0800E00: B430B591B00F900C4816A90E91784408900B487844 (2. Vorkommnis)
0800E04: 061B0E002A
0800E08: B4042AAAAA031C0B439B07AAAA08C810C9A342
0800E0C: B585B0AAAAAAAA6846AAAAAAAA00A80130
0800E10: B5AAAAAAAA041CAAAAAAAAAAAA80000C390958601810BD
0800E14: B5041CAAAAAAAA0104090C201CAAAAAAAA10BD (1. Vorkommnis)
0800E18: B5AAAAAAAA39300121AAAAAAAAAAAAAAAA3A300121AAAAAAAA7A490220AA AAAAAA80BD

(Die "AA" sind Wildcards, in Winhex kann man nur leider ein Hex-Byte als Wildcard definieren, und da hat BuG eben AA genommen)

_________________
Teil 2:

;S65v43 - Extended "Calls dialed" list
;(c) avkiev
;Green button -> "Calls dialed"
;Red button -> "Calls received"
;Red button -> "Calls missed"
;Red button -> Ready

16BB12C: A779AAA0 110880A0
0800800: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 45787443616C6C7320A961766B696576
0800810: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00B5D7F07FFCD7F079FCD7F089FC00BD

Den Entrypoint machst du wie gehabt, denn das ist eindeutig ein Offset.
Die nächste Zeile ist nur ein String ohne Relevanz (sozusagen ein Copyright), aber die Zeile 0800810 ist interessant. IDA löst sie folgendermaßen auf:

ROM:A0800810 ; ---------------------------------------------------------------------------
ROM:A0800810 CODE16
ROM:A0800810 00 B5 PUSH {LR} ; Push registers
ROM:A0800812 D7 F0 7F FC BL sub_A08D8114 ; Branch with Link
ROM:A0800816 D7 F0 79 FC BL sub_A08D810C ; Branch with Link
ROM:A080081A D7 F0 89 FC BL sub_A08D8130 ; Branch with Link
ROM:A080081E 00 BD POP {PC} ; Pop registers
ROM:A080081E ; ---------------------------------------------------------------------------
Wenn du dir jetzt z.B. die 812 im Hex-Code anschaust, siehst du D7 F0 7F FC. Es ist also aus dem Hex-Code keinerlei Adresse erkennbar. Jetzt kommt ABraGen (http://files.modopo.com/software/ABraGen0.23.exe) in's Spiel.
Im thumb disassembler kannst du jetzt als Adresse A0800812 und als Opcode D7F07FFC eintragen. Dann klickst du auf disassemble und du bekommst wieder unseren bekannten Sprung auf A08D8114. Dass hier jetzt B steht und nicht BL ist ein Bug. Da musst du aufpassen, das aber nur zur Info.
Wenn du das jetzt auf das M65 porten willst, nimmst du den Suchstring 80B5AAAAAAAA80BD80B50020AAAAAAAA80BD80B5 und bekommst die Adresse A08E0DAC. Also trägst du jetzt bei "thumb" den Typ BL, source A0800812 und destination A08E0DAC ein. ABraGen generiert dir jetzt den neuen Hex-Code E0F0CBFA.

--------------------
Teil 3:

Oder besser Teil 0, weil die einfachste Port-Art. Wird hier an einem Beispiel durchgeführt: http://forum.modopo.com/showpost.php?p=99289&postcount=11


© MODOPO.COM



Archiv verlassen und diese Seite im Standarddesign anzeigen: [HowTo] Patches porten