That operation has been broken (in the sense of "breaking the code"),
given the existence of DNA, and assuming you're not talking about
*cooked* hamburger (which, as I understand it from various "CSI"
TV shows, destroys the DNA). Of course, it's still more economical
to raise another cow rather than attempting to clone one.
You also do not get the same cow that you had before since the new cow will
not have the memories and experiences that the old cow did. You will
likely get something that is quite similar with similar tendencies; but,
some things are also likely to be different.
Executables do not contain anywhere near the hints provided by DNA.
You may or may not lose:
- auto variable names (if no debug symbols)
- types (if no debug symbols) (if ints and longs are 4 bytes
each, you can't tell which was intended, and then port
the program to a system where that isn't true). You also
can't tell for sure whether loading 2 bytes of variable
is due to the variable being two bytes, or it's an
optimization of variable&65535.
- structures. It's difficult to tell whether two variables
close to each other are part of the same structure or just
different variables
- function names (if no symbols)
- Macros. Calls to things like getc() may expand to wierd stuff.
Also, the constant 1 might be SEEK_CUR, EXIT_FAILURE, SIGHUP,
SIG_IGN, or something else.
Indeed, there is no such thing as a decompiler; but, there are
deassemblers, used for reverse engineering, that can provide guesses to
information that is missing in the binary. Depending on how optimized the
program is, they can sometimes identify things like loop constructs and
notice data that is always used and manipulated together. The generated
assembly code includes the meta-information detected in its comments and
automatically generates replacement variable names for what types it able
to detect that you can search and replace as you figure out their
functionality. They still are not going to get you anywhere near the
origional C source; but, the information that they can provide makes it
much easier to figure out how and what a program is doing.