🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: microsoft.public.es.vb
Article #3

Usando Linux para arreglar un USB roto

#3
From: Luis Garcia
Date: Thu, 26 Oct 2006 19:16
128 lines
7056 bytes
Un amigo m�o me pregunt� si pod�a recuperar alguna informaci�n que ten�a
muy importante en un USB que no funcionaba bajo Windows (por supuesto,
�d�nde lo iba a usar si no?). El caso es que lo llev� a varias tiendas de
inform�tica donde incluso lo probaron con un sistema operativo de gur�s
llamado Linux y nada, no consiguieron sacar nada de �l.

Sin embargo, el USB se pod�a leer entero, por lo que pens� que algo podr�a
sacarle punta. Primero saqu� toda la informaci�n que pude del USB:

dd if=/dev/sda of=fichero

Utilizando hexdump u od me di cuenta de que los primeros 0�20000 bytes
estaban puestos a 0xFF, por lo que parec�a que el USB hab�a fallado justo
por donde no deber�an fallar: la tabla de partici�n, sector boot y FAT. Un
disco as� es casi imposible de recuperar, salvo quiz� si puedes recuperar
una de las dos FAT que lleva el disco. Me puse a buscar a mano y vi que la
primera FAT estaba incompleta pero que la segunda podr�a estar intacta:

00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
|................|
*
00020000  01 df 02 df 03 df 04 df  05 df 06 df 07 df 08 df
|................|
00020010  09 df 0a df 0b df 0c df  0d df 0e df 0f df 10 df
|................|
00020020  11 df 12 df 13 df 14 df  15 df 16 df 17 df 18 df
|................|

Buscando la cadena 01 df 02 df hacia adelante descubr� que se repet�a: la
segunda copia de la FAT. Adem�s, la diferencia entre las dos apariciones
era de 0�1F400 bytes. Para localizar d�nde empieza, se puede buscar la
signatura f8 ff ff ff. Y la encontr� en 0�23600. Haciendo las restas,
supuse entonces que la primera FAT empezaba en 0�23600 - 0�1F400 = 0�4200.

As� que en principio, copiando los sectores de la FAT segunda a la primera
(250 sectores de 512 bytes en total) puedo reconstruir la FAT. Hago una
copia del fichero en el fichero.bak y utilizo dd:

dd if=fichero.bak of=fichero bs=512 seek=33 skip=283 count=250
conv=nocreat,notrunc

Esto es, copiar desde el sector 283 (la posici�n 0�23600) hacia el sector
33 (posici�n 0�4200) 250 sectores, que es el tama�o de la FAT. Esto nos da
informaci�n de cu�ntos sectores reservados va a tener inicialmente el
sistema de ficheros FAT16.

Ahora bien, �cu�ntos elementos tiene el directorio ra�z? Si record�is el
formato FAT, existen una serie de sectores reservados al principio, las dos
FATs (de todo ello sabemos el tama�o) y el directorio ra�z, cuyo tama�o
tambi�n est� especificado en el sector de arranque. �Cu�nto es ese tama�o?
No se sab�a. Hab�a que averiguarlo. Al irme al directorio ra�z encuentro
esto al principio:

00042a00  42 4c 4f 51 55 45 53 20  20 20 20 11 00 a5 2e 56  |BLOQUES
....V|
00042a10  f1 34 54 35 00 00 2f 56  f1 34 02 00 00 00 00 00
|.4T5../V.4......|
00042a20  e5 4f 4f 54 45 58 20 20  4c 4f 47 20 00 17 87 81  |.OOTEX  LOG
....|
00042a30  54 35 58 35 00 00 88 81  54 35 d7 00 50 06 00 00
|T5X5....T5..P...|
00042a40  e5 4f 4d 45 44 4f 52 20  44 57 4c 02 10 2b f0 a3  |.OMEDOR
DWL..+..|
00042a50  57 35 57 35 00 00 24 a6  57 35 1d 8b 41 00 00 00
|W5W5..$.W5..A...|
00042a60  44 45 54 41 4c 4c 45 53  20 20 20 10 00 4f 30 56  |DETALLES
..O0V|
00042a70  f1 34 1f 35 00 00 31 56  f1 34 25 02 00 00 00 00
|.4.5..1V.4%.....|

Perfecto, entradas de directorio. Encuentro cu�l es la �ltima y cuento.
Hice esto y no funcion�. El problema es que justo despu�s del directorio
ra�z hab�a otro directorio, y no sab�a exactamente d�nde terminaba.

As� que se me ocurri� la idea de buscar los ficheros especiales "." y "..".
S�lo un subdirectorio los tendr�a, lo que me dar�a la �ltima entrada del
directorio ra�z. �Bingo!:

00048000  2e 20 20 20 20 20 20 20  20 20 20 10 00 a5 2e 56  |.
....V|
00048010  f1 34 f1 34 00 00 2f 56  f1 34 02 00 00 00 00 00
|.4.4../V.4......|
00048020  2e 2e 20 20 20 20 20 20  20 20 20 10 00 a5 2e 56  |..
....V|
00048030  f1 34 f1 34 00 00 2f 56  f1 34 00 00 00 00 00 00
|.4.4../V.4......|

As� que el directorio ra�z tiene de tama�o 0�42a00 - 0�48000 en entradas de
32 bytes, esto es, 688 entradas. Ya tenemos todos los datos.
Como necesitaba un sector de arranque para la partici�n, cre� un fichero
del mismo tama�o que el l�piz usb:

dd if=/dev/zero of=valido bs=512 count=1024000

Y despu�s lo formate� con los datos que hemos obtenido:

mkfs.msdos -s 16 -R 33  -r 688 valido

16 sectores por pista, 33 sectores reservados y 688 entradas en el
directorio ra�z. Finalmente tengo que copiar el sector de arranque, que
est� en los primeros 512 bytes.

dd if=valido of=fichero bs=512 count=1 conv=nocreat,notrunc

Ya puedo montar el fichero:

mount fichero /mnt -o loop

Despu�s de hacer algunas pruebas para ajustar exactamente los par�metros,
he consegido recuperar mucha de la informaci�n del l�piz USB. Por supuesto
alguna se ha perdido, porque estos fallos normalmente se producen por
fallos en los bancos de memoria del USB, pero algo es algo.

Como informaci�n, decir que he probado varias utilidades para recuperar
sistemas de ficheros y ninguna ha funcionado. No eran capaces de ver todas
estas sutilezas. Esto me trae a la mente dos cosas, b�sicamente:

Ser�a interesante ofrecer estos servicios a las empresas o personas que lo
solicitaran.

Linux es una maravilla  y ha permitido recuperar informaci�n de un USB que,
seg�n Windows y otras tiendas especializadas en Inform�tica, para lo �nico
que val�a era para tirarlo a la basura.

Todo esto est� basado en un art�culo de Linux Journal.


http://neuromancer.inf.um.es/blog/?p=764
Technical Details
Message-ID: <eI2STOT#GHA.4524@TK2MSFTNGP04.phx.gbl>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news2.volia.net!newsfeed01.sul.t-online.de!t-online.de!news.tiscali.de!uio.no!newsfeed.cw.net!cw.net!news-FFM2.ecrc.de!TK2MSFTFEEDS01.phx.gbl!TK2MSFTNGP01.phx.gbl!TK2MSFTNGP04.phx.gbl

Show Full Headers
Complete Article Headers
X-Google-Thread: 10127e,e3b77c517566509,start
X-Google-Thread: 109233,e3b77c517566509,start
X-Google-Thread: 10b159,e3b77c517566509,start
X-Google-Thread: 10e463,e3b77c517566509,start
X-Google-Thread: f9ea8,e3b77c517566509,start
X-Google-Thread: 11353e,e3b77c517566509,start
X-Google-Thread: 105e57,e3b77c517566509,start
X-Google-Attributes: gid10127e,gid109233,gid10b159,gid10e463,gidf9ea8,gid11353e,gid105e57,public
X-Google-Language: SPANISH,ASCII
From: "Luis Garcia" <luis_siaz@redestb.es>
Subject: Usando Linux para arreglar un USB roto
Date: Thu, 26 Oct 2006 21:16:27 +0200
Lines: 132
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2900.2869
X-RFC2646: Format=Flowed; Original
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2962
Message-ID: <eI2STOT#GHA.4524@TK2MSFTNGP04.phx.gbl>
Newsgroups: microsoft.public.es.vb,microsoft.public.es.dotnet.vb,microsoft.public.es.windowsxp,microsoft.public.es.officexp,chile.comp.pc,microsoft.public.es.access,microsoft.public.es.win2000
NNTP-Posting-Host: 24.244.147.200
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news2.volia.net!newsfeed01.sul.t-online.de!t-online.de!news.tiscali.de!uio.no!newsfeed.cw.net!cw.net!news-FFM2.ecrc.de!TK2MSFTFEEDS01.phx.gbl!TK2MSFTNGP01.phx.gbl!TK2MSFTNGP04.phx.gbl