Massimo Bollati bio photo

Massimo Bollati

Non e' mai troppo tardi!

Occorrono i diritti di root e la recovery console

Differenza tra una clone bitstream ed una copia per file.

Per file

Una copia per file è un metodo che tiene conto del filesystem, il sistema operativo deve “conoscere” il filesystem e verranno copiati solo i dati allocati ( i dati cancellati ancora presenti non verranno copiati ). Se nel filesystem c’è molto spazio libero, questo sarà un metodo si rivelerà molto efficiente.
E’ possibile copiare, creare un archivio e comprimerlo ma è preferibile copiare, comprimere e POI creare un archivio contenente file compressi singolarmente.
In questo modo se un archivio viene danneggiato ci saranno molte più possibilità di recuperarne i file all’interno.
Afio è il programma che uso per questo scopo:
Afio
Con afio, pax, cpio, ecc. è anche possibile copiare in modalità “copy pass” da una directory/filesystem ad un altro:

find /media/sda2/home/max/ -depth -print | cpio -pdmv /media/sda1/backup_home_max/  

mentre un archivio “solido” sarebbe:

find /media/sda2/home/max/ -depth -print | afio -ovZ /media/sda1/backup_home_max/home_max.afio

Ci sono molte caratteristiche interessanti in afio, è possibile verificare l’archivio verso il filesystem:

afio -rvZ

è possibile estrarre dall’archivio solo i file individuati da un’espressione regolare, è possibile controllare il contenuto dell’archivio senza estrarlo, è possibile usare qualsiasi programma di compressione al quale afio può fornire anche alcuni parametri ( es xz -9).

Bitstream

Con una copia bitstream il sistema operativo rimane “agnostico” rispetto al filesystem, non ha bisogno di drivers o altri programmi per interagire con esso. Il filesystem viene copiato bit su bit in un file o in un’altro filesystem.

dd if=/dev/sda of=/dev/sdb

In questo modo viene clonato l’HD sda su l’HD sdb.
Per operazioni di recupero files o indagini forensi questo è sicuramente il metodo da adottare.
E’ anche possibile creare un md5sum dell’ HD originale e verificarlo con quello del clone. Dcfldd e dc3dd possono generare un hash durante la copia, anche con diversi algoritmi.
Oltre a dd, dc3dd, dcfldd vale la pena citare Gnu ddrescue.
E’ il programma da utilizzare quando si è alle prese con un Hard Disk malfunzionante.
La tecnica in genere consiste nel lanciare ddrescue facedolo recuperare velocemente più dati possibili in un passaggio “saltanto” i settori danneggiati ( potrebbe essere l’ultimo…) per poi rilanciarlo con passaggi multipli in modo da estrarre più dati possibili dai settori danneggiati.
GNU ddrescue

Cosa ci occorre

Optiamo per una copia bitstream, la memoria interna del mio Samsung S4 I9505 scopriremo avrà ben 29 partizioni!!! Sarebbe un incubo fare una copia per file montandole una per una!
Con un clone potrei fare un restore della memoria interna con un solo comando.
Potrei anche recuperare i dati cancellati dallo spazio non allocato
Operando in un ambiente ristretto ( recovery ) in termini di possibilità di accesso dove i programmi necessari per effetture queste copie sono solo delle applets di busybox, una copia bitstream è più semplice che una copia per file.

Recovery

Nel mio Samsung S4 I9505 ho una recovery Philz che per lo scopo è più che adatta.

Inizio dei giochi

  • Installare o, meglio, scaricare e decomprimere l’archivio contente adb, ho trovato l’ultima versione qui:
    http://downloads.puresoftware.org/files/android/adt-bundle/
  • Connettere il telefono al pc attraverso il cavo usb
  • Avviare il telefono in modalità recovery
  • Se il telefono chiede conferma per l’usb debugging accettare
  • cd adt-bundle-linux-x86-20140702/sdk/platform-tools/
  • Assicurarsi di avere spazio a sufficienza per salvare il clone ( il mio GS4 ha una memoria interna di 16G )
  • lanciare ./adb shell ( controllare il telefono per eventuali richieste ) Ora dobbiamo farci un’idea del device:

cat /proc/mounts ci dà:

tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
tmpfs /tmp tmpfs rw,seclabel,relatime 0 0
tmpfs /storage tmpfs rw,seclabel,relatime,mode=050,gid=1028 0 0
tmpfs /mnt/secure tmpfs rw,seclabel,relatime,mode=700 0 0
tmpfs /mnt/fuse tmpfs rw,seclabel,relatime,mode=775,gid=1000 0 0

Questo è positivo in quanto la memoria interna non sembra montata
Ora cerchiamo il device che rappresenta la memoria interna:

cat /proc/partitions ci dà:

major minor #blocks name
179 0 15388672 mmcblk0
179 1 12772 mmcblk0p1
179 2 52764 mmcblk0p2
179 3 128 mmcblk0p3
179 4 256 mmcblk0p4
179 5 512 mmcblk0p5
179 6 2048 mmcblk0p6
179 7 512 mmcblk0p7
179 8 512 mmcblk0p8
179 9 16896 mmcblk0p9
179 10 13952 mmcblk0p10
179 11 3072 mmcblk0p11
179 12 3072 mmcblk0p12
179 13 780 mmcblk0p13
179 14 780 mmcblk0p14
179 15 780 mmcblk0p15
179 16 2826240 mmcblk0p16
179 17 8192 mmcblk0p17
179 18 2119680 mmcblk0p18
179 19 6144 mmcblk0p19
179 20 10240 mmcblk0p20
179 21 10240 mmcblk0p21
179 22 10240 mmcblk0p22
179 23 6144 mmcblk0p23
179 24 3072 mmcblk0p24
179 25 8 mmcblk0p25
179 26 9216 mmcblk0p26
179 27 512000 mmcblk0p27
179 28 20480 mmcblk0p28
179 29 9728000 mmcblk0p29
179 32 30703616 mmcblk1
179 33 30699520 mmcblk1p1

Facile:

  • mmcblk1, with mmcblk1p1 è la microsd ( una sola partizione e, oltretutto, è il secondo device )
  • mmcblk0 con le sue 29 partizioni è la memoria interna ( con 29 partizioni non c’è dubbio che è una gpt table )

Cloning

dd dovrebbe fare tutto il lavoro:

./adb shell “su -c dd if=/dev/block/mmcblk0”| dd of=/media/sda4/gs4_int_mem.dd

( or /adb shell “su -c dd if=/dev/block/mmcblk0”| dd of=/media/sda4/gs4_int_mem.dd if you are not root )

Dopo un paio di ore (!) ho avuto il mio clone, un rapido controllo sulle partizioni:

parted media/sda4/gs4_int_mem.dd print

…e una grossa delusione!!!

Error: Both the primary and backup Try making a fresh table, and using Parted’s rescue feature to recover partitions.
Model: (file)
Disk /media/sda4/gs4_int_mem.dd: 15.8GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags

Ho provato a recuperare la GPT con gpart…niente!
Ho provato a recuperare la GPT con testdisk…niente!

Ho provato a sostituire il cavo USB e provato con:
adb ./adb shell "cat /dev/block/mmcblk0" | pv > mmcblk0.raw  

…ancora una GPT corrotta!

La soluzione:

  • dd funziona come previsto anche se è il “dd di busybox”, il problema risiede in adb che converte gli LF in CR-LF

Il comando giusto allora sarà:

adb  shell 'stty raw && dd if=/dev/block/mmcblk0' > gs4_int_mem.dd

“stty raw” lascia l’input e l’output “raw”, senza processarlo/convertirlo

Ora, parted gs4_int_mem.dd print ci dà:

Model: (file)
Disk /media/sda4/gs4_int_mem.dd: 15.8GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: Number Start End Size File system Name Flags
1 4194kB 17.3MB 13.1MB apnhlos
2 17.3MB 71.3MB 54.0MB mdm
3 71.3MB 71.4MB 131kB sbl1
4 71.4MB 71.7MB 262kB sbl2
5 71.7MB 72.2MB 524kB sbl3
6 72.2MB 74.3MB 2097kB aboot
7 74.3MB 74.8MB 524kB rpm
8 74.8MB 75.4MB 524kB tz
9 75.4MB 92.7MB 17.3MB pad
10 92.7MB 107MB 14.3MB ext4 efs
11 107MB 110MB 3146kB modemst1
12 110MB 113MB 3146kB modemst2
13 113MB 114MB 799kB m9kefs1
14 114MB 115MB 799kB m9kefs2
15 115MB 116MB 799kB m9kefs3
16 116MB 3010MB 2894MB ext4 system
17 3010MB 3018MB 8389kB persist
18 3018MB 5189MB 2171MB ext4 cache
19 5189MB 5195MB 6291kB param
20 5195MB 5205MB 10.5MB boot
21 5205MB 5216MB 10.5MB recovery
22 5216MB 5226MB 10.5MB fota
23 5226MB 5233MB 6291kB backup
24 5233MB 5236MB 3146kB fsg
25 5236MB 5236MB 8192B ssd
26 5236MB 5245MB 9437kB ext4 persdata
27 5245MB 5770MB 524MB ext4 hidden
28 5770MB 5791MB 21.0MB carrier
29 5791MB 15.8GB 9961MB ext4 userdata

Ora ci serve la bash

Per montare una delle 29 partizioni dobbiamo calcolare l’offset della partizione stessa e passare questo parametro al programma “mount”:

mount -o loop,offset=xxx gs4_int_mem.dd /mount_point/

Se vogliamo “giocare” con così tante partizioni abbiamo bisogno di un automatismo:
#!/bin/sh
###Simple ( KISS ) script to loopback mount a partition from an image
###calculate the offset
###Massimo Bollati one day in 2014
#Controlla che sia passato il nome del file al comando
if [ "$#" -ne "1" ]; then
echo -e "\n\n\t\t\033[01;31mNon hai specificato il nome del file\n\n\t\tUso: `basename $0` <nome del file d'immagine>\n\n\n\033[01;33m" >&2
exit 1
fi
FILE=$1
#Mostra le partizioni trovate
echo -e "\n\n\t\tQueste le partizioni trovate:\n\n\n\t`parted $FILE print `\n\n"
echo -e "\n\n\t\tInserisci il numero di partizione da montare e premi return"
read PART
mkdir -p /media/offsetm
DEST="/media/offsetm"
#Controlla se esiste la partizione
if
[ `parted -m $FILE print | cut -d ":" -f1|grep -v BYT|grep -v "/"|grep -w "^$PART"` ]
then
echo -e "\n\n\n\t\t\tMonto la Partizione n. $PART in \033[40m\033[1;32m$DEST\033[0m\033[01;33m\n\n\n"
else
echo -e "\n\n\n\t\t\033[01;31mHai inserito $PART ma le partizioni sono:\n\n `parted $1 print` ....esco!!\033[01;33m\n\n\n"
exit 1
fi
#Abilitare per avere un controllo sulla presenza di parted #if ! wich parted > /dev/null 2>&1; then
# echo "Non trovo parted....esco" >&2
# exit 1
#fi
#FILE=$1
#PART=$2
#DEST=$3
UNITS=`parted -m $1 unit s print| grep -v "/" |cut -d ":" -f1-2|grep "^$PART:" | cut -d ":" -f2| sed -s s/s/""/ OFFSET=`expr 512 '*' $UNITS
###Enable below for debug
#clear
#echo -e "UNITS > $UNITS\nOFFSET $OFFSET\nDEST $DEST\nFILE $FILE"
#read ok
mount -o loop,offset=$OFFSET $FILE $DEST
Non copiare il testo qui sopra, si tratta di sorgenti markdown processati…meglio prendere il file direttamente da qui:

Ora possiamo montare/smontare ogni partizione in pochi secondi ed usare in nostro filemanager per esplorarla!
Possiamo estrarre lo spazio non allocato con blkls -f filesystem -o offset disk.dd > disk.blkls
Recuperare i files cancellati con foremost/scalpel/photorec…
Di seguito qualche esempio reale:
-
Mount_offset

Lista delle partizioni trovate e richiesta di inserire il numero di quella da montare

Part Mounted

E’ stata la scelta la partizione 29 che viene montata in /media/offset

Check Partition

Ci sono 5.3G di dati

Browse Partition

I nostri programmi impacchettati…
C’è anche una partizione “hidden”…diamo un’occhiata…

Hidden partition

Partition 27 ext4, hidden, is mounted in /media/offset

Hidden apps

Applicazioni nascoste nella partizione nascosta ;-))
Ultimo ma non meno importante…diamo un’occhiata alla partizione EFS!

EFS

Ecco il contenuto della partizione EFS, facile fare un backup!

Ci sono diversi punti migliorabili nello script:
  • gestire più punti di montaggio contemporaneamente ( ora si può montare una partizione per volta )
  • realizzare una piccola interfaccia grafica con yad e togliere tutti i caratteri speciali inseriti per avere una bash a colori
  • fare in modo che lo script gestisca tutto il processo dalla clonazione al montaggio delle partizioni
  • inserire una barra di progressione per il lungo processo di clonazione

Post a comment

All comments are held for moderation; basic HTML formatting accepted.

Name: (required)
E-mail: (required, not published)
Website: (optional)