Kommt drauf an, in welcher Programmiersprache das Programm geschrieben wurde, und evtl. ob Debuggingsymbole vorhanden sind.
Bei alten Visual-Basic-Programmen konnte man den Quelltext problemlos auslesen, bei VB.net kann man in "nur" relativ leicht dekompilieren.
Generell kann man Java und .NET-Binaries recht gut reversen.
Kompilierte AutoIt-Programme oder einige Pytthon-Wrapper enthalten auch ebenfalls den Originalquelltext.
Bei "richtigen" kompilierten Programmiersprachen wie C++, ist es unmöglich an den Quelltext ran zu kommen. Man könnte höchstens eine ausführbare Datei disassemblieren, aber das hat Laien um und ist nur was für Profis.
Wenn man ganz viel Glück hat, waren die Entwickler dämlich, und haben ausversehen einene Debug-Build veröffentllicht. Dieser Enthält Debugging-Symbole, was im Grunde große Teile des Originalquelltextes sind.
Das kommt aber auch nicht sooo häufig vor, auch wenn dieser Fehler hin und wieder einigen Entwicklern unterläuft.
Ansonsten kommt man uneingeschränkt eigentlich nie an den Originalquelltext eines Programms ran! :)