保护.NET代码免受逆向工程?

时间:2009-02-03 07:53:46

标签: c# .net obfuscation reverse-engineering

混淆是一种方式,但它无法防止破坏应用程序的盗版保护安全性。如何确保应用程序未被篡改,如何确保注册机制不能进行逆向工程?

此外,可以将C#应用程序转换为本机代码,而Xenocode代价太高。

C#提供了很多功能,是我代码的理想语言,所以用C ++再次编写整个代码库是不可能的。

可以从.NET中的已签名程序集中轻松删除安全证书。

38 个答案:

答案 0 :(得分:649)

你不能。

您可以采取一些步骤使其 little 更难,但最终本地计算机上的任何可执行文件都是可以破解的。最终,该代码必须转换为本机代码,并且每个可运行的应用程序都是易受攻击的。

你想要做的只是让它变得难以破解,使它不值得人们的麻烦。

我为您提供的一些建议可以帮助保护您的申请:

  • 模糊您的代码。 Dotfuscator有免费版,随Visual Studio一起提供。
  • 使用public/private key非对称加密生成产品许可证。这可确保只有才能生成许可证代码。即使您的应用程序 已破解,您也可以确保它们不会为您的应用程序发布密钥生成器,因为无法撤消密钥生成算法。
  • 使用第三方打包程序将.NET可执行文件打包到加密的Win32包装器应用程序中。 Themida是最好的之一。这会阻止人们在.NET Reflector中反映您的应用程序,并且解开逆转时会很麻烦。
  • 编写您自己的自定义打包程序。如果第三方包装商太贵,可以考虑自己编写。有时自定义打包程序非常有效,因为没有很好的方法来解压缩它们。教程 How to write your own packer 提供了大量有关编写自己的Win32打包程序的信息。

但最终,如果人们希望您的应用程序破解,他们会。看看那里有大量资源来保护他们的应用程序的所有商业软件,然而在应用程序发布给公众之前它们就被破解了。

熟练的逆向工程师可以启动IDA-Pro,无论你做什么,都可以像黄油一样切开你的应用程序。打包的应用程序可以解压缩,混淆只能阻止它在公园散步。使用单字节补丁可以撤消复杂许可证代码的所有繁琐工作。

你只需要接受人们真的有机会盗版你的软件。有些人从不将为您的应用程序付费,无论如何,这些人都是您不必担心的。

然而,有很多企业从不冒险诉讼,并乐意购买软件许可证和许多计算机用户,他们不想冒险,发现错误或不够技术,不足以盗版。这些是您真正的客户,您应该集中精力为他们提供良好的用户体验,而忽略了人们破解您的软件。

之前我的应用程序已被盗版,我把它作为个人冒犯。在这里,我是一个小型的开发人员,将我的心灵和灵魂倾注到一个应用程序中,这些人有胆量从我身上偷盗?!他们直接从口袋里拿钱!

我立即添加了一堆严厉的DRM代码,试图破坏使用非法或破解副本的任何人。我当然应该努力使我的应用程序更好,而不是试图阻止不可避免的事情。不仅如此,我还在为我的真正客户提供所有这些额外的保护措施。

经过长时间的战斗,我意识到我正在与潮汐作斗争,所有这些浪费都是徒劳的。我拿出了除了准系统许可功能以外的所有电话家庭代码,但从未回头。

答案 1 :(得分:260)

答案 2 :(得分:45)

根据我的经验,使您的应用程序或库更难以破解会伤害您的诚实客户,同时只会稍微拖延不诚实的客户。专注于制造优质,低摩擦的产品,而不是花费大量精力来推迟不可避免的事情。

答案 3 :(得分:38)

与很多人分享的秘密并不是秘密。如果您的代码中有秘密内容,则对其进行模糊处理并不起作用;它只需要进行反模糊处理一次。如果您有一个不想与客户分享的秘密,那么不会与您的客户共享。将您的代码编写为Web服务,并将超级密码保存在您自己的服务器上,只有您才能看到它。

答案 4 :(得分:23)

从广义上讲,那里有三组人。

  • 那些不会购买您的软件并且无法找到任何软件的人,或者根本不使用您的软件的人。不要指望从这个团体赚钱。他们要么依靠自己的技能,要么依赖于破解者(他们倾向于根据你的实际情况和观众的大小来确定他们的时间优先顺序。越有用,越快就能获得破解)。

  • 将购买(付费)您的软件的合法用户组,无论您使用何种保护机制。不要使用精心设计的保护机制让合法用户过上艰苦的生活,因为他们无论如何都会为此付费。复杂的保护机制很容易破坏用户体验,您不希望这种情况发生在这个群体中。就个人而言,我会投票反对任何硬件解决方案,这会增加软件的成本。

  • 少数人不会诉诸“不道德”的破解并且会为您的软件付费因为其功能受到许可机制的保护。你可能不希望这个小组非常容易规避你的保护。但是,您花在保护软件上的所有努力都将得到回报,具体取决于这群人的人数。这完全取决于您正在构建的软件类型。

鉴于你所说的话,如果你认为有足够多的少数人可以购买你的软件,那就继续实施某种形式的保护。想想你可以从这个少数民族赚多少钱,而不是你花在保护上的时间,或者花在第三方保护API /工具上的金额。

如果您希望实施自己的解决方案,使用公钥加密是一种很好的方法(与对称算法相反),以防止轻松破解。例如,您可以对许可证进行数字签名(序列号或许可证文件)。解决这个问题的唯一方法就是反编译,修改和重新编译代码(使用Simucal的答案中建议的技术可以更加努力)。

答案 5 :(得分:19)

您无法阻止人们破解您的软件。

但是,您可以让它们产生裂缝,从而减少销售额。可以为您的软件发布有效注册码的密钥生成器比从软件中删除注册激励的简单补丁更糟糕。这是因为破解仅适用于一个软件版本,并且将停止使用您发布的下一个软件更新。密钥生成器将继续工作,直到您更改注册密钥算法,这是您不想经常做的事情,因为它会推迟您诚实的客户端。

因此,如果您正在寻找一种方法来对抗您的软件的非法密钥生成器,并且由于生成的长注册码而您不想使用不对称加密,那么您可能需要查看部分密钥验证。

部分密钥验证可确保每个非法密钥生成器仅适用于您软件的一个特定版本。基本上,您所做的是确保软件的每个版本仅链接到用于检查注册码的某些数字的代码。哪些数字完全是随机的,因此破解者必须对您的软件的许多不同版本进行逆向工程,并将所有这些组合到一个密钥生成器中,以便发布适用于您的软件的所有版本的密钥生成器。

如果您定期发布新的软件版本,这会导致许多密钥生成器传播到各种不再有效的软件盗版档案中。潜在的软件盗版者通常会为最新版本寻找破解或密钥,因此他们可能会尝试其中的一些并最终放弃。

我在我的(C ++)较新的共享软件游戏中使用了部分密钥验证,它非常有效。在我们遇到关键发电机的许多问题之前我们无法抗拒。 Afterewards有很多裂缝和一些密钥生成器只适用于特定版本的游戏,但没有适用于所有版本的密钥生成器。我们定期发布非常小的游戏更新,并使之前存在的所有裂缝无效。

似乎有一个开源.NET framework for Partial Key Verification,虽然我还没有尝试过。

答案 6 :(得分:16)

  • 使用在线更新来阻止这些未经许可的副本。

  • 验证应用程序的不同模块的序列号,不要使用单个序列号 函数调用进行验证(这样破解者就无法轻易绕过验证)。

  • 不仅要查看序列号 启动时,进行验证 保存数据,每周五都这样做 晚上,当用户闲置时这样做 ......

  • 验证应用程序文件检查 总结,存储您的安全检查金额 不同的地方。

  • 不要在这些方面走得太远 技巧,确保你的申请 从不崩溃/进入故障 同时验证注册码。

  • 为用户构建有用的应用程序 比制造一个更重要 饼干的牢不可破的二进制文件。

答案 7 :(得分:14)

你可以..

Microsoft SLP ServicesInishTech's Software Potential提供了在不影响应用程序功能的情况下帮助保护代码的功能。

更新:(披露:我在Eazfuscator.NET上工作) Microsoft SLP服务软件潜力的不同之处在于虚拟化代码,所以你肯定可以。自问题最初提出以来已过去几年;今天有更多的产品可以在类似的基础上工作,例如:

答案 8 :(得分:10)

.NET Reflector只能打开“托管代码”,这基本上意味着“.NET代码”。因此,您无法使用它来反汇编COM DLL文件,本机C ++,经典Visual Basic 6.0代码等。编译的.NET代码的结构使其非常方便,可移植,可发现,可验证等.Net Reflector采用这样做的好处是可以让你进入已编译的程序集,但反编译器和反汇编程序并不是特定于.NET的,并且只要编译器存在就已存在。

您可以使用混淆器使代码更难以阅读,但是如果不使.NET无法读取,则无法完全阻止它被反编译。有一些products声称(通常是昂贵的)声称将您的托管代码应用程序“链接”到本机代码应用程序中,但即使这些实际上有效,一个坚定的人总会找到一种方法。

然而,当谈到混淆时,你会得到你付出的代价。因此,如果您的代码是如此专有,以至于您必须竭尽全力保护它,您应该愿意投资于一个好的混淆器。

然而,在我15年左右的编写代码的经验中,我意识到过度保护你的源代码是浪费时间并且没有什么好处。只是尝试阅读原始源代码而不支持文档,注释等可能很难理解。再加上反编译器提出的毫无意义的变量名称以及现代混淆器创建的意大利面条代码 - 您可能不必过多担心窃取您的知识产权的人。

答案 9 :(得分:9)

真的值得吗?每个保护机制都可以通过充分的决定来打破。考虑您的市场,产品价格,客户数量等。

如果你想要更可靠的东西,那就走硬件钥匙的道路,但这对用户来说相当麻烦,而且更贵。软件解决方案可能浪费时间和资源,他们唯一能给你的是“安全”的错误感。

几乎没有什么想法(没有一个是完美的,因为没有完美的想法)。

并且不要浪费太多时间,因为这些破解者在使用典型技术方面拥有丰富的经验,并且领先于您。除非您想使用大量资源,否则可能会更改编程语言(以Skype方式执行)。

答案 10 :(得分:9)

如果您希望人们能够运行您的代码(如果您没有,那么为什么您首先编写它?),那么他们的CPU需要能够执行您的代码。为了能够执行代码,CPU需要能够理解它。

由于CPU是愚蠢的,而人类不是,这意味着人类也可以理解代码。

只有一种方法可以确保您的用户无法获取您的代码:不要向他们提供您的代码。

这可以通过两种方式实现:Software as a service(SaaS),即您在 服务器上运行软件,只让您的用户远程访问它。例如,这是Stack Overflow使用的模型。我很确定Stack Overflow不会混淆他们的代码,但是你无法反编译它。

另一种方式是设备型号:您不必向用户提供代码,而是为他们提供包含代码的计算机。这是游戏机,大多数手机和TiVo使用的模型。请注意,这仅在您“拥有”整个执行路径时才有效:您需要构建自己的CPU,自己的计算机,编写自己的操作系统以及自己的CLI实现。然后,只有 才能保护您的代码。 (但请注意,即使最小的错误也会使您的所有保护措施无效。微软,Apple,索尼,音乐行业和电影行业都可以证明这一点。)

或者,您可以不做任何事,这意味着您的代码将受到版权法的自动保护。

答案 11 :(得分:8)

除购买保护外,您(或您的开发人员)可以学习复制保护。

这些是想法:

首先,尝试编写一个将自己写入控制台的程序。这是一个着名的问题。此任务的主要目的是练习编写自引用代码。

其次,您需要开发一种能够以某种方式重写某些代码的技术 可靠的其他方法'CIL

您可以编写虚拟机(但在.NET中)。并在那里放一些代码。 最终,虚拟机运行另一个运行代码的虚拟机。 这是很少被调用的函数的一部分,因为它不会太慢地降低性能。

将一些逻辑重写为C ++ / CLI,并将托管代码与非托管混合。这将加强拆解。在这种情况下,请不要忘记提供x64二进制文件。

答案 12 :(得分:8)

不幸的是,你不会逃避这一点。最好的办法是用C和P/Invoke编写代码。

有一个小型的catch-22,有人可以将您的应用程序反编译为CIL并终止任何验证/激活代码(例如,调用您的C库)。请记住,用C语言编写的应用程序也是由更持久的黑客进行逆向工程(现在看看游戏破解的速度有多快)。没有什么能保护您的申请。

最后它的工作方式与你的家一样,保护得足够好,以免太多的努力(意大利面条代码在这里有帮助),以便攻击者只是移动到隔壁邻居(竞争:))。看看Windows Vista,必须有10种不同的方法来破解它。

有些软件包可以加密你的EXE文件,并在允许用户使用它时对其进行解密,但是再一次,这是使用毫无疑问已破解的通用解决方案。

激活和注册机制针对的是“普通乔:”那些没有足够的技术悟性来绕过它的人(或者知道他们可以绕过它)。不要打扰饼干,他们手上的时间太长了。

答案 13 :(得分:7)

是。是真的。如果代码没有被混淆,.NET代码很容易进行逆向工程。

混淆会给试图对您的软件进行逆向工程的人们带来一层烦恼。根据您获得的版本,您将获得不同级别的保护。

Visual Studio包含Dotfuscator版本。由于它是捆绑版本,因此您肯定无法获得最强大的混淆。如果你看一下他们的功能列表,你就会看到你所缺少的内容(以及应用程序将如何使你的代码更安全)。

还有其他一些免费或开源的.NET混淆器(但我不能评论他们使用的质量或各种方法):

最后,没有什么是完美的。如果有人真的想看看你的软件是如何运作的,那么他们就会。

答案 14 :(得分:6)

嗯,你不能完全保护你的产品免受破坏,但你可以最大限度地提高/提高安全级别,并使新手和中间破解者破解它有点太难了。

但请记住,没有什么是不可破解的,只有服务器端的软件得到很好的保护,不能破解。无论如何,为了提高应用程序的安全级别,您可以采取一些简单的步骤来防止某些破解程序“并非全部”破解您的应用程序。这些步骤将使这些破解者变得疯狂,也许会绝望:

  • 对您的源代码进行模糊处理,显然这会使您的源代码看起来像一团糟,不可读。
  • 在应用程序中触发几个随机检查例程,例如每两个小时,24小时,一天,一周等,或者在用户采取的每个操作之后。
  • 在您的服务器上保存已发布应用程序的MD5校验和,并实现一个例程,该例程可以检查当前文件MD5校验和与服务器端的真实文件,并使其随机触发。如果MD5校验和已更改,则表示此副本已被盗版。现在你可以阻止它或发布阻止它的更新等等。
  • 尝试制作一个例程,可以检查您的某些代码(函数,类或特定例程)是否实际上已被修改或更改甚至删除。我称之为(代码完整性检查)。
  • 使用免费的未知包装工具打包您的应用程序。或者,如果您有钱,请选择Thamida.NET Reactor等商业解决方案。这些应用程序会定期更新,一旦破解者解压缩您的应用程序,您就可以从这些公司获得新的更新,一旦获得新的更新,您只需打包程序并发布新的更新。
  • 定期发布更新并强制您的客户下载最新更新。
  • 最后让您的应用程序非常便宜。不要太贵。相信我,你会得到更多满意的客户,而破解者只会离开你的应用程序,因为不值得花时间去破解一个非常便宜的应用程序。

这些只是防止新手和中间黑客破解应用程序的简单方法。如果您有更多想法来保护您的应用程序,请不要害羞地实现它们。它只会让破解者生活困难,他们会感到沮丧,最终他们会离开你的申请,因为这不值得他们的时间。

最后,您还需要考虑花时间编写优质且高质量的应用程序。不要浪费时间编写复杂的安全层。如果一个好的饼干想要破解你的应用程序,无论你做什么,他/她都会做...

现在去为破解者实施一些玩具......

答案 15 :(得分:5)

Salamander,它是Remotesoft的本机.NET编译器和链接器,可以在没有.NET框架的情况下部署应用程序。我不知道它的说法有多好。

答案 16 :(得分:5)

如果微软能够提出解决方案,我们就不会拥有盗版Windows版本,因此没有什么是非常安全的。以下是Stack Overflow中的一些类似问题,您可以实现自己的保护方式。如果您要发布不同的版本,那么您可以针对不同的版本采用不同的技术,所以当第一个被破解时,第二个可以接管。

答案 17 :(得分:5)

.NET Reactor

<强>更新

Jared指出de4dot声称可以反编译它。

  

.NET Reactor通过将.NET程序集转换为无法理解为CIL的非托管进程,以及现有工具无法反编译,为您的敏感知识产权提供全面保护。黑客无法访问任何可理解的来源形式。

     

强大而灵活的.NET Reactor许可功能允许您通过使用硬件和软件锁来强制执行许可条件并保护您的收入流。许可证管理器可以在几秒钟内构建试用版或永久许可证。完整记录的软件开发工具包(SDK)以及示例,允许您直接从代码中调用许可系统,允许您创建许可系统的自定义扩展。

答案 18 :(得分:4)

这里有一个想法:您的公司可能拥有一台服务器,您的软件的所有实例都需要连接到该服务器。只需让他们连接并验证注册密钥是不够的 - 他们只需删除支票即可。除了密钥检查之外,您还需要让服务器执行客户端无法执行的一些重要任务,因此无法删除。这当然可能意味着你的服务器上有很多繁重的处理,但它会让你的软件难以窃取,并假设你有一个好的密钥方案(检查所有权等),密钥也很难偷。这可能比您想要的更具侵入性,因为它需要您的用户连接到互联网才能使用您的软件。

答案 19 :(得分:3)

有几种.NET模糊处理工具的详细比较表。

enter image description here

截图取自obfuscators.io

答案 20 :(得分:3)

客户端上运行的任何内容都可以反编译和破解。否认只会让事情变得更难。我不知道你的申请,但99%的时间我认为这不值得付出努力。

答案 21 :(得分:3)

模糊代码! Obfuscating C# Code 中有一个示例。

答案 22 :(得分:2)

只是添加警告:如果您要使用混淆,请检查一切是否仍然有效!混淆可能会改变类名和方法名等内容。因此,如果您使用反射来调用某些方法和/或类(如插件架构中),您的应用程序可能会在混淆后失败。堆栈跟踪也可能无法追踪错误。

答案 23 :(得分:2)

请记住,99%以上的用户不会对检查您的可执行文件感兴趣,看看它是如何工作的。

鉴于很少有人会费心去尝试,大多数混淆器可以解决,是否值得花时间和精力?

你最好把时间花在改进产品上,以便让更多人想要使用它。

答案 24 :(得分:2)

如果用.NET编写并编译为CIL,则可以反映出来。如果需要考虑安全性并避免混淆,那么我建议使用非托管语言编写应用程序,这种语言本质上更难以进行逆向工程。

答案 25 :(得分:2)

我可以推荐使用Obfuscator

答案 26 :(得分:2)

坦率地说,有时我们需要对代码进行模糊处理(例如,注册许可证类等)。在这种情况下,您的项目不是免费的。国际海事组织,你应该支付一个好的粉丝。

Dotfuscator隐藏了您的代码,.NET Reflector在您尝试反编译时显示错误。

答案 27 :(得分:2)

说到.NET,如果您要发布Windows Forms应用程序(或客户端具有可移植可执行文件的任何应用程序),它就可以被破解。

如果您想坚持使用.NET并希望尽量减少获取源代码的可能性,那么您可能需要考虑将其部署为网络服务器上的ASP.NET应用程序,而不是将其作为Windows表格申请。

答案 28 :(得分:2)

抱歉,无法完全保护应用程序。

答案 29 :(得分:2)

只需制作一个好的应用程序并编写一个简单的保护系统。无论你选择什么保护都没关系,它会被逆转......所以不要浪费太多时间/金钱。

答案 30 :(得分:2)

  

如何确保应用程序不被篡改,以及如何确保注册机制不能进行逆向工程。

两者都有相同的非常简单的答案:不要将对象代码分发给不信任方,例如(显然)您的客户。在您的机器上托管应用程序是否可行仅取决于它的作用。

如果它不是web application,也许你可以允许SSH登录,X转发到应用服务器(或Remote Desktop Connection,我猜,对于Windows)。

如果您将对象代码提供给书呆子类型的人,并且他们认为您的程序可能很有趣,那么破解。没办法。

如果您不相信我,请指出一个尚未破解和盗版的备受瞩目的应用程序。

如果您使用硬件密钥,它会使生产更加昂贵,而您的用户会因此而讨厌您。因为软件制造商不相信你(我想象),所以在地板上爬行并拔掉27种不同的USB产品是一个真正的婊子。

  

有些软件包可以加密您的EXE并在允许用户使用时解密它

当然,绕过它的方法是破解“我可以使用它”测试,以便它始终返回true。

一个讨厌的技巧可能是使用在程序中其他地方执行测试的操作码的字节值,这会使程序以高概率崩溃,除非该值恰到好处。它会让你链接到特定的架构,但是: - (

答案 31 :(得分:1)

是的,.NET二进制文件(EXE和DLL)可以很容易地反编译成近乎源代码。检查工具.NET Reflector。只需针对任何.NET二进制文件进行尝试。最好的选择是混淆文件,它们仍然可以被.NET Reflector反编译,但它们会造成难以理解的混乱。我认为好的混淆器不会是免费的或便宜的。一个是Visual Studio附带的Dotfuscator Community Edition。

答案 32 :(得分:1)

最好的答案是小型开发人员从他自己的表现中说出的第一个答案,上面讨论的所有反逆转技术都是针对任何严肃的逆向工程师的101个教科书案例。

一些商业DRM解决方案相当不错,但他们在几小时(或几天)内始终使用自定义DRM解决方案破解每一个AAA级游戏。只有引入全新的DRM解决方案 - 有时候 - 可能会在几周内不可避免地延迟。

充分利用DRM需要花费大量时间和时间。金钱并且很容易损害性能,可靠性,兼容性/可移植性和一般的客户关系。要么坚持使用一些不错的商业DRM,又不要过于聪明并承担(减少)损失,或者完全忘掉它......

DRM解决方案的一个例子,它挖掘了它自己的(商业)坟墓:http://en.wikipedia.org/wiki/StarForce

答案 33 :(得分:1)

我还对我的设计中的黑客安全性做了一些考虑,并想添加它们,因为其中一些似乎没有被提及:

我的应用程序中有一个脚本界面。为了确保,Scripts只能调用要由(python)-scripts调用的方法,我有一个scriptvisibilityattribute和System.Dynamic.DynamicMetaObjectProvider,它可以识别这些属性。

许可证使用公钥/私钥。

需要解锁ViewModels,为解锁功能提供密码。

CoreRoutines可以在加密狗上实现。 (有支持的加密狗)

没有计划像封皮这样的大解决方案。

当然,这个脚本/ viewModel apporach并不能解密并从代码中调用脚本不可见的函数,但它使得这样做更加困难 - 就像所有与反黑客相关的内容一样 - 努力。

答案 34 :(得分:0)

回答超过600票的答案:“您不能。”;

这是一个世界的情况,这个世界已经过社会编程,迫使您生活在由文化决定的封闭环境中;
意味着在学习创建程序的同时,其他人也学会了如何操作环境;
然后,可用的概念(不是代码逻辑赋予的现实)将保护视为另一个人的问题;

然后将政治人物图解化为生产的一部分;在这种情况下,社会文化正在处理他们因释放自己的存在而承担的终生职责来封闭他们的生活;

为了这些社会风气而知道谁是Lex Luthor \超人是一个冲突;

  

“你不能。”

     

是不打扰人类前进的标题   已经针对这种情况进行了编程,这意味着没有   揭露知识的生产力   为了满足入侵者的利益而和谐地工作;

答案 35 :(得分:0)

看起来永远像本地人,现在不需要混淆器了; 看起来像网络核心RT可行的解决方案;不久所有应用程序都将进入.net核心; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/november/net-core-publishing-options-with-net-core

未经测试,也许与旧版Win .net SDK可能做类似的事情。

答案 36 :(得分:0)

我在两个主要方面看到了这个主题。

A).NET是否仅经过逆向工程而本机不是?

B)我们是商业/业余爱好者哪种类型的程序员?

标题: 保护.NET代码免受逆向工程

我的观点:

  1. 在.NET中进行商业应用的优先级最低,因为在反编译后,它甚至会公开您对已构建二进制文件的注释。 (我不知道在二进制中也包含注释的逻辑是什么) 因此,任何人都可以对其进行反编译,重命名/修改/更改外观并在24小时内转售该应用程序。

  2. 在本机应用程序中,重命名/修改/更改外观不可能像在.NET中那样容易

  3. .NET中令人担心的部分是,您可以从单个二进制exe / dll中获得带有解决方案的整个项目。

试想一下它在安全方面有多星期。 因此,即使是外行人也可以轻松地对.NET应用程序进行逆向工程。

  1. 如果它是C ++ / VB6 / Delphi之类的本机应用程序,则只有知道ASM的专家破解者才能修补该exe,而不是像.NET一样进行100%反向工程。

但是现在整个世界都在.NET后面运行,因为使用高级功能和库来制作项目非常容易。

  1. 好消息是,微软似乎在2020年支持.NET的本机输出,这将使像我这样的编码人员将.NET C#作为主要语言。

https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5755590#xx5755590xx

答案 37 :(得分:-1)

根据Microsoft博客中的以下问题:

https://blogs.msdn.microsoft.com/amb/2011/05/27/how-to-prevent-ildasm-from-disassembling-my-net-code/

如何防止ILDASM拆卸装配?

this.state具有一个名为 .NET 的属性,可防止反汇编代码。例如,考虑以下代码:

SuppressIldasmAttribute

如您所见,只有两个区别:

  1. 我们添加了using System; using System.Text; using System.Runtime.CompilerServices; [assembly: SuppressIldasmAttribute()] namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Hello world..."); } } } 名称空间减速。

  2. 我们添加了System.Runtime.CompilerServices属性。

在Visual Studio中构建应用程序之后,当我们尝试在[assembly: SuppressIldasmAttribute()]中打开生成的EXE文件时,现在我们收到以下消息:

enter image description here