Den Source kann man ganz einfach aus _jedem_ Programm auslesen. Die Frage ist nur, zu welchem Grad. Bei interpreted (z.B. PHP, JS, Dart,...) und JIT compiled (z.B. VB, C#, Java,...) languages ist dies zu einem Grad möglich, an dem du sogar ganz einfach wieder eine High-Level Sprache raus bekommst. Bei compilierten Programmen (z.B. geschrieben in C, C++, Delphi,...) bekommt man meistens nur ASM zurück.
Selbst ein Obfuscator oder Packer kann daran nichts ändern, denn der Computer muss das Programm ja trotzdem lesen können. Was der Computer lesen kann, kann auch ein Mensch lesen.
Was bringt also ein Obfuscator?
Er baut den Quelltext so um, dass es sehr viel schwerer wird, den Sinn des Programmes zu verstehen (ohne die grundlegende Funktionsweise des Programmes zu ändern).
Ein Nebeneffekt ist meistens Performanceverlust.
Aber wie gesagt, mit herumprobieren lässt sich der Quellltext immer wieder herausfinden. Du kannst nur versuchen, es so schwer als möglich zu machen (so dass es einfacher ist, das Programm neu zu programmieren, als deinen Quelltext heraus zu finden).
Zudem gibt es zu den meisten Obfuscatoren in deiner Liga bereits De-Obfuscatoren, die den Obfuscation Prozess rückgängig machen können.
Gute Obfuscatoren kossten sehr viel Geld und es dauert meist nicht lange, bis ein Gegenprodukt entwickelt wurde (also musst du immer auf dem neusten Stand bleiben - wie bei allem im Computer Bereich)
Da du diese Frage hier stellst nehme ich aber sowieso an, dass dein Quelltext nicht genug Wert ist, um ihn zu obfuscaten, da er wahrscheinlich schneller neu geschrieben ist, als den .NETReflector o.ä. zu benutzen.
An deiner Stelle würde ich mir daher keine großen Gedanken darum machen.
Zudem verdient man heutzutage nicht mit Programmen Gelkd, sondern mit dem Support für die Programme (gerade weil es so einfach ist, sie zu cracken)