Use DD to write specific file recursively
Asked Answered
C

3

5

I have a hard drive that I want to overwrite, not with null bytes, but with a message.

48 69 64 64 65 6e 20 = "Hidden "

Here's my command thus far:

echo "Hidden " > /myfile
dd if=/myfile of=/dev/sdb bs=1M

Note: I have also tried an assorment of parameters such as count and conv to no avail

Now, this is fine. When I run:

dd if=/dev/sdb | hexdump -C | less

I can see the first few bytes written over, however, the rest is unchanged. I'd like to recursively write "Hidden " to the drive.

Cassius answered 21/12, 2013 at 0:59 Comment(2)
You meant repeatedly, not recursively. See recursion on WikipediaScharff
Your question has been already answered and accepted, but here's a helpful hint for saving you some typing: dd if=/dev/sdb | hexdump -C | less Can be written as: hexdump -C /dev/sdb | lessPrejudice
A
14

I don't have a spare disk to try this out on, but you can use the yes command to continuously push your string into the pipe:

yes "Hidden" | dd of=/dev/sdb

I assume once dd has written the whole disk, then it will close the pipe and this command will finish.

The above will newline-delimit the "Hidden" string. If you want it space-delimited, as in the question you can do:

yes "Hidden" | paste -d' ' -s - | dd of=/dev/sdb

Or if you want it null-delimited:

yes "Hidden" | tr '\n' '\0' | dd of=/dev/sdb
Ables answered 21/12, 2013 at 1:30 Comment(3)
This one did it! Thanks! The paste command isn't required, but it's a lot neater in there with a null delimiter.Cassius
+1 from me too, learn something every day, never heard of the yes command :)Lierne
Yes, the paste command isn't strictly necessary unless you want "Hidden" to be space-delimited. Otherwise it will be newline-delimited. Glad it worked for you!Ables
L
3

If you don't specify if parameter, input is read from stdin. This allows you to do something like this:

dd of=/dev/sdb < for((i=0;i<100000;i++)); do echo 'Hidden '; done;

The value of 100000 obviously needs to be at least diskSizeInBytes / strlen('Hidden ').

Given the consequences I didn't test this for you but it ought to work ;)

Lierne answered 21/12, 2013 at 1:10 Comment(2)
Hmmm... it didn't seem to take the parenthesis, so building off of your idea I made this: for((i=0;i<100000;i++)); do echo 'Hidden ' | dd of=/dev/sdb; done; which seems to simply write "Hidden " 100000 times in the first bytes :)Cassius
You're doing it the wrong way round - you're now starting dd 100000 times instead of piping the combined output of 100000 echos to it once. Move the entire dd call out of the loop.Lierne
A
2

dcfldd, a fork of dd, has some additional features that you may find useful. For example, your problem would be solved by:

dcfldd textpattern="Hidden " of=/dev/sdb bs=1M
Auricular answered 21/12, 2013 at 1:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.