Para fazer isso você precisará de alguns requisitos:
- Pacote coreutils (qualquer distribuição Linux o traz; Existe para Windows no site da GNU ou o Cygwin e semelhantes).
- Saber quantos bytes tem seu dispositivo (para isso podemos usar o cfdisk, no Linux. Não tenho sugestão para Windows, mas deve haver).
- Conhecimentos com os programas do pacote coreutils: dd, split, cat.
- Uma calculadora (pode ser a expr do pacote coreutils também).
- Papel e caneta (serão feitas muitas anotações).
- Acesso a super usuário no Linux (seja por senha ou pelo sudo).
De posse disso e alguma matemática, podemos usar esse artigo para proteger informações, recuperar informações, formatar um HD sem perder os dados dentro dele e muitas coisas mais.
Protegendo informações: a maneira simples
Nosso dispositivo: pendrive
Referenciado em /dev em: /dev/sdb
Quantidade total de bytes: 2052547072 (2GB aprox)
Setores: 4008881 (lembrando que o zero, no início, conta como um setor)
Gravaremos:
Arquivo: projetos.zip
Tamanho: 263192926 bytes (251MB aprox)
Quantidade de setores usados: 514048 perfeitos e 1 imperfeito com 350 bytes, ou seja, faltaram 162 bytes para 512 bytes. TOTAL: 514049 setores (usado para fins de recuperação)
Primeiramente vamos fazer um
md5sum desse arquivo para temos certeza que é ele que recuperamos no final. Vamos salvá-lo em um arquivo chamado projetos.zip.md5sum na pasta /home. Por exemplo, para isso:
# md5sum projetos.zip | dd of=projetos.zip.md5sum
Agora temos a soma para checarmos depois.
Dos 40 milhões e 88 mil e 81 setores do pendrive, vamos gravar nosso arquivo no setor 383300, por exemplo. Note que o setor que vamos gravar, mais número de setores que o arquivo ocupa, não pode ser maior que o número de setores do dispositivo, senão obviamente faltará espaço. Para isso:
# dd if=projetos.zip of=/dev/sdb seek=383299
Temos agora nosso arquivo lá. Mesmo que esse pen tivesse sistema de arquivos, ele não teria sido perdido, pois nada foi gravado em seus setores iniciais. Logo é possivelmente tanto ter um pen normal, como ter dados escondidos dentro dele. Note somente que se houver algumas informações referenciadas no sistema de arquivos no setor que acabamos de colocar o projetos.zip, ficará inválido, pois o conjunto de dados de projeto.zip o substituiu.
Para recuperar basta:
# dd if=/dev/sdb of=/home/t0 skip=383299 count=514049
Onde:
- skip = setores que serão lidos no dispositivo if e ignorados;
- count = quantidade de setores a serem lidos após skip e escritos.
Assim teremos um arquivo chamado t0 que contém os dados que haviam no local indicado. Vimos que nosso arquivo continha um setor imperfeito. Em teoria um arquivo ter dados a mais no seu final, não o corrompe, mas no md5sum por exemplo não dará certo, para ajeitar isso basta:
# dd if=t0 of=projetos.zip bs=263192926 count=1
Onde:
- bs = quantidade que o dd lerá e escreverá.. Aqui é o tamanho do nosso arquivo.
- count = quantidade de vezes que ele fará isso.. Nesses casos sempre será 1.
NOTA: Aqui temos um tamanho muito grande de dados em bs= e dependo da sua memória dará erro, pois esse valor é posto na memória para depois ser escrito na saída. Segue abaixo maneiras para contornar isso, caso esse seja seu problema:
Uma maneira mais simples:
# split -b 263192926 t0
Agora foram criados dois arquivos. Um com o tamanho do antigo projetos.zip chamado xaa e outro com o restante e que não pertencia a esse arquivo chamado xab.
Renomeie o xaa para projetos.zip e apague o xab:
# mv xaa projetos.zip
# rm xab
Agora passe o md5sum e veja que você acabou de obter o mesmo arquivo:
# md5sum -c projetos.zip.md5sum
Pronto!
Obs.: Nomes destino para os arquivos ficam por sua conta.
Vantagens e desvantagens dessa maneira
Essa é uma maneira fácil de fazer, porém apresenta alguns riscos caso pegue um usuário experiente. Por exemplo, no exemplo se tratava de um arquivo zip, no Windows existem programas que podem checar um arquivo zip e recuperar arquivos que estejam dentro de zipados, ou seja, se eu fizer uma imagem do pen inteiro gravando como um arquivo x.zip qualquer, posso usar esse programa para varrer o arquivo e recuperar o que tenha dentro. Uma alternativa a isso seria criptografar projetos.zip usando, por exemplo o
CCrypt. Está certo que essa criptografia pode ser quebrada, mas aí já exige um usuário ainda mais experiente. Lembrando que aí, ao invés de ir ao arquivo zip será usado o procedimento no arquivo saída do CCrypt.
Uma maneira mais complexa
Segue abaixo uma maneira mais complexa de recuperar o mesmo arquivo exemplo. Aqui teremos um outro qualquer, por definição eu escolhi um exe do Windows e ele tem 4194604 bytes, ou seja, 4MB aproximadamente. Seu nome é programa.exe.
Aqui misturaremos nosso arquivo zip com outro qualquer, a qual chamaremos de arquivo garbage.
Vamos olhar o tamanho do nosso arquivo zip em termos de divisão: 263192926
Se termina em par, sabemos que divide exato por 2. Podemos então fazer 2 partes e em cada uma colocar um arquivo garbage, por exemplo:
projeto.zip.part2 + garbage + projeto.zip.part1 + garbage
Assim não teríamos mais um arquivo íntegro. Mesmo que o pendrive fosse lido do setor 0 até seu último, seria impossível o mesmo programa que citei acima achar o arquivo em ordem. Mostrarei esse exemplo abaixo.
Vamos pegar nosso arquivo garbage (no caso o .exe que mencionei acima) e quebrá-lo em 2 partes:
# split -b 2097302 programa.exe
Temos o arquivos xaa e xab. Para evitar confusão vamos renomeá-los como garbage1 e garbage2.
# mv xaa garbage1
# mv xab garbage2
Agora vamos repetir o processo no projetos.zip.
# split -b 131596463 projetos.zip
Temos agora os mesmos dois arquivos xaa e xab. Renomeie-os para part1.zip e part2.zip, respectivamente.
# mv xaa part1.zip
# mv xab part2.zip
Agora vamos unir da ordem mencionada acima:
# cat part2.zip garbage1 part1.zip garbage2 > arquivo_unido
Temos agora um arquivo chamado arquivo_unido, que é a junção da ordem acima. Somando o tamanho dos dois veremos que temos um arquivo com 267387530 bytes. Dividindo ele por 512 obteremos o valor de 522241 setores perfeitos e 1 imperfeito. Basta repetir o processo usado anteriormente para colocá-lo no pendrive:
# dd if=arquivo_unido of=/dev/sdb seek=383299
Para recuperar teremos um pouco mais de trabalho:
# dd if=/dev/sdb of=t0 skip=383299 count=522242
Obtivemos o arquivo copiado de volta. Teremos agora que quebrá-lo e montá-lo várias vezes para obtermos o que queremos.
Olhemos novamente como é a formação do arquivo que obtemos:
part2.zip garbage1 part1.zip garbage2
As partes garbage não nos interessa, pois elas estão ali somente para separar os dados que queremos proteger. Precisamos agora fazer um processo de quebrar em partes que queremos tirar e montar o restante.
Primeira parte: par2.zip | tamanho = 131596463
Segunda parte: gargabe1 | tamanho = 2097302
Terceira parte part1.zip | tamanho = 131596463
Quarta parte: garbage2 | tamanho = 2097302
Métodos para recuperar
Podemos usar o DD para recuperar a primeira parte e depois quebrá-lo em dois (deixando a terceira parte no início) e repetindo o processo, fica:
# dd if=t0 of=f2 bs=131596463 count=1 (aqui obteremos o part2.zip)
NOTA: Se você não tiver a quantidade especificada no parâmetro "bs", poderá obter erro. Sempre coloque valores que seu PC possa gerenciar. Use o count para isso. Se você você colocar bs=5 e count=10, ele é a mesma coisa que colocar bs=50 count=1.
Agora quebremos o arquivo t0 em dois e repetimos o processo no segundo arquivo, assim teremos o part1.zip.
# split -b 133693765 t0
Temos agora as partes: xaa e xab
Para nós somente interessa a parte xab. Basta repetir o mesmo comando dado ao dd no arquivo t0 para obtermos a parte1.zip:
# dd if=xab of=f1 bs=131596463 count=1
Depois una os dois arquivos e pronto:
# cat f1 f2 > projetos.zip
Faça md5sum e cheque:
# md5sum -c projetos.zip.md5sum
Pronto! Com certeza matemática seu arquivo é o mesmo.
Assim como esse jeito, existem muitos outros mais, bem como muitas outras coisas que eu ou não mencionei ou esqueci de mencionar, porém dá para ter uma idéia da lógica que eu quero passar. Qualquer maneira que você pense e que resulte partes corretas do arquivo, será a mesma coisa. Use a que fica mais em conta para você.