Fala ai Victor, tudo bem? Quanto ao C# não sei opinar, mas, em aplicações Java por exemplo.
Nós geramos um .jar
ou .war
final da aplicação e ambos são passíveis de engenharia reversa.
Eu mesmo já peguei um .war
e voltei para os códigos Java.
Sobre o Node, sim, o que diz tem razão em partes.
Geralmente quando vamos publicar um projeto em Node é feito N técnicas para que tenhamos o código mais enxuto possível.
Dessa maneira, o código final será muito complexo de se ler.
Algo do tipo:
"use strict";var commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(n,t){return n(t={exports:{}},t.exports),t.exports}var lodash=createCommonjsModule(function(F,N){(function(){var ro,eo="Expected a function",uo="__lodash_hash_undefined__",io="__lodash_placeholder__",oo=16,fo=32,ao=64,co=128,lo=256,so=1/0,ho=9007199254740991,po=NaN,vo=4294967295,_o=[["ary",co],["bind",1],["bindKey",2],["curry",8],["curryRight",oo],["flip",512],["partial",fo],["partialRight",ao],["rearg",lo]],go="[object Arguments]",yo="[object Array]",bo="[object Boolean]",wo="[object Date]",mo="[object Error]",xo="[object Function]",jo="[object GeneratorFunction]",Ao="[object Map]",ko="[object Number]",Oo="[object Object]",Io="[object Promise]",Ro="[object RegExp]",zo="[object Set]",Eo="[object String]",So="[object Symbol]",Co="[object WeakMap]",Wo="[object ArrayBuffer]",Lo="[object DataView]",To="[object Float32Array]",Uo="[object Float64Array]",Bo="[object Int8Array]",$o="[object Int16Array]",Do="[object Int32Array]",Mo="[object Uint8Array]",Fo="[object Uint8ClampedArray]",No="[object Uint16Array]",Po="[object Uint32Array]",qo=/\b__p \+= '';/g,Go=/\b(__p \+=) '' \+/g,Zo=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Ko=/&(?:amp|lt|gt|quot|#39);/g,Vo=/[&<>"']/g,Ho=RegExp(Ko.source),Jo=RegExp(Vo.source),Yo=/<%-([\s\S]+?)%>/g,Qo=/<%([\s\S]+?)%>/g,Xo=/<%=([\s\S]+?)%>/g,nf=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,tf=/^\w*$/,rf=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ef=/[\\^$.*+?()[\]
Isso é um pequeno trecho de código de um bundle final.
Outro detalhe: Se o hacker conseguiu chegar no seu servidor e passou por todo processo de segurança, ai não tem o que fazer, a culpa não é da linguagem.
Espero ter ajudado.