اولا اون برنامه ایی که DLL و یا .exe های برنامه های .NET رو باز میکنه ILDASM هست. Reflection یک کلاس هست و این امکان رو میده که با Assembly که .NET دارد کار کنید. مثلا اگر شما میخواهید یک زبان جدید برای .NET بنویسید و یا کارهای dynamic دیگری در کد کنید.
دوما همچین چیزی در Java هم امکان پذیر است که شما bytecode برنامه رو به سادگی میبینید و تغییر مدهید. شما حتا اگر در C یا Assembly هم کد بنویسید، خروجی شما دوباره به سادگی میتواند به Assembly تبدیل شود و تغییر داده شود.
این Reverse Engineering ها نه ضعف است و نه فقط در یک زبان یا تکنولوژی قابل مشاهده است.
شما یکی از راههایی که برای امن کردن کد خود میتوانید به کار ببرید، پروژه رو بعد از اتمام Obfuscated کنید. این باعث میشه که کد میانی (Microsoft Intermediate Language) یا همان MSIL، سختر قابل فهم باشه، زیرا اسم تمامی کلاس ها و متغییر های شما بصورت Random نام گذاری میشود و فهم آن بسیار سخت میشود.
http://en.wikipedia.org/wiki/Obfuscated_code
ولی این بدین معنا نیست که کد شما Crack نمیشود، چون این امکان ندارد که شما کد غیر قابل Crack بنویسود.