Pri*_*lia 481 .net c# obfuscation reverse-engineering
混淆是一种方式,但它无法防止破坏应用程序的盗版保护安全性.我如何确保应用程序不被篡改,以及如何确保注册机制不能被反向工程?
此外,可以将C#应用程序转换为本机代码,而Xenocode代价太高.
C#提供了很多的功能,并且是我的代码的理想语言,所以下再次写入整个代码库++是出了问题.
可以从.NET中的签名程序集中轻松删除安全证书.
mmc*_*ole 659
你不能.
还有你可以采取措施,使之成为一点比较困难,但最终还是在本地计算机上的任何可执行文件是攻破.最终,该代码必须转换为本机代码,并且每个可运行的应用程序都是易受攻击的.
你想要做的只是让它变得难以破解,使它不值得人们的麻烦.
我有一些建议可以帮助您保护您的申请:
但最终,如果人们希望您的应用程序破解,他们会.看看那里有大量资源来保护他们的应用程序的所有商业软件,然而在应用程序发布给公众之前它们就被破解了.
熟练的逆向工程师可以启动IDA-Pro,无论您做什么,都可以将您的应用程序切成黄油.打包的应用程序可以解压缩,混淆只能阻止它在公园散步.使用单字节补丁可以撤消复杂许可证代码的所有繁重工作.
你只需要接受人们真的有机会盗版你的软件.有些人无论如何都不会为您的申请付费,这些人是您不必担心的.
然而,有许多企业从不冒险诉讼,并乐意购买软件许可证和许多计算机用户,他们不想冒险,发现错误或不够技术精通海盗.这些是您真正的客户,您应该集中精力为他们提供良好的用户体验,而忽略了人们破解您的软件.
我之前有过盗版申请,我把它作为个人冒犯.在这里,我是一个小型的开发人员,将我的心灵和灵魂倾注到一个应用程序中,这些人有胆量从我身上偷盗?!他们直接从口袋里拿钱!
我立即添加了一堆严厉的DRM代码,试图破坏使用非法或破解副本的任何人.我当然应该努力使我的应用程序更好,而不是试图阻止不可避免的事情.不仅如此,我还会伤害到我的真正客户所有这些额外的保护措施.
经过长时间的战斗,我意识到我正在与潮汐作斗争,所有这些浪费都是徒劳的.我拿出了所有的电话家庭代码,除了准系统许可证功能,从未回头.
Joe*_*orn 264
您无法完全保护任何应用程序(托管与否).如果像Playstation和iPad这样的系统可以破解 - 供应商甚至控制硬件 - 你的应用程序有什么希望?谢天谢地,你真的不想.在我看来,您需要确保您的应用程序足够安全,以免有人不小心盗用您的产品,而不是更多.
例如,如果您使用每台计算机许可证,则在将其安装到新的第二台计算机上时,它不应该正常工作.你需要一个好的错误信息来防止额外的支持电话,但不要花费额外的时间使它太难以解决,并且不要用它来击打用户.
另一个例子是限时试验.甚至不用担心简单的事情,比如用户是否可以回滚系统时钟.这样做的人知道他们正在破坏您的许可证,只要用户知道他们何时违反您已经做得足够多.
您需要这么做,因为用户不关心您的许可证.许可证是在没有人关心的情况下制成的东西.没有人读它们,他们真的不应该这样做.因此,告诉用户边界位置的最佳方法是,应用程序的开箱即用行为是否符合许可证.在第一种情况下,这意味着第二次无法在试用版模式下安装或安装.对于后者,它可能只意味着检查配置文件中的纯文本日期.无论哪种方式,请确保您以优雅,乐于助人和尊重的方式处理它.
这就解释了它的意义所做的那么多.但为什么不进一步呢?为什么不插上你能找到的每个小洞?答案分为两部分.首先,如果有人会跨越有意识地违反许可条款的道德门槛- 即使是以一种简单的方式 - 他们也愿意做一些更困难或更危险的事情,比如从洪流中提取你的应用程序站点 - 运行从不受信任的来源下载的应用程序涉及一定的危险.对这些用户来说,使其变得更加困难只是一个小麻烦,并且可能会给付费客户带来问题.保持简单可能会阻止某人挖掘您的应用程序并发布更全面的破解.其次,你几乎没有眼睛可以寻找缺陷; 黑客有很多,他们有更多的实践找到他们.您只需要错过一个小缺陷,您的应用程序将在盗版网站上具有相同的分布,就像您什么都不做.你必须每次都是对的; 他们只需要幸运一次.因此,所需的努力非常高,任何衡量成功的可能性都非常低.
最终,如果有人想要盗用您的应用程序(而不是仅使用它),这是他们的主要目标,他们会.你无能为力阻止它们.这是软件的本质; 一旦构成产品的文件在用户的计算机上,他们就可以按照自己的意愿使用它们.这在Java或.NET等托管环境中尤为重要,但它也适用于本机代码.时间就在他们身边,给予足够的时间可以打破任何数字安全.
由于您无法阻止用户盗用您的产品,因此您最好的做法是让这类用户以某种方式使用它们,从而使您受益.通常可以让他们为你而不是对你工作.考虑到这一点,无论您的应用程序是什么,保留一个几乎完全正常运行且不会过期的免费版本可能是值得的.即使是1美元的价格标签和免费标签之间的差异也是巨大的,如果没有其他原因,客户不必信任您的信用卡.免费版本的产品不仅可以有效地杀死盗版发行版(为什么在合法价格相同的情况下冒着盗版版本的风险?),它有可能大大扩展您的受众群体.
结果是您可能需要提高付费版本的价格,以便最终代替2,000个用户,每个20美元,您有100,000个免费用户,其中500个愿意为"专业"版本支付99美元.与您花费大量时间锁定产品相比,这可以赚到更多的钱.更重要的是,您可以吸引这些免费用户并以几种重要方式利用这种关系.
一个是支持.悲观主义者会借此机会抱怨支持10万名免费用户的成本增加,但反而出现了令人惊奇的事情:您的产品在很大程度上自我支持.你总是看到这个大型开源项目没有资金支持成本.用户将加强并实现目标.
免费用户通常会首先降低支持期望,并且有充分理由.您需要做的就是将免费版标记为仅符合社区支持的资格,并为此目的建立一个用户管理的在线论坛.您的支持知识库是自我生成的,高级用户将为您代表您需要额外手持的人.更重要的是,这将使您能够更快地识别和纠正错误,最终提高产品质量并降低总体支持成本.之前这是不可能的,因为您的用户群不够大,但当您将免费用户视为客户时,它可以很好地工作.
另一个是反馈.通过观察您的论坛,您可以了解到您可能从未考虑过的重要改进建议.这可以让您最终将更多免费用户转变为付费用户,并创建更具吸引力的产品,吸引更多的受众.
最后,您需要考虑营销.所有这些免费用户现在都是粉丝而不是对手,他们会采取相应的行动.不仅如此,当需要发布您的下一个版本时,这些用户将全部通过您批准的分发渠道,而不是其他一些未知的机制.这意味着,对于您的下一个版本,您开始与更大,高度兴趣和支持的受众建立联系.
专业版保留的最佳功能是旨在简化企业部署和管理的工具.一个破解者不会认为这些是一个令人信服的足够理由来破解它供自己使用,但对于想要购买300个许可证并将其推出公司范围的企业而言,这是必须的.当然,专业版无论如何都会被盗版,但是:不要因为无论你做什么都无法将产品卖给那些海盗,所以不要为此付出代价,所以这不会给你带来任何收入.
虽然在心理上很难放弃你的产品,但希望你能理解它是最好的方式.不仅如此,这是长期发展的唯一途径.我知道有人认为他们不想这样做.毕竟,他们已经很好地销售他们锁定的20美元产品多年.但这太糟糕了,因为如果你不这样做,最终别人会这样做.而且他们的产品将与您的产品一样好,或者足够接近,他们可以声称拥有这样的产品.然后突然之间,你的定价看起来很糟糕,销量大幅下降,你无能为力.如果必须,您可以选择额外的中间层,但它不太可能对您有所帮助.
Eri*_*ert 38
你与很多人分享的秘密并不是秘密.如果您的代码中有秘密内容,则对其进行模糊处理并不起作用; 它只需要进行一次反混淆处理.如果您有一个不想与客户分享的秘密,请不要与您的客户分享.将您的代码编写为Web服务,并将您的超级密码保存在您自己的服务器上,只有您可以看到它.
Mys*_*tic 23
从广义上讲,那里有三组人.
那些不会购买你的软件并且无法找到任何软件的人,或者根本不使用你的软件的人.不要指望从这个团体赚钱.他们要么依靠自己的技能,要么依赖于破解者(他们倾向于根据你的实际情况和观众的大小来确定他们的时间优先顺序.越有用,越快就能获得破解).
无论您使用何种保护机制,将购买(支付)您的软件的合法用户组.不要使用精心设计的保护机制让合法用户过上艰苦的生活,因为他们无论如何都会为此付费.复杂的保护机制很容易破坏用户体验,您不希望这种情况发生在这个群体中.就个人而言,我会投票反对任何硬件解决方案,这会增加软件的成本.
少数人不会诉诸"不道德"的破解并且会为您的软件付费,因为其功能受到许可机制的保护.你可能不希望这个小组非常容易规避你的保护.但是,您花在保护软件上的所有努力都将得到回报,具体取决于这群人的人数.这完全取决于您正在构建的软件类型.
鉴于你所说的,如果你认为有足够多的少数人可以购买你的软件,那就继续实施某种形式的保护.想想你可以从这个少数民族赚多少钱,而不是你花在保护上的时间,或者花在第三方保护API /工具上的金额.
如果您希望实现自己的解决方案,使用公钥加密是一种很好的方法(与对称算法相反),以防止轻松入侵.例如,您可以对许可证进行数字签名(序列号或许可证文件).解决这个问题的唯一方法就是对代码进行反编译,修改和重新编译(使用Simucal的答案中建议的技术可以更加努力).
Adr*_*ore 19
您无法阻止人们破解您的软件.
但是,您可以使它们产生裂缝,从而减少您的销售.可以为您的软件发布有效注册码的密钥生成器比从软件中删除注册激励的简单补丁更糟糕.这是因为破解仅适用于一个软件版本,并且将停止使用您发布的下一个软件更新.密钥生成器将继续工作,直到您更改注册密钥算法,这是您不想经常做的事情,因为它会推迟您诚实的客户.
因此,如果您正在寻找一种方法来对抗您的软件的非法密钥生成器,并且由于生成的长注册码而您不想使用不对称加密,您可能需要查看部分密钥验证.
部分密钥验证可确保每个非法密钥生成器仅适用于您软件的一个特定版本.基本上,您所做的是确保软件的每个版本仅链接到用于检查注册码的某些数字的代码.哪些数字完全是随机的,因此破解者必须对您的软件的许多不同版本进行逆向工程,并将所有这些组合到一个密钥生成器中,以便发布适用于您的软件的所有版本的密钥生成器.
如果您定期发布新的软件版本,这会导致众多密钥生成器传播到各种不再有效的软件盗版档案中.潜在的软件盗版者通常会为最新版本寻找破解或密钥,因此他们可能会尝试其中的一些并最终放弃.
我在我的(C++)较新的共享软件游戏中使用了部分密钥验证,它非常有效.在我们遇到关键发电机的许多问题之前我们无法抗拒.Afterewards有很多裂缝和一些密钥生成器只适用于特定版本的游戏,但没有适用于所有版本的密钥生成器.我们定期发布非常小的游戏更新,并使之前存在的所有裂缝无效.
似乎有一个用于部分密钥验证的开源.NET框架,尽管我还没有尝试过.
rIP*_*PER 16
使用在线更新来阻止这些未经许可的副本.
验证应用程序的不同模块的序列号,并且不使用单个函数调用来进行验证(这样,破解者无法轻松绕过验证).
不仅在启动时检查序列号,在保存数据时进行验证,每周五晚上进行验证,在用户空闲时执行此操作...
验证应用程序文件校验和,将您的安全校验和存储在不同的地方.
不要在这些技巧上走得太远,确保您的应用程序在验证注册码时不会崩溃/出现故障.
为用户构建一个有用的应用程序比
为破解者制作一个牢不可破的二进制文件更重要.
Bin*_*ony 14
您可以..
Microsoft SLP服务 InishTech的软件潜力提供了帮助保护代码而不影响应用程序功能的能力.
更新:(披露:我对Eazfuscator.NET工作)是什么让微软SLP服务软件的潜在不同的是虚拟化的代码的能力,所以你绝对可以.自问题最初提出以来已过去几年; 今天有更多的产品也可以在类似的基础上工作,例如:
Jos*_*osh 10
.NET Reflector只能打开"托管代码",这基本上意味着".NET代码".因此,您不能使用它来反汇编COM DLL文件,本机C++,经典Visual Basic 6.0代码等.编译的.NET代码的结构使其非常方便,可移植,可发现,可验证等.Net Reflector利用这让你可以进入已编译的程序集,但反编译器和反汇编程序并不是特定于.NET的,并且只要编译器存在就已存在.
您可以使用混淆器使代码更难以阅读,但是如果不使.NET无法读取,您无法完全阻止它被反编译.有一些产品(通常是昂贵的)声称将您的托管代码应用程序"链接"到本机代码应用程序中,但即使这些实际工作,一个坚定的人总会找到一种方法.
然而,当谈到混淆时,你会得到你付出的代价.因此,如果您的代码是如此专有,以至于您必须竭尽全力保护它,您应该愿意投资于一个好的混淆器.
然而,在我15年左右的编写代码的经验中,我意识到过度保护源代码是浪费时间并且几乎没有任何好处.只是尝试阅读原始源代码而不支持文档,注释等可能很难理解.再加上反编译器提出的无意义变量名称以及现代混淆器创建的意大利面条代码 - 您可能不必过多担心窃取您的知识产权的人.
是不是真的值得吗?每个保护机制都可以通过充分的决定来打破.考虑您的市场,产品价格,客户数量等.
如果你想要更可靠的东西,那就走硬件钥匙的道路,但这对用户来说相当麻烦而且更贵.软件解决方案可能浪费时间和资源,他们唯一能给你的是"安全"的错误感.
几乎没有想法(没有一个是完美的,因为没有完美的想法).
并且不要在上面浪费太多时间,因为这些破解者在使用典型技术方面拥有丰富的经验,并且领先于您.除非您想要使用大量资源,否则可能会更改编程语言(以Skype方式执行).
如果您希望人们能够运行您的代码(如果您不这样做,那么为什么您首先编写它?),那么他们的CPU需要能够执行您的代码.为了能够执行代码,CPU需要能够理解它.
由于CPU是愚蠢的,而人类不是,这意味着人类也可以理解代码.
只有一种方法可以确保您的用户无法获取您的代码:不要向他们提供您的代码.
这样就可以实现两种方式:软件即服务(SaaS)的,也就是说,你在运行软件的服务器,只有让用户远程访问它.例如,这是Stack Overflow使用的模型.我很确定Stack Overflow不会混淆他们的代码,但你无法反编译它.
另一种方式是设备模型:您不必向用户提供代码,而是为他们提供包含代码的计算机.这是游戏机,大多数手机和TiVo使用的模型.请注意,这仅在您"拥有"整个执行路径时才有效:您需要构建自己的CPU,自己的计算机,编写自己的操作系统以及自己的CLI实现.然后,只有这样才能保护您的代码.(但请注意,即使是最微小的错误也会使您的所有保护措施无效.微软,苹果,索尼,音乐行业和电影业都可以证明这一点.)
或者,您可以什么也不做,这意味着您的代码将受到版权法的自动保护.
不幸的是,你不会逃避这一点.最好的办法是用C和P/Invoke编写代码.
有一个小的catch-22,有人可以将您的应用程序反编译为CIL并终止任何验证/激活代码(例如,调用您的C库).请记住,用C语言编写的应用程序也是由更持久的黑客进行逆向工程(现在看看游戏破解的速度有多快).没有什么能保护您的申请.
最后它的工作方式很像你的家,保护得足够好,这样太费劲了(意大利面条代码在这里有帮助),所以攻击者只是移动到隔壁邻居(竞争:)).看看Windows Vista,必须有10种不同的方法来破解它.
有些软件包可以加密你的EXE文件并在允许用户使用它时对其进行解密,但是再一次,这是使用毫无疑问已被破解的通用解决方案.
激活和注册机制针对的是"普通乔:"那些没有足够的技术精通来绕过它的人(或者知道他们可以绕过它).不要打扰饼干,他们手上的时间太长了.
是.是真的.如果代码没有被混淆,.NET代码非常容易进行逆向工程.
混淆会给试图对软件进行逆向工程的人们带来一丝烦恼.根据您获得的版本,您将获得不同级别的保护.
Visual Studio包含一个Dotfuscator版本.由于它是捆绑版本,因此您肯定无法获得最强大的混淆.如果你看一下他们的功能列表,你就会看到你所缺少的内容(以及应用程序将使你的代码更安全的确切内容).
还有其他几个免费或开源的.NET混淆器(但我不能评论他们使用的质量或各种方法):
最后,没有什么是完美的.如果有人真的想看看你的软件是如何工作的,他们会的.
好吧,你不能完全保护你的产品免受破解,但你可以最大化/提高安全级别,并使新手和中间破解者有点太难以破解.
但请记住,没有什么是不可破解的,只有服务器端的软件得到很好的保护,不能破解.无论如何,为了提高应用程序的安全级别,您可以采取一些简单的步骤来防止某些破解程序"并非全部"破解您的应用程序.这些步骤将使这些破解者疯狂,也许绝望:
这些只是防止新手和中间破解者破解您的应用程序的简单方法.如果您有更多想法来保护您的应用程序,请不要害羞地实现它们.它只会让破解者生活困难,他们会感到沮丧,最终他们会离开你的申请,因为这不值得他们的时间.
最后,您还需要考虑花时间编写优质且高质量的应用程序.不要浪费时间编写复杂的安全层.如果一个好的饼干想要破解你的应用程序他/她会做什么,无论你做什么...
现在去为破解者实施一些玩具......
更新
Jared指出de4dot声称可以反编译它.
.NET Reactor通过将.NET程序集转换为无法理解为CIL的非托管进程,并且没有现有工具可以反编译,为您的敏感知识产权提供全面保护.黑客无法访问任何可理解的源代码形式.
.NET Reactor许可功能强大而灵活,允许您通过使用硬件和软件锁来强制执行许可条件并保护您的收入流.许可证管理器可以在几秒钟内构建试用版或永久许可证.完整记录的软件开发工具包(SDK)以及示例,允许您直接从代码中调用许可系统,允许您创建许可系统的自定义扩展.
如果微软可以提出解决方案,我们就不会有盗版Windows版本,因此没有什么是非常安全的.以下是Stack Overflow中的一些类似问题,您可以实现自己的保护方式.如果您要发布不同版本,那么您可以针对不同版本采用不同的技术,因此当第一个被破解时,第二个可以接管.