Cucinare una ROM a partire da una ROM esistente.

Questo tutorial è basato sulla versione 1.1.0 di JCooker.

Step 0: preliminari

Posizionarsi all'interno della directory della cucina.

Lanciare il batch 0_cleansrc.bat1) per ripulire la directory src.

- Copiare la ROM sorgente all'interno della directory src. Il file della ROM deve chiamarsi ciphone.bin, procedere quindi rinominandolo nel caso si chiamasse in modo differente.

Step 1: dump

Lanciare lo script 1_dump.bat

Dietro le quinte di 1_dump.bat

Questo script, prima di tutto, crea quattro sottodirectory in src, chiamate rispettivamente 1, 2, 3 e 4. Queste sottodirectory vengono utilizzate per raccogliere il risultato dei singoli passi di spacchettamento della ROM sorgente.

Nella directory 1 ci sarà il risultato del comando jtdi.exe ciphone.bin:

jtdi.exe ciphone.bin
		
   __     ______   _____     __
  /\ \   /\__  _\ /\  __-.  /\ \
 _\_\ \  \/_/\ \/ \ \ \/\ \ \ \ \
/\_____\    \ \_\  \ \____-  \ \_\
\/_____/     \/_/   \/____/   \/_/

HiSilicon IDT unMerger - Version 0.3 by Janniz
Processing file: ciphone.bin
--------------------------------------------------------------------
File: ciphone.bin
IDT File type: 1.0.x
ROM build date: 02/25/2011
Hardware version: 1.0.0.0
Number of partitions: 5
--------------------------------------------------------------------
PartN. | Type       | Size       | Offset     | Note               |
-------|------------|------------|------------|--------------------|
     1 |    RAMInit |        796 |        196 |                    |
     2 |    USBLoad |      45324 |        992 |                    |
     3 |       XLDR |     131072 |      46316 |                    |
     4 |        IPL |     119068 |     177388 |                    |
     5 |      FLASH |   67765760 |     296456 |                    |
Starting splitting...
    Writing: RAMInit.nb0:
    Writing: USBLoad.nb0:
    Writing: XLDR.nb0:
    Writing: IPL.nb0:
    Writing: FLASH.nb0:
Job done. Now I'm exiting gracefully :)

Durante questo passaggio la ROM viene scomposta nelle sue componenti: RAMInit.nb0, USBLoad.nb0, XLDR.nb0, IPL.nb0 e FLASH.nb0.

Il nostro ingrediente principale per cucinare la ROM sarà FLASH.nb0. Lasceremo pertanto le altre componenti da parte sino a quando non sarà il momento di riassemblare il tutto.

Lo script quindi va ad eseguire il comando osnbtool -sp flash.nb0:

osnbtool -sp flash.nb0
		
OS ROM Partition Tool V1.59 By Weisun :> PDAclan.com
Sector size : 0x00000800
Extra data bytes : 0x00000008
OS IMAGE found.
Partitions infomation:
**************************************
Part-0 type: BOOT SECTION image
Part-1 type: XIP RAM Image
Part-2 type: IMGFS file system
Part-3 type: legit DOS partition
**************************************
flash.nb0.PRE written.
-------------------------------------------------
Sector counters (extra-data) found in source file.
Partition 0 true offset:00000002        true size:0000027E      Len:0000027E
Partition 1 true offset:00000280        true size:000006C0      Len:000006C0
Partition 2 true offset:00000940        true size:0000BD00      Len:0000BD00
Partition 3 true offset:00000000        true size:00000000      Len:00012DC0
flash.nb0.OS.NB written.

Il risultato, consistente nei due file flash.nb0.PRE e flash.nb0.OS.NB viene salvato all'interno della directory 2.

Il passo successivo (sempre eseguito da 1_dump.bat) consiste nell'estrarre le 4 partizioni: boot.bin, xip.bin, imgfs.bin e legitDos.bin contenute in flash.nb0.OS.NB.

osnbtool -d flash.nb0.os.nb 0 boot.bin

OS ROM Partition Tool V1.59 By Weisun :> PDAclan.com
Sector size : 0x00000800
Extra data bytes : 0x00000000
OS IMAGE found.
Partitions infomation:
**************************************
Part-0 type: BOOT SECTION image
Part-1 type: XIP RAM Image
Part-2 type: IMGFS file system
Part-3 type: legit DOS partition
**************************************
Signature: SRPX
CompressVersion: 5
Uncompressed size: 300000
Deompress processing...
Successfully decompressed to boot.bin
osnbtool -d flash.nb0.os.nb 1 xip.bin

OS ROM Partition Tool V1.59 By Weisun :> PDAclan.com
Sector size : 0x00000800
Extra data bytes : 0x00000000
OS IMAGE found.
Partitions infomation:
**************************************
Part-0 type: BOOT SECTION image
Part-1 type: XIP RAM Image
Part-2 type: IMGFS file system
Part-3 type: legit DOS partition
**************************************
Can not find compression signature.
Part-1 de-packing...
Successfully de-packed to xip.bin
osnbtool -d flash.nb0.os.nb 2 imgfs.bin

OS ROM Partition Tool V1.59 By Weisun :> PDAclan.com
Sector size : 0x00000800
Extra data bytes : 0x00000000
OS IMAGE found.
Partitions infomation:
**************************************
Part-0 type: BOOT SECTION image
Part-1 type: XIP RAM Image
Part-2 type: IMGFS file system
Part-3 type: legit DOS partition
**************************************
Can not find compression signature.
Part-2 de-packing...
Successfully de-packed to imgfs.bin
osnbtool -d flash.nb0.os.nb 3 legitDos.bin

OS ROM Partition Tool V1.59 By Weisun :> PDAclan.com
Sector size : 0x00000800
Extra data bytes : 0x00000000
OS IMAGE found.
Partitions infomation:
**************************************
Part-0 type: BOOT SECTION image
Part-1 type: XIP RAM Image
Part-2 type: IMGFS file system
Part-3 type: legit DOS partition
**************************************
ERROR - Part-3 size is wrong!

Il risultato di queste operazioni trova posto nella directory 3.

L'ultima passo di estrazione (dump) della ROM consiste nello scompattare imgfs.bin e xip.bin e nel ricostruire i pacchetti originari.

Per imgfs.bin si procederà dunque così2):

xidump imgfs.bin

XIDUMP v1.0 Beta    Copyright (c) 2009-2010 bepe    Oct 27 2009 00:17:17

 Inizializing RAW Data layer

Found IMGFS Partition...
 .hst
 .ROM
 .VM
 01cfec30-34b0-4ab8-9c07-89c16b720030.dsm

........
........
........
........

 ZipView.exe
 zlib.dll

Done!
packagebuilder.exe IMGFS

PACKAGEBUILDER 3     Copyright (c) 2007-2008 bepe     Apr 23 2008 22:12:21

[Versions]
  SYS:  5.2.23500  5500
  SYS:  5.2.23515  5500

........
........
........
........

[Missing Manifests]
  723fb954-d931-4348-b672-82a188e587b5.dsm
  cb60b333-da30-aaba-ecca-33a4568f566f.dsm

Done!

Analogamente per xip.bin:

xidump -b xip.bin

XIDUMP v1.0 Beta    Copyright (c) 2009-2010 bepe    Oct 27 2009 00:17:17

 Inizializing RAW Data layer

Found XIP Partition...
 busenum.dll
 cachefilt.dll
 cecompr.dll

........
........
........
........

 sysroots.p7b

OS:
 16512.5 (Build: 5500) MSXIPKernel

Done!

Step 2: BuildOs

Lanciare lo script 2_cleanbuildOS.bat per ripulire la directory BuildOS.3)

Lanciare 3a_buildos_from_dump.bat

Quando compare la finestra di BuildOS premere il tasto con la freccia verde, attendere che completi la sua opera e chiuderlo.

Dietro le quinte di 3a_buildos_from_dump.bat

Il batch provvede innanzitutto a popolare le directory necessarie a BuildOs:
Copia src\4\IMGFS\OEM —> BuildOs\OEM
Copia src\4\IMGFS\SYS —> BuildOs\SYS
Copia src\4\XIP\MSXIPKernel\boot_ms.rgu —> BuildOs\ROM\XIP\
Copia src\4\XIP\OEMXIPKERNEL\boot.rgu —> BuildOs\ROM\XIP\

Genera le voci di registro necessarie, esportandole dai default.hv e user.hv della ROM sorgente, e le converte in UTF-16

rgucomp.exe -o default.hv > default.txt
rgucomp.exe -o user.hv > user.txt
iconv.exe -t UTF-16LE default.txt > default.ucs-2le
iconv.exe -t UTF-16LE user.txt > user.ucs-2le

copia Tools\rguheader.UCS-2LE + default.ucs-2le + user.ucs-2le ---> 034e7cf6-8a37-40ad-85bd-6851b921866a.rgu

A questo punto viene avviato BuildOS.exe che provvederà a creare la struttura del filesystem e ad aggiungere le chiavi contenute nei file *.rgu dentro i file default.hv e user.hv prelevati da SYS/Metadata/. Il risultato delle operazioni di BuildOS viene salvato dentro la directory BuildOS/temp

Step 3: ExtReloc

Solite operazioni di pulizia del piano di lavoro:
4_cleanextreloc.bat
5_cleannew.bat

Lanciare 6a_extrelocandbuildxipfrombin.bat

Se non si ha intenzione di modificare moduli in imgfs o nello XIP, si possono saltare i sottopassi successivi di rilocazione dei moduli. In tal caso chiudere le finiestre di xipport e extreloc quando si presentano e copiare direttamente il file xip.bin da src\3 in new\1 (creare la directory new\1 nel caso non esistesse) e procedere con Step 4: build imgfs

**********************
* [xipport] Dump xip *
* [xipport] Close    *
**********************

All'apertura della finestra di XIPPort premere dump xip.bin e poi chiudere tranquillamente XIPPort.4)

Il file xip.bin sarà quindi scompattato nella cartella ExtReloc\OUT.

Dopo aver chiuso XIPPort sarà automaticamente lanciato ExtReloc. Seguire scrupolosamente i passi indicati a video:

********************************************************
* [extreloc]  Import xipport                           *
* [extreloc]  ReallocV                                 *
* [xipport]   Realoc P                                 *
* [xipport]   Write maps                               *
* [extreloc]  Realloc nk.exe, gsiir, ... button        *
* [xipport]   Realloc P again                          *
* [xipport]   Write maps                               *
* [extreloc]  Drag the vertical white line to the left *
* [extreloc]  Realloc imgfs                            *
* [xipport]   Build xip_out.bin                        *
* [extreloc]  Close xipport and extreloc               *
********************************************************

e cioè, spiegato in maniera più estesa:

In Extreloc:
- Import xipport (Rilancia XiPPort, ci servirà successivamente).
- ReallocV

In XiPPort:
- ReallocP
- Write maps

In Extreloc:
- Realloc NK.EXE, GSIIR, DLL, etc

In XiPPort:
- ReallocP (di nuovo)
- Write maps (Questo passo credo non serva a nulla… ma nel dubbio lo lascio…)

In Extreloc:
- Trascinare la linea bianca verticale verso il bordo sinistro per visualizzare la schermata relativa al realloc di IMGFS
- Realloc IMGFS modules

In XIPPort:
- Build xip_out.bin

Chiudere la finestra di XIPPort, chiudere la finestra di Extreloc.
Se tutto è andato a buon fine dovremmo avere il file xip.bin dentro la directory new\1

Step 4: build imgfs

Lanciare il file 8_imgfsfromdump.bat per ricostruire il nuovo imgfs.bin a partire da quanto contenuto in BuildOS\temp.

Il nuovo imgfs sarà creato all'interno della directory new\1

Step 5: riassemblare flash.nb0

Lanciare 97_pmud1.bat.

Verrà ricostruito FLASH.nb0, iniettando i nuovi imgfs.bin e xip.bin nel flash.nb0.os.nb presente in src\2, e unendo il tutto con il file flash.nb0.PRE ottenuto precedentemente e anch'esso memorizzato in src\2.

Il risultato viene post in new\4

Step 6: assemblaggio di ciphone.bin

Lanciare 99_IDT.bat per avviare IDT e ricostruire la nuova ROM ciphone.bin.

Se compare la finestra Password premere Cancel (la finestra compare solo nel caso non ci sia un file chiamato ciphone.bin nella directory di IDT).

Dal menù selezionare View → Image merge

Platform select: GSM/EGPRS

Premere il tasto di merge

Confermare l'operazione

Inserire l'hw version: 1.0.0.05)

Salvare l'immagine con il nome ciphone.bin nel percorso proposto.

Chiudere la scheda di image merge

A questo punto è possibile effettuare direttamente il flash rilanciando IDT e mettendo il telefono in modalità flash.

Nota 1: L'immagine logo.bmp corrisponde all'immagine visualizzata nelle prime fasi di avvio del telefono ed è archiviata in new\0.
Nota 2: Verificare che gli elementi elencati in RAMInit, USBLoad, XLDR, IPL siano corretti ed esistano nel path indicato src\4. In caso contrario si potrebbe brickare irrimediabilmente il telefono.

Personalizzare la ROM

Eseguendo i passi soprastanti, è possibile scomporre, e successivamente riassemblare una ROM pre-esistente. L'operazione di per se è abbastanza sterile, e acquista senso soltanto quando il cuoco è intenzionato ad apportare delle modifiche alla ROM originale per personalizzarla secondo le proprie esigenze.

A tal fine è possibile intervenire modificando il filesystem nel passo 2:

  • Dopo il lancio di 3a_buildos_from_dump.bat e prima di premere la freccia verde per quanto riguarda le modifiche a pacchetti contenuti in BuildOS\OEM, BuildOS\ROM e BuildOs\SYS.
  • Al termine delle operazioni di BuildOs andando ad operare direttamente nella directory BuildOs\temp

Qualora le personalizzazioni richieste contemplino la modifica dello XIP, allora si dovrà agire nel passo 3, dopo aver eseguito il dump dello XIP, andando a lavorare nella directory ExtReloc\OUT prima di eseguire le operazioni di rilocazione di ExtReloc.

1) Attenzione: la directory src verrà svuotata, quindi procedere con un backup del contenuto se lo si ritiene necessario.
2) In teoria si dovrebbe poter usare xidump -b per ricostruire la struttura dei pacchetti anche per imgfs… ma su alcune rom xidump divide erroneamente i pacchetti tra OEM e SYS e quindi prediligo utilizzare packagebuilder per la ripacchettizzazione.
3) Vale lo stesso discorso per il backup visto in nota precedentemente.
4) Avremmo potuto utilizzare il dump di XIP ottenuto precedentemente, tuttavia il formato prodotto da XIPPort è più conforme a quello che ExtReloc si aspetta di ricevere in ingresso, e quindi è meno laborioso procedere con il redump di xip.bin.
5) Il valore dovrebbe essere indifferente, avendo disabilitato nelle opzioni la verifica dell'hw version.