保护。net代码不受逆向工程的影响?

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

也可以将c#应用程序转换为本机代码,而Xenocode的开销太大。

c#提供了很多特性,是编写代码的理想语言,所以用c++重新编写整个代码库是不可能的。

安全证书可以很容易地从. net中的签名程序集中删除。

265714 次浏览

这真的值得吗?只要有足够的决心,任何保护机制都可以被打破。考虑你的市场、产品价格、客户数量等。

如果您想要更可靠的东西,那么就使用硬件键,但这相当麻烦(对用户来说),而且成本更高。软件解决方案可能会浪费时间和资源,它们唯一会给你的是一种虚假的“安全感”。

还有一些想法(没有一个是完美的,因为没有完美的人)。

不要在这上面浪费太多时间,因为破解者在典型技术方面有很多经验,比你领先几步。除非你想使用大量的资源,可能会改变编程语言(做Skype的方式)。

如果它是用。net编写的,并编译为CIL,它可以被反射。如果安全性是一个问题,并且要避免混淆,那么我建议使用非托管语言编写应用程序,这种语言本质上更难以进行逆向工程。

你不能。

你可以采取一些步骤来让更加困难,但最终本地机器上的任何可执行文件都是可以破解的。最终,这些代码必须转换为本机机器码,每个可运行的应用程序都很容易受到攻击。

你要做的就是让它变得足够难破解,让它不值得人们去麻烦。

我有一些建议可以帮助你保护你的应用程序:

  • 混淆你的代码。Dotfuscator有一个免费版本,并附带Visual Studio。
  • 使用公钥/私钥非对称加密生成您的产品许可证。这确保只有可以生成您的许可代码。即使你的应用程序崩溃了,你可以确定他们不会为你的应用程序释放一个密钥生成器,因为不可能反转密钥生成算法。
  • 使用第三方封隔器将. net可执行文件打包到加密的Win32包装应用程序中。Themida是比较好的一个。这将阻止人们在. net Reflector中反映你的应用程序,并使它成为一个痛苦的解包来反转。
  • 编写自己的自定义封隔器。如果第三方包装程序太贵,可以考虑自己编写。有时,定制的打包器可能非常有效,因为没有关于如何解包它们的良好发布方法。如何编写自己的打包器 .教程提供了大量关于编写自己的Win32封装器的好信息。

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

一个熟练的逆向工程师可以启动IDA-Pro并像切黄油一样切开你的应用程序,无论你做什么。一个打包的应用程序可以被解包,而混淆只会阻止它变得像在公园里散步一样简单。您使用复杂许可代码所做的所有艰苦工作都可以通过一个单字节补丁来完成。

你只需要接受这样一个事实:人们很有可能会盗版你的软件。有一些人无论如何都会为你的应用程序付费,这些人是你不需要担心的。

然而,有许多企业永远不会冒着诉讼的风险,他们很乐意购买软件许可证,而许多计算机用户要么不想冒险,要么发现它是错误的,要么没有足够的技术知识来盗版。这些是你真正的客户,你应该把精力集中在为他们提供良好的用户体验上,而忽略那些破解你软件的人。

我的应用程序以前被盗版过,我认为这是对我个人的侮辱。我是一个小开发者,全身心地投入到一个应用中,而这些人却有胆量剽窃我的作品?!他们直接从我口袋里拿钱!

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

经过长时间的战斗,我意识到我是在与潮流作斗争,所有这些浪费的时间都是徒劳的。除了最基本的许可函数之外,我取出了所有的phone-home代码,并且再也没有回头。

不幸的是,你逃不掉的。最好的办法是用C语言编写代码,然后P / Invoke它。

有一个小小的catch-22,有人可能只是反编译你的应用程序CIL,并杀死任何验证/激活代码(例如,调用你的C库)。请记住,用C语言编写的应用程序也会被更顽固的黑客逆向工程(看看现在的游戏被破解的速度就知道了)。没有什么可以保护您的应用程序。

最后,它的工作原理很像你的家,保护得足够好,这样就花费了太多的精力(意大利面条代码在这里会有所帮助),这样攻击者就会转移到你的隔壁邻居(竞争:))。看看windows Vista,肯定有10种不同的破解方法。

有包在那里,将加密你的EXE文件,并在用户被允许使用它时解密它,但再一次,这是使用一个通用的解决方案,毫无疑问已被破解。

激活和注册机制针对的是“普通人”:那些没有足够的技术知识来绕过它(或者就此而言,他们知道他们可以绕过它)的人。不要为饼干费心了,他们有太多的时间。

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

两者都有一个非常简单的答案:不要把目标代码交给不可信的一方,比如(显然)你的客户。在您的机器上托管应用程序是否可行只取决于它的功能。

如果它不是web应用程序,也许你可以允许SSH登录X转发到应用服务器(或远程桌面连接,我猜,对于Windows)。

如果你把目标代码给书呆子类型的人,他们认为你的程序可能很有趣,它被破解。没有办法。

如果你不相信我,那就指出一个没有被破解和盗版的引人注目的应用程序。

如果你使用硬件键,它会使生产成本更高,你的用户会因此讨厌你。在地板上爬来爬去,插拔你27个不同的USB设备,这真是个婊子,因为软件制造商不信任你(我想)。

有一些包可以加密你的EXE,并在允许用户使用它时解密它

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

一个令人讨厌的技巧可能是以一种肮脏的方式在程序的其他地方使用执行测试的操作码的字节值,这将使程序很可能崩溃,除非值刚刚好。它让你链接到一个特定的架构,尽管:-(

广义上讲,有三种人。

  • 那些不会购买你的软件并诉诸于漏洞的人,或者如果他们找不到任何漏洞,就根本不使用你的软件。别指望从这群人身上赚到钱。他们要么依靠自己的技能,要么依靠骗子(后者倾向于根据你的有用性和你的受众规模来安排时间)。越有用,裂缝就越快可用)。

  • 合法用户群体,他们将购买(支付)您的软件,而不管您使用什么保护机制。不要使用复杂的保护机制让合法用户的生活变得困难,因为他们在任何情况下都会为此付费。复杂的保护机制很容易破坏用户体验,你不希望这种情况发生在这个群体身上。就我个人而言,我会投票反对任何硬件解决方案,这会增加软件的成本。

  • 少数人会诉诸于“不道德的”破解,只会为你的软件支付,因为它的功能受到许可机制的保护。你可能不想让这群人很容易就能绕过你的保护。但是,您在保护软件上所花费的所有努力都会得到回报,这取决于这群人的规模。这完全取决于您要构建的软件类型。

根据您所说的,如果您认为有足够多的少数人可以被推动购买您的软件,那么请继续执行某种形式的保护。考虑一下你能从这些少数人身上赚到多少钱,与你花在保护上的时间相比,或者你花在第三方保护API/工具上的钱。

如果您想实现自己的解决方案,那么使用公钥加密是防止容易被黑客攻击的好方法(与对称算法相反)。例如,您可以对您的许可证(序列号或许可证文件)进行数字签名。解决这个问题的唯一方法就是反编译、修改和重新编译代码(你可以使用Simucal回答中建议的技术来增加难度)。

  • 使用在线更新来阻止那些未授权的拷贝。

  • 从应用程序的不同模块验证序列号,不要使用单个 函数调用来进行验证(这样破解者就不能轻易绕过验证)。李< / p > < / >

  • 不仅检查序列号在 启动时,进行验证 保存数据,每周五做一次 晚上,当用户空闲时进行 …李< / p > < / >

  • 验证应用文件检查 Sum,将安全检查的Sum存储在 李不同的地方。< / p > < / >

  • 不要在这种事情上走得太远 窍门,确保你的申请 永远不要发生故障 当验证注册码时。

  • 为用户构建一个有用的应用程序是 比make a
    重要得多

你无法阻止别人破解你的软件。

然而,你可以让他们制造裂痕,减少对销售的影响。可以为您的软件发出有效注册代码的密钥生成器比从您的软件中删除注册激励的简单补丁要糟糕得多。这是因为漏洞只对一个软件版本有效,并且在你发布的下一个软件更新时不再有效。密钥生成器将继续工作,直到你改变你的注册密钥算法,这是你不想经常做的事情,因为它会把你诚实的客户。

因此,如果您正在寻找一种方法来对抗非法的密钥生成器,并且您不想使用不对称加密,因为这会生成很长的注册码,您可以看看部分密钥验证。

部分密钥验证确保每个非法密钥生成器只适用于软件的一个特定版本。基本上,你要做的就是确保软件的每个版本都只与检查注册码的某些数字的代码链接。确切的数字是随机的,所以黑客必须对你的软件的许多不同版本进行逆向工程,并将所有这些组合到一个密钥生成器中,以便发布一个适用于所有版本的软件的密钥生成器。

如果你定期发布新的软件版本,这将导致大量的密钥生成器散布在各种软件盗版档案中,这些文件不再工作。潜在的软件盗版者通常会寻找最新版本的破解或关键元素,所以他们可能会尝试其中的一些,并最终放弃。

我在我的(c++)新共享游戏中使用了部分密钥验证,它非常有效。之前我们遇到了很多无法对抗的关键生成器问题。后来出现了许多漏洞,一些按键生成器只适用于特定版本的游戏,但没有一个按键生成器适用于所有版本。我们定期发布游戏的小更新,让之前存在的所有漏洞都变得无用。

似乎有一个开源的.NET框架的部分密钥验证,虽然我没有尝试过。

你可以. .

/strike>InishTech的软件潜力提供了在不影响应用程序功能的情况下帮助保护代码的能力。

微软SLP服务软件潜力的不同之处在于虚拟化代码的能力,所以你肯定会可以。从最初提出这个问题到现在已经过去了好几年;今天,有更多的产品也可以在类似的基础上工作,例如:

。净反应堆< / >

更新

Jared指出de4dot声称能够反编译它。

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

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

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

这些想法是:

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

其次,你需要开发一种技术,在某种程度上重写一些代码 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 你可以写一个虚拟机(但在net中)。在这里放一些代码。 最终,虚拟机运行另一个运行代码的虚拟机。 这是为了不太降低性能而很少调用的函数的一部分

将一些逻辑重写为c++ /CLI,并混合托管代码和非托管代码。这将使拆卸变得坚硬。在这种情况下,不要忘记提供x64二进制文件。

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

火蜥蜴,这是一个来自Remotesoft的原生。net编译器和链接器,可以在没有。net框架的情况下部署应用程序。我不知道它是否符合它所宣称的。

抱歉,完全保护应用程序是不可能的。

如果微软能想出一个解决方案,我们就不会有盗版的Windows版本,所以没有什么是非常安全的。下面是来自stackoverflow的一些类似问题,您可以实现自己的保护方式。如果你正在发布不同的版本,那么你可以针对不同的版本采用不同的技术,这样当第一个版本被破解时,第二个版本就可以接管。

这里有一个想法:您可以有一个由您的公司托管的服务器,您的软件的所有实例都需要连接到它。简单地让他们连接并验证注册密钥是不够的——他们只会删除检查。除了密钥检查之外,您还需要让服务器执行一些客户端无法自行执行的重要任务,因此不可能删除这些任务。当然,这可能意味着您的服务器需要进行大量繁重的处理,但这将使您的软件难以被窃取,并且假设您有一个良好的密钥方案(检查所有权等),密钥也将难以被窃取。这可能比您想要的更具侵入性,因为它需要您的用户连接到互联网才能使用您的软件。

根据我的经验,让你的应用程序或库更难破解会伤害你诚实的客户,而只会稍微延迟那些不诚实的客户。专注于制作一款优秀的,低摩擦的产品,而不是花费大量精力去推迟不可避免的事情。

当涉及到。net时,如果你正在发布一个Windows窗体应用程序(或任何客户端有可移植可执行文件的应用程序),它是可以被破解的。

如果你想坚持使用。net,并希望将源代码被窃取的几率降至最低,那么你可能会考虑将其部署为跨web服务器的ASP。网应用程序,而不是使其成为Windows窗体应用程序。

您不能完全保护任何应用程序(托管与否)。如果像Playstation和iPad这样的系统可以被破解—供应商甚至控制硬件—你的应用还有什么希望?幸运的是,你并不是真的想这么做。在我看来,你需要确保你的应用程序足够安全,让别人不能不小心盗版你的产品,再也没有了。

例如,如果使用每台机器许可证,那么它不应该只在安装到新的第二台机器上时才能工作。你需要一个好的错误消息来防止额外的支持呼叫,但不要花费额外的时间让它难以解决,也不要用它来打击用户。

另一个例子是限时审判。甚至不用担心简单的事情,比如用户是否可以回滚系统时钟。这样做的人知道他们违反了你的许可,只要用户知道,当他们违反你已经做得足够了。

您需要这么做是因为用户并不关心您的许可证。许可证是由没有人在需要之前关心的东西。没人看,他们真的不应该看。因此,告诉用户边界在哪里的最佳方法是,应用程序的开箱即用行为是否符合许可。在第一种情况下,这意味着要么安装失败,要么第二次以试用版模式安装。对于后者,它可能只是意味着检查配置文件中的纯文本日期。无论哪种方式,确保你以一种优雅、有益和尊重的方式处理它。

这就解释了做这么多的意思。但为什么不更进一步呢?答案分为两部分。首先,如果有人会越过道德门槛有意识地违反你的许可条款—即使以一种简单的方式—他们也愿意做一些更困难或更危险的事情,比如从洪流站点中取出你的应用程序。运行从不可信来源下载的应用程序存在一定的危险。对这些用户来说,增加难度只是一个小烦恼,可能会给付费用户带来问题。保持简单可以防止有人深入研究您的应用程序并释放更全面的漏洞。其次,你几乎没有眼睛来寻找瑕疵;黑客有很多,而且他们有更多的实践来寻找它们。你只需要忽略一个小缺陷,你的应用就会像你什么都没做一样在盗版网站上传播。你必须每次都是对的;他们只需要幸运一次。因此,需要付出的努力非常高,而取得任何成功的可能性都非常低。

最终,如果有人想海盗你的应用程序(而不是仅仅使用它),而且这是他们的主要目标,他们就会这样做。这是软件的本质;一旦构成你的产品的文件在用户的计算机上,他们能够做他们想做的。这在Java或net这样的托管环境中尤其相关,但它肯定也适用于本机代码。时间站在他们这一边,只要有足够的时间,任何数字安全系统都可以被打破。

既然你无法阻止用户盗版你的产品,那么你最好的做法就是以一种有利于你的方式吸引这类用户。通常情况下,让他们为你工作是可能的,而不是与你作对。考虑到这一点,无论您的应用程序是什么,保留一个几乎功能完整且不会过期的免费版本可能都是值得的。即使是1美元的价格标签和免费之间的差异也是巨大的,如果没有其他原因,那就是客户不必信任你的信用卡。你的产品的免费版本不仅可以有效地阻止盗版传播(当你可以以同样的价格购买正版产品时,为什么要冒着盗版的风险呢?),它还有可能极大地扩大你的受众。

结果是,你可能需要提高付费版的价格,这样最终你就有10万免费用户,而不是2000个用户,每人20美元,其中500人愿意为“专业版”支付99美元。这比你花大量时间锁定你的产品赚得更多。不仅如此,你还可以通过多种重要方式吸引这些免费用户并利用这种关系。

一是支持。悲观主义者会借此机会抱怨支持10万免费用户的成本增加,但令人惊讶的事情却发生了:你的产品基本上可以自给自足。在没有资金支持成本的大型开源项目中,您经常会看到这种情况。用户会挺身而出,让它成为现实。

免费用户通常在一开始就降低了对支持的期望,这是有原因的。您所需要做的就是将免费版标记为只符合社区支持的资格,并为此目的建立一个用户调节的在线论坛。您的支持知识库是自行生成的,高级用户将代表您指导那些需要额外帮助的用户。更重要的是,这将允许您更快地识别和纠正错误,最终提高产品质量并降低总支持成本。这在以前是不可能的,因为你的用户基础还不够大,但当你把免费用户当成客户时,效果就会很好。

另一个是反馈。通过观察你的论坛,你可以学到重要的改进想法,否则你可能从来没有考虑过。这可以让你最终将更多免费用户转变为付费用户,并创造出更有吸引力的产品,从而吸引更多用户。

最后,你需要考虑市场营销。所有这些免费用户现在都是粉丝,而不是对手,他们会采取相应的行动。不仅如此,当你发布下一个版本时,这些用户都将通过你批准的分发渠道,而不是其他未知的机制。这意味着在你的下一个版本中,你开始与更大的、高度感兴趣和支持你的观众建立联系。

为专业版保留的最佳特性是旨在简化企业部署和管理的工具。一个黑客不会认为这些是一个足够有说服力的理由来为自己使用而破解它,但对于一个希望购买300个许可证并在全公司范围内推广它的企业来说,这是一个必须拥有的东西。当然,专业版无论如何都会被盗版,但再次强调:不要担心,因为无论你做什么,你可能都无法将产品卖给那些盗版,所以它不会花费你任何的收入。

虽然从心理上讲,你很难放弃这么多产品,但希望你能理解这是最好的方法。不仅如此,从长远来看,这是唯一的出路。我知道有人在想他们不想这样做。毕竟,他们多年来一直在销售他们锁定在20美元的产品。但这太糟糕了,因为如果你不这样做,最终会有其他人。他们的产品会和你的一样好,或者足够接近,他们可以这样宣称。然后突然之间,你的定价看起来离谱,销量急剧下降,除此之外你什么都做不了。如果你必须的话,你可以选择一个额外的中间层,但它不太可能帮到你。

. net Reflector只能打开“托管代码”,这基本上意味着“。NET代码”。所以你不能用它来分解COM DLL文件、原生c++、经典的Visual Basic 6.0代码等。编译后的。net代码的结构非常方便、可移植、可发现、可验证等。net Reflector利用了这一点,让你窥探已编译的程序集,但反编译器和反汇编器绝不是。net特有的,它们和编译器一样早就存在了。

您可以使用混淆器使代码更难阅读,但是您不能在不使. net无法读取的情况下完全阻止它被反编译。有一些产品(通常是昂贵的)声称“链接”你的托管代码应用程序到本地代码应用程序,但即使这些真的工作,有决心的人总能找到方法。

然而,当涉及到混淆时,一分钱一分货。因此,如果您的代码是如此专有,以至于您必须竭尽全力来保护它,那么您应该愿意在一个好的混淆器上投资。

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

你和很多人分享的秘密就不是秘密了。如果你的代码中有秘密的东西,混淆它是没有保护的;它只需要去混淆一次。如果你有一个秘密,你不想与你的客户分享,那么不要和你的客户分享。将代码编写为web服务,并将超级机密代码保存在自己的服务器上,只有您可以看到它。

坦率地说,有时我们需要混淆代码(例如,注册许可类等)。在这种情况下,您的项目不是免费的。在我看来,你应该花钱买个好东西。

Dotfuscator隐藏你的代码,当你试图反编译它时,. net Reflector显示一个错误。

我可以推荐使用模糊处理

混淆代码!在混淆c#代码中有一个例子。

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

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

只有一种方法可以确保你的用户不会得到你的代码:不要把你的代码给他们。

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

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

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

是的。如果代码没有混淆,. net代码非常容易进行逆向工程。

混淆将给试图逆向工程您的软件的人增加一层烦恼。根据你得到的版本不同,你会得到不同程度的保护。

Visual Studio包含Dotfuscator的一个版本。因为它是一个捆绑版本,你肯定不会得到最强烈的混淆。如果您查看它们的特性列表,就会清楚地看到您遗漏了什么(以及应用程序将如何使您的代码更安全)。

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

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

客户端上运行的任何东西都可以被反编译和破解。混淆只会让它更难。我不了解你的应用程序,但99%的情况下,我认为不值得这么做。

是的,net二进制文件(EXE和DLL)可以很容易地反编译为接近源代码。检查工具. net Reflector。在任何。net二进制文件上尝试一下。最好的选择是混淆文件,它们仍然可以被。net Reflector反编译,但它们会造成一团不可读的混乱。我不认为好的混淆器是免费或廉价的。一个是Visual Studio附带的Dotfuscator社区版。

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

考虑到很少有人会去尝试,而且大多数混淆器都是可以解决的,它值得你花时间和精力吗?

你最好把时间投入到改进你的产品上,让更多人愿意使用它。

只是补充一个警告:如果你打算使用混淆,检查一切仍然工作!混淆可能会改变类名和方法名。因此,如果你使用反射来调用某些方法和/或类(就像在插件架构中),你的应用程序在混淆后可能会失败。另外,堆栈跟踪对于跟踪错误可能是无用的。

好吧,你不能完全保护你的产品不被破解,但你可以最大化/增强安全级别,让它有点难以被新手和中级破解者破解。

但请记住,没有什么是不可破解的,只有服务器端的软件受到了很好的保护,无法被破解。无论如何,为了增强应用程序中的安全级别,您可以执行一些简单的步骤来防止某些黑客“不是全部”破解您的应用程序。下面这些步骤会让你抓狂甚至绝望:

  • 混淆你的源代码,这显然会使你的源代码看起来一团糟,难以阅读。
  • 在应用程序中触发一些随机检查例程,比如每两小时、24小时、一天、一周等,或者可能在用户采取的每个操作之后。
  • 将你发布的应用程序的MD5校验和保存在你的服务器上,并实现一个例程,可以检查当前文件的MD5校验和与你服务器端的真实校验和,并使其随机触发。如果MD5校验和已被更改,则意味着该副本已被盗版。现在你可以阻止它或者发布一个更新来阻止它,等等。
  • 尝试编写一个例程,可以检查您的某些代码(函数、类或特定的例程)是否实际上已经被修改、修改甚至删除。我称之为(代码完整性检查)。
  • 使用免费的未知打包器来打包应用程序。或者,如果你有钱,可以使用商业解决方案,如Thamidanet反应堆。这些应用程序会定期更新,一旦破解者解包了你的应用程序,你就可以从这些公司得到一个新的更新,一旦你得到了新的更新,你只需打包你的程序并发布一个新的更新。
  • 定期发布更新,并强制客户下载最新更新。
  • 最后,让你的应用程序非常便宜。不要做得太贵。相信我,你会得到更多满意的客户,而黑客会离开你的应用,因为他们不值得花时间去破解一个非常廉价的应用。

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

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

现在去实现一些玩具饼干…

最好的答案是第一个来自小开发人员自己的经验,上面讨论的所有反反转技术对于任何严肃的反向工程师来说都是101个教科书案例。

一些商业DRM解决方案相当不错,但它们总是在数小时(或数天)内使用自定义DRM解决方案破解每一款AAA级游戏。只有一个全新的DRM解决方案的引入——有时——延迟是不可避免的,可能需要几个星期。

充分利用数字版权管理需要花费大量的时间和精力。一般来说,金钱和金钱很容易损害性能、可靠性、兼容性/可移植性和客户关系。要么坚持一些像样的商业DRM,不要试图太聪明,承担你的(更少的)损失,要么完全忘记它……

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

我也做了一些关于黑客安全的考虑,在我的设计中,我想添加他们,因为他们中的一些人似乎没有被提及:

我在我的应用程序中有一个脚本接口。为了确保,脚本只能调用(python)打算调用的方法-脚本i有一个scriptvisibilityattribute和System.Dynamic.DynamicMetaObjectProvider,它可以识别这些属性。

license使用公钥/私钥。

ViewModels需要被解锁,给解锁函数一个密码。

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

像包装这样的大解决方案并不是计划好的。

当然,这种脚本/viewModel方法并没有使我们不可能从代码中解锁和调用脚本不可见的函数,但它使这样做变得更加困难——就像所有与反黑客相关的工作一样。

根据下面的问题在微软博客:

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

如何防止ILDASM分解程序集?

.NET有一个名为< em > SuppressIldasmAttribute < / em >的属性,它阻止了代码的反汇编。例如,考虑以下代码:

using System;
using System.Text;
using System.Runtime.CompilerServices;
[assembly: SuppressIldasmAttribute()]


namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello world...");
}
}
}

如你所见,只有两个不同之处:

  1. 我们添加了System.Runtime.CompilerServices命名空间减速。

  2. 我们添加了[assembly: SuppressIldasmAttribute()]属性。

在Visual Studio中构建应用程序后,当我们尝试在ILDASM中打开生成的EXE文件时,现在我们得到以下消息:

enter image description here

下面是一些。net混淆工具的详细对比表:

comparison table .

截图来自obfuscators.io

看起来永远是本地的,现在不需要在混淆器; 看起来像网芯RT可行的解决方案;很快所有的应用程序都将使用。net core;https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://learn.microsoft.com/en-us/archive/msdn-magazine/2018/november/net-core-publishing-options-with-net-core < / p >

没有测试过,也许用旧的win .net SDK可能做类似的事情。

我认为这个话题主要有两个方面。

A) .NET只是反向工程而不是原生的吗?

B)我们是什么类型的程序员?

< p >标题: 保护.NET代码不受反向工程的影响

我的观点:

    在。net中做商业应用是最不可取的,因为它甚至会在反编译后暴露你对构建二进制文件的注释。(我不知道用二进制包含注释的逻辑是什么) 所以任何人都可以反编译它,重命名/修改/改变外观,并在24小时内重新出售应用程序
  1. 在本地应用程序中,重命名/修改/改变外观不可能像在.NET中那样容易

  2. . 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

使用Skater . net混淆器。该. net保护工具针对de4dot, de4dot是一个去混淆器,它将原始受保护的程序集成员名称重命名为人类可读的字符串。溜冰者与之对抗!

最近MindSystemm集团发布了一个叫做Skater的特殊工具。NetDeobfuscator [url: https://github.com/MindSystemm/Skater.NetDeobfuscator],它利用了Skater. net混淆器的漏洞。 混淆器的开发者Rustemsoft LLC收到了一个迫切需要保护关键的Skater . net混淆器算法和软件基础设施的信号,以便为Skater用户提供更强的源代码保护。问题已经解决了 . < / p >