In der Regel hilft googeln

Aber ein guter Disassembler sei der IDA Pro Disassembler. Nur sein Preis ist jenseits von gut und böse

Zur zweiten Frage: Das Programm muss einfach nur als ausführbaren Maschinencode vorliegen, oder für Ottonormalverbraucher als Exe Datei.
Aber wie Zer00 schon sagte, ist das ganze nicht einfach. Denn beim Kompilieren/Assemblieren gehen viele für den Menschen lesbare Informationen verloren, die man nach dem Disassemblieren in mühsamer Knochenarbeit wieder herstellen muss. Z.B. werden Variablennamen bei der Assemblierung durch Zeiger ersetzt. Gute Disassembler sind da zwar in der Lage, solche Sachen durch eigene Bezeichner zu ersetzen. Aber diese sind dann immer noch nicht Aussagekräftig. Bei wenig Code ist das zu verschmerzen, aber angenommen, man möchte den IExplorer disassemblieren

Ein weiteres Problem ist, das diverse Disassembler nicht in der Lage sind, zu unterscheiden, wann sie Programmcode und wann sie einfach nur Daten z.B. Strings vor sich haben. Das führt dann dazu, dass auch mal ein String disassembliert wird

Sieht dann ziemlich komisch aus...