Modificarlo nel senso modificare i suoi source, significherebbe che tu hai il sorgente, che lo modifichi e poi lo ricompili. Ma non mi pare sia il tuo caso, perciò parlare di "modifica al sorgente" è sbagliato.
Gli eseguibili in Windows si possono distinguere in 2 macro categorie (anche se non è cosi', la sto facendo breve):
-codice nativo, cioè codice non gestito. I classici eseguibili fatti in c/c++, delphi, vb6 ecc... Il sorgente viene compilato in un eseguibile nativo e lanciato dal PE loader di windows
-codice gestito (eseguibili .Net). Il sorgente viene trasformato in codice IL (intermediate language) il quale verrà compilato dal JIT (just in time) del CLR del DotNet.
la differenza di risultato tra questi due tipi di eseguibili è sostanziale.
Nel primo caso reversando (disassemblando) l'eseguibile in codice nativo otterrai l'interpretazione in ASM di esso. Lo dice la parola stessa, si disassembla. In questo caso le protezioni possono essere seriamente potenti, virutalizzando, monitorando, e proteggendo il codice in mille modi.
Nel secondo caso non c'è codice da disassemblare, pertanto l'eseguibile va reflectato, ottenendo codice IL, che puo' a sua volta essere letto direttamente come codice C# o VbNet. La difficoltà maggiore solitamente è rappresentata dalla confusione provocata dagli offuscatori.