ablbd
Membru Senior
Inregistrat: acum 15 ani
|
|
Urmaresc de-o vreme acest forum si constat ca se scrie prea putin despre bucataria interna a aparatelor ai caror posesori suntem. Chiar si pe alte forumuri cu greutate acest lucru de regula se face punctual, cu referire la o anumita marca sau la la cateva tipuri, dar ale aceluiasi producator. Voi incerca intr-o serie de articole din care primul este acesta, sa prezint aspecte generale tuturor aparatelor si metode aplicabile (sper) oricarui aparat. Fara explicatii obositoare, articolele se vor axa pe aspecte practice si indicatii precise, astfel incat sa fie accesibile chiar si celor mai putin avansati in hard/soft, insa e necesar ca cei care purced la treaba sa aiba un minim de cunostinte generale despre calculatoare.
Asa cum anunta si titlul, tema acestui articol este prezentarea metodelor concrete de a face o copie a romului. Avand la dispozitie astfel de copii, exista sansele ca ele sa foloseasca acelor colegi care au probleme cu propriile aparate, deoarece din ele se pot crea imagini bootabile practic in orice format... dar despre asta alta data.
In cazul PNA/PDA, nu luati termenul de ROM(Read Only Memory) ad-literam, deoarece acel "ROM" se gaseste plasat pe un mediu rescriptibil. Producatorii seriosi (mai ales de PDA si iPhone) publica pe saiturile proprii din timp in timp upgrade-uri pentru aparatele lor. De pilda, poti cumpara un aparat cu WINCE5 si peste un timp ti se ofera posibilitatea trecerii la WINCE6 sau chiar mai sus. Ceea ce publica aceste firme este un nou ROM care il va inlocui pe cel vechi, oferind performante superioare.
Pentru ca o imagine bootabila sa poata fi incarcata, este nevoie de niste conditii: - sa aiba formatul pe care boot loaderul il asteapta - imaginea sa aiba un nume pe care boot loaderul il recunoaste si accepta; in principiu, un anumit tip de aparat pretinde un nume specific "case sensitive". - boot loaderul trebuie sa fie intact.
Acest ultim aspect este extrem de important pentru ca in cazul in care noua versiune de rom nu functioneaza, se poate reveni oricand la versiunea anterioara. Desigur ca si boot loaderul poate fi schimbat, insa in cazul unei nereusite aparatul devine inutilizabil. Nu chiar definitiv, dar aproape. Sunt putine acele locuri (inclusiv de service) care poseda o interfata JTAG pentru aparatele pe care le intretin.
[In interiorul oricarui PNA/PDA exista niste puncte de conexiune care se leaga printr-o interfata la un PC la portul paralel. De interfata e nevoie deoarece tensiunea de alimentate a PPC este de 3,3 V iar cea din PC de 5v (pe porturi). In cazul anumitor modele este relativ usor de gasit JTAG-ul, la alte modele aceste puncte de conexiune pot fi foarte bine ascunse. Odata gasite, trebuie depistat care conexiune carui semnal ii corespunde. Pe PC ruleaza un program-driver pentru JTAG, care acceseaza direct NAND flashul si poate rescrie bootloaderul dar si rom-ul. De regula dupa incarcarea boot loaderului se trece pe o conexiune lan, deoarece comunicatia prin JTAG este extrem de lenta si transferul romului ar dura la ordinul zecilor de ore.]
Dupa aceste precizari de inceput, sa intram in subiect si sa trecem in revista metodele de a extrage rom-ul dintr-un PDA/PNA.
Acest lucru se poate face remote (pe PC) sau direct in PNA/PDA. Ca recomandare generala, este de preferat metoda remote si doar in cazuri extreme o metoda interna. Ambele metode prezentate vor produce copia partitiei de NAND flash unde se gaseste romul.
Exista utilitare care copiaza anumite zone din RAM, dar acestea au cateva dezavantaje: - in dump vom gasi cu certitudine doar acele imagini -parti din rom- care sunt XIP (execute in place); restul fisierelor (sa le spunem standard) pot fi in alte locatii de memorie decat zona pe care o copiaza utilitarele; - in RAM au loc ajustari de pagina (o pagina RAM are 4096 octeti) si orice modul relocabil va fi incarcat la inceputul unei noi pagini, chiar daca pagina anterioara este aproape goala.
1) Metoda remote.
Conditie esentiala: aparatul trebuie sa aiba conexiune activesync.
a) In marea majoritate a situatiilor, "tools" conceput de catre itsme) va functiona perfect.
Descarcati zipul cel mai recent si extrageti fisierele intr-un director usor accesibil, pentru a nu avea prea mult de tastat. Recomand crearea si a unui al doilea director, cu nume scurt si tot in radacina (de ex Rom), unde sa puneti imaginea binara a romului si nu numai. Conectati aparatul prin activesync si copiati manual "itsutils.dll" in directorul \windows al PPC. In cazul unui mesaj ca nu exista suficienta memorie, problema se rezolva usor doar pentru aceia care au acces la control pannel din PNA/PDA. Cei care nu au aparatul deblocat macar pe acces la desktop (PNA-uri), fie si-l deblocheaza fie renunta la a-si copia romul. Intrati in control panel si accesati "System" iar de sus "Memory". Va aparea un cursor deplasat catre stanga; mutati acel cursor spre mijloc, dati OK si de data asta copierea va merge fara probleme.
Deschideti o fereasta linie de comanda pe PC ( Start, run iar in fereastra tastati "cmd" ) si mutati-va manual in directorul unde ati dezarhivat utilitarele. Daca aveti un card SD in PNA/PDA, scoateti-l ca sa nu aglomereze datele, desi nu e obligatoriu. In linia de comanda tastati "pdocread -l" (nota: folosesc ghilimele in cazul comenzilor ca sa se vada unde se termina comanda + parametrii; in fereastra cmd se tasteaza FARA acele ghilimele). Comanda aceasta va face o inventarie a tuturor discurilor remote, a partitiilor prezente pe fiecare unitate de stocare precum si lungimea acestor partitii. Din marimea partitiei 0 si/sau 1 deduceti unde este romul (are de regula in jur de 32MB, cele mai noi cu WINCE6 pot avea si 64MB).
Un exemplu de raport (pentru Evolio E400):
979.75M (0x3d3c0000) DSK1: | 1.10M (0x119600) Part00 | 31.02M (0x1f04000) Part01 | 944.63M (0x3b0a2600) Part02 | 3.00M (0x300000) Part03 ........
Este evident din marime ca romul se gaseste in Part 01, deci se va continua cu acesta. De regula partitia 3 contine registrii hive iar partitia 2 este user. Cifrele din paranteze contin marimea exacta a partitiei, asa cum este este calculata folosind datele din MBR. Presupunand ca ati creat un folder D:\Rom, linia de comanda care functioneaza mai mereu este:
"pdocread -d DSK1: -n 1 -w 0 0x1f04000 d:\rom\p01.bin"
Intre fiecare element al liniei de comanda se lasa 1 spatiu; nu folositi alte demarcatoare!! Dupa -d urmeaza numele exact al discului raportat in comanda anterioara. Indiferent ce denumire apare acolo, pe aceea trebuie s-o folositi, exact asa cum apare; -n 1 este numarul partitiei, adica partitia 1; daca vreti un dump la partitia 0, inlocuiti 1 cu 0; -w spune programului sa foloseasca API din windows; prima cifra reprezinta octetul de start pentru dump iar cea de-a doua cati octeti vrem sa copiem (e bine de copiat toata partitia, asa ca se ia tot din primul raport valoarea exacta dintre paranteze).
Daca lucrurile merg bine, dupa cca 3 minute in directorul d:\rom din PC va aparea un fisier (numit de mine p01.bin, dar poate avea orice nume) care contine datele brute (raw data) ale partitiei respective. In linia de comanda ordinea parametrilor nu conteaza, dar dupa parametrii ordinea datelor este obligatorie: 1-adresa de start, 2-lungimea (cati octeti dorim sa copiem) si 3-numele fisierului de dump. Adresa de start si lungimea pot fi date fie in sistem zecimal fie hex (0xvaloare). Daca se omite cea de-a doua cifra (lungimea), valoarea implicita este 512 octeti. Pot exista variatiuni ale lui pdocread, de pilda sa foloseasca driverul flashdrv.dll. Daca tastati simplu "pdocread", va listeaza toate optiunile posibile (un soi de help). ***Atentie, pdocread poate sa si scrie discul; folositi doar comenzile de citire***
2) Metoda Interna.
Se recurge la ea daca din oarecare motive obscure pdocread nu functioneaza sau daca nu exista posibilitatea conectarii prin activesync (aparatul se conecteaza doar ca mass storage). In aceasta situatie, veti avea nevoie de un program numit DiskRW (il gasiti de ex aici , dar si prin alte parti). Este o bijuterie de program, extrem de bine facut, dar maaaare atentie: dupa cum se deduce si din nume, poate citi sau scrie discul!!!
Copiati executabilul de preferinta pe cardul SD si inainte de a-l porni, activati tastatura SIP pentru ca va fi nevoie ulterior de ea si DiskRW n-o activeaza (ca deh, nimic nu e perfect pe lumea asta...). Veti vedea in partea de sus un meniu; pentru inceput alegeti "Info", de unde veti culege informatiile privind lungimea partitiilor. Selectati discul flash ( apare cu numele de DSK1: ) si deschideti ramura "Partition Informations). alegeti partitia care cel mai brobabil contine romul (32MB sau mai mare ori 64MB sau mai mare pt CE6) si notati-va lungimea (Size=.....) atat pentru partitia 0 cat si pentru 1; valoarea este zecimala si o puteti folosi ca atare. Dupa asta reintrati in fereastra "Read/Write" initiala si:
a) *** LASATI BIFATA optiunea ReadDisk *** b) alegeti la Store DSK1 c) Lasati la Offset valoarea 0 (pentru partitia 0) sau introduceti lungimea partitiei 0 daca vreti sa copiati partitia 1 d) Tastati la "Lenght" lungimea partitiei alese e) Selectati o cale si botezati cumva fisierul de dump in ferestra "Output"; se prefera extensia .bin sau .raw; f) Click pe butonul Read si asteptati pana se termina copierea (un indicator-cursor arata stadiul copierii)
Avand fisierul cu date brute pe PC (sau cpiate din PPC), urmeaza a vedea daca este ceea ce ne astaptam sa fie, adica sa contina SI romul integral. Pentru aceasta, cea mai rapida cale o ofera tot itsme (in linkul dat, alegeti sus "dumprom" si va duce acolo. Executabilul are nevoie de o librarie (nkcompr.lib, ce provine din platform builder) si pe care o gasiti tot acolo. Se poate cupla cu restul utilitarelor si tastati in fereastra de comanda "dumprom -5 d:\rom\p01.bin -d d:\rom >p01.txt"
Prima cale puncteaza catre imaginea binara obtinuta prin dump iar cea de-a doua la locul unde vor fi puse fisierele componente din rom. Fisierul p01.txt (destul de marisor) va contine raportul dumprom; liniile relevante sunt primele, care incep cu "img" si niste valori. Neglijati mesajul de eroare dupa "img"(uri), este normal. Mai departe lista arata detaliat pe unde a gasit fiecare componenta a romului, care dintre ele sunt de tip "module" si care "file". Este bine de verificat prin comparare cu directorul \windows din PPC daca se regasesc toate fisierele de acolo in directorul unde le-a despachetat dumprom. In caz ca da, inseamna ca intregul rom exista pe undeva in fisierul brut si demersul a fost incununat de succes. Este bine sa pastrati fisierul txt generat de dumprom, deoarece va mai fi nevoie de el in viitor. Daca nu regasiti absolut toate fisierele din \Windows, inseamna ca acea copie este incompleta si nu are niciun rost sa mergeti mai departe cu acest tutorial. *** Atentie: a) explorerul din PPC trebuie setat ca sa arate fisierele sistem si pe cele ascunse; b)activesync nu va arata niciodata toate fisierele din \windows, va trebui sa folositi obligatoriu explorerul intern***
Curatirea fisierului brut se poate face relativ simplu cu ajutorul unui editor hex. Pentru acest scop cel mai simplu de folosit imi pare "HexEditor" (freeware, cautati pe google: nu necesita instalare pe PC, doar sa fie la un loc cu dll-urile din pachet).
Metoda detaliata de depistare manuala a inceputului de rom am prezentat-o la articolul nu mai insist aici. Este posibil ca in dump sa nu gasiti secventa "FE 03 00 EA" (jump la boot loaderul secundar), deoarece adresa de salt fie este diferita, fie este comunicata ca parametru boot loaderului. In acest caz locrurile se complica, dar nu prea mult. Cititi partea despre MBR din articol si calculati adresa rom header inmultind pozitia primului bloc indicat de partitia care ne intereseaza cu 0x200. Verificati totusi daca la offsetul 0x40 fata de aceasta se gaseste sirul magic "ECEC"
Cand ati gasit rom start, mutati cursorul cu 1 octet spre stanga, adica sa puncteze pe octetul anterior si din meniul "Edit" selectati "Delete TO cursor". Dupa aceasta operatiune, secventa FE 03 00 EA (daca exista) trebuie sa inceapa la adresa 0x0 din hexeditor iar prima aparitie "ECEC" la 0x40. Mai ramane sa determinam offsetul unde se termina romul. Pentru aceasta, deschideti lista generata de dumprom si notati-va din prima linie valoarea care apare la "base address". Indiferent de cate imagini gaseste (img), base address ramane aceiasi. Acum mergeti la finalul listei si notati-va valoarea "rom end", ori prima valoare de la "unknown" si o rotunjiti in sus pana la o adresa multiplu intreg de 0x200. De pilda, daca rom end=0x8df28928, valoarea finala va fi 0x8DF28B00. Pentru calcule hexa folositi calculatorul din PC, setat pe stiintific si bifat Hex. Scadeti din valoarea rom_end rotunjita valoarea base_address si puneti hexeditorul sa sara la adresa absoluta a rezultatului acestei scaderi (Meniul "Address" selectati "Goto", sa fie bifat hex). Pentru a nu gresi, copiati din calculator rezultatul (copy) si paste in fereastra de cautare. Din pozitia unde ajunge cursorul, selectati in hexeditor "Edit" si "delete FROM cursor", apoi din meniul "File" "Save as". Sugerez ca numele fisierului salvat sa contina indicii asupra aparatului al carui rom l-ati copiat, pentru a nu se amestece cu alte romuri (poate provenind din aparatele prietenilor) si o extensie .img sau .nb0 (NBzero), deoarece ceea ce aveti acolo va fi recunoscut de boot loader cu una dintre aceste extensii si un nume special care difera de la caz la caz. Pentru a verfica daca totul este ok, sugerez sa mai executati odata dumprom pe acest ultim fisier. Urmariti daca nu cumva apare vreun mesaj de eroare in plus in listing si daca fisierele extrase sunt in acelasi numar cu cele scoase din .bin (.raw) Daca aceasta ultima verificare este pozitiva, inseamna ca sunteti fericitii posesori ai unei imagini rom ce poate fi incarcata intr-un aparat identic cu cel din care a fost extras.
Metoda de "curatire" de mai sus este cea minimala. De regula imaginea ROM este semnficativ mai lunga, umpluta cu "00". Ca alternativa la rotunjire, plasati hexeditorul exact la adresa din calcul (rom end) si mergeti spre adrese mai mari pana apar date (valori non-zero). Acelea nu mai fac parte din ROM, asa ca mergeti cu cate un octet inapoi astfel incat cursorul sa ajunga pe ultima valoare zero si verificati adresa indicata de hexeditor, care ar trebui sa fie ceva de genul xxxFFFFF. Mai avansati un octet (pe prima valoare non-zero si aplicati comanda "delete from cursor" apoi salvati. Toate imaginile ROM disponibile pe saituri pentru anumite aparate vor avea exact aceasta lungime, caci au incluse si valorile 00. Nu mi se pare imposibil ca anumite boot loadere sa verifice acea lungime (0 padded) inainte sa incarce noua imagine pe flash disk, desi n-am dovezi in acest sens. Oricum, cu toate ca presupune ceva mai multa munca si atentie, merita sa mergeti pe aceasta varianta.
NOTA: base address din lista lui dumprom va fi aceiasi doar pentru imaginile VALIDE. Daca dumprom gaseste headere invalide, va aparea si un mesaj legat de asta chiar la inceput iar base addres va diferi fata de celelalte, nu o luati pe asta.
NOTA1: un header invalid nu presupune neaparat ca aveti un dump gresit. Eu am dat peste asa ceva si am facut nenumarate verificari, ajungand la concluzia ca acel header a fost facut intentionat invalid deoarece respectiva imagine continea o suita de dll-uri pentru debug prin platform builder si le-a fost lene sa genereze un rom fara acestea ... Mi-am propus chiar sa revalidez acel header (intai pe dump pentru dumprom si apoi pe viu). Iata un astfel de exemplu:
img 00000000 : hdr=8cd39508 base=8cb50000 commandlineoffset=8cb50000 img 00400000 : hdr=820e35c4 base=81c00000 commandlineoffset=81c00000 img 00a00000 : hdr=834bba84 base=81c00000 commandlineoffset=81c00000 ERROR: could not find pointer for ofs 8cd39508 invalid romhdr ofs 8cd3950
Observati ca prima intrare este invalida si este mentionata atat ca "invalid romhdr" cat si ca ERROR iar base address are alta valoare fata de urmatoarele 2 intrari valide. Imaginile valide contin absolut toate fisierele din \windows, de asta am sugerat sa verificati bucata cu bucata fisierele din dump cu cele din \windows.
NOTA2: legat de nota 1. DiskRW are inclus un hexeditor care MODIFICA DIRECT PE DISC datele introduse. Nu experimentati cu acesta decat daca stiti foarte bine ce faceti. Vorba aia: e voie sa privesti dar nu te-atinge
Cateva cuvinte despre fisierele extrase de catre dumprom:
a) Executabilele (.exe) pot fi folosite in orice alt aparat asa cum sunt, cu conditia ca dependentele sa fie satisfacute;
b) Ca regula generala, dll-urile NU POT FI FOLOSITE in alte aparate si nici macar in cel propriu, deoarece le lipseste tabela de relocare. In listingul lui dumprom acestea au atribut "modent". Fac exceptie doar acele dll-uri (s-ar putea sa nu fie niciunul, nu mizati pe asta) care in listingul lui dumprom apar ca fiind "filent", caz in care pot fi portate pe alte aparate daca e nevoie.
c) Exista cateva fisiere cu extensia .hv (dintre care unul boot.hv...). Toate impreuna pot fi utilizate pentru reconstituirea registrilor de fabrica ai aparatului. Procedura: lansati pe PC programul CeRegEditor ) si din meniul File selectati "New". Dupa asta din meniul "Edit" selectati "Import" pentru fiecare fisier .hv in parte, apoi salvati in aceiasi maniera cu imaginea rom ("Save as..." indicand aparatul din care provine). *** Atentie, nu omiteti niciun fisier .hv, altfel veti avea o imagine partiala a registrilor*** Din acest moment sunteti in posesia intregului registry de fabrica al propriului aparat, ce poate fi utilizat la refacerea setarilor originale; de exemplu MioPocket face varza registrii iar service-ul (in caz de..., Doamne fereste) nu va fi prea bucuros sa vada asta . Pot fi multe alte motive pentru a dori revenirea la setarile de fabrica. In consecinta, daca legatura activesync este functionala, puteti reface in 2 minute registrii originali conectand CeRegEditor la PPC si selectand "Tools"-> "Backup/Restore"->"Restore" -> salvarea pomenita anterior. La urmatorul hard reset aparatul va fi ca atunci cand l-ati pornit pentru prima oara. Operatiunea se poate face si dintr-un editor intern de registrii, caz in care se copiaza salvarea in PPC cu extensia schimbata in .reg si se face de acolo "import registry", insa aceasta metoda nu va sterge cheile in plus ci doar va modifica valorile la cheile prezente in salvare.
Acestea fiind zise, va doresc un "dump" linistit
PS: pentru ca acest topic sa aiba si o utilitate practica (putem ajuta pe aceia care au diverse probleme cu aparatele lor), rog pe toti cei care in urma acestui tutorial sau cu de la sine putere au reusit sa produca o imagine rom ca sa lase un semn, precizand tipul aparatului cu cat mai multe detalii. Pentru a nu incarca prea mult comentariile, lasati un semn DOAR DACA sunteti primul care semnaleaza un rom dump pentru acel tip de aparat.
Deschid lista cu EVOLIO E400 si WAYTEQ 770BT
9.05.2010 Intre timp s-au inmultit aparatele cu CE6, la care programele clasice pentru dump nu functioneaza. Motivul este ca in CE6 cam totul a fost revizuit, inclusiv organizarea (si protectia) memoriei ram. Au fost eliminate din coredll multe functii dar au aparut in schimb altele noi si foarte utile. Cert este ca orice program "cuminte" poate functiona si pe CE6, insa dumperele (de nand si de ram) nu sunt nici pe departe "cuminti" Asa stand lucrurile si deoarece intre timp mi-am luat un aparat cu CE6 mai mult pentru studiu decat din necesitate, am scris un dumper "cuminte" de nand, initial destinat doar pentru CE6. Ulterior am modificat programul ca sa poata functiona si pe CE5 (chiar si pe CE4) cu conditia sa fie "instalat" pe aparat compact framework (2.0 sau mai sus). Doritorii il pot descarca de aici. Este o versiune revizuita(si simplificata) a celei publicate la topicul Wayteq920: va lista doar discurile nand integrate, nu si cardurile sd dau alte discuri externe. De asemenea, calculeaza numarul total de sectoare prin doua metode alternative deoarece am constatat la un CNS Stylus ca numarul total de sectoare raportat de catre IOCTL_DISK_GETINFO nu corespunde cu cel calculat din MBR. Daca apare o situatia ca aceasta, va cere utilizatorului sa aleaga metoda...
Modificat de ablbd (acum 14 ani)
_______________________________________ E400, Wayteq 770BT, Wayteq 920BT
|
|