Tout ce qui suit concerne les langages compilés, les langages interprétés peuvent être décompilé "facilement", mais pas forcément lu facilement
Le décompilateur le plus efficace à l'heure actuelle est IDA Pro. Pourquoi? Il reconnaît des fonctions à partir de leur signature, ce qui te permet d'obtenir un code facilement compréhensible dans le cas où tu as la/les signature(s) correspondante.
Si tu veux compliquer la tâche aux décompilateurs, il faudra que tu packes ton code (cad le crypter) avec des softs comme UPX. Ca rebutera les moins entêtés, bien que ce type de protection commence à être connu. Parmi les autres solutions, tu as la manipulation des en-têtes (particulièrement les tables d'import de fonctions), tu as le code auto-modifiable ou encore les dongles (qui doivent être bien utilisé, sinon ils ne servent à rien).
Si tu veux un peu plus te renseigner sur ce type de chose, je ne saurais que trop te conseiller d'aller faire un tour sur crackmes.de ou de faire une recherche google sur crackmes. Tu verras et les protections, et les solutions mise en place.