Hmm interessant. Ich könnte mir allerdings vorstellen, dass das nicht nur sehr aufwändig, sondern mit den hier vorliegenden Programmiersprachen schier unmöglich sein sollte (zumindest mit Java sollte das definitiv unmöglich sein). Dieses Vorgehen fordert, so wie es sich für mich anhört, eine sehr hardwarenahe, fast schon Assembler-artige Kontrolle darüber, welche Speicherbereiche tatsächlich Datenbereiche darstellen und welche Speicherbereiche asuführbaren Maschinencode enthalten (denn die verschlüsselten Segmente wechseln vom einen zum anderen Zustand).
Unter C++ kannst du für den Linker angeben, was in welches Segment gelinkt wird. Sehr aufwendig war es eigentlich nicht, ich hatte das mal getestet, weil es mich interessiert hatte. (Beim debuggen musste man aufpassen, da der Debugger einen INT 3 an die Stelle im Speicher schreibt, wo der Breakpunkt hin soll. Damit kann man, wenn der Breakpunkt aus einer vorhergehenden Sitzung noch an einer verschlüsselten Speicherstelle saß, die Entschlüsselung verhunzen.)
Von C# hab ich keine Ahnung.