混淆的效果如何?

2023-12-25

另一个问题,即最佳 .NET 混淆工具/策略 https://stackoverflow.com/questions/2525/best-net-obfuscation-tools-strategy,询问混淆是否容易使用工具实现。

但我的问题是,混淆有效吗?在回复的评论中这个答案 https://stackoverflow.com/questions/551554/can-you-compile-c-without-using-the-net-framework/551565#551565,有人说“如果您担心源代码被盗...对于真正的破解者来说,混淆几乎是微不足道的".

我查看了 Dotfuscator 社区版的输出:它对我来说看起来很混乱!我不想维持这个!

我知道简单地“破解”混淆的软件可能相对容易:因为您只需要找到软件中实现您想要破解的任何内容的位置(通常是许可证保护),然后添加跳转以跳过它。

如果担心的不仅仅是最终用户或“盗版者”的破解:如果担心的是“源代码盗窃”,即如果您是软件供应商,而您担心的是另一个供应商(潜在的竞争对手)的反向-设计你的源代码,然后他们可以在自己的产品中使用或添加到他们自己的产品中……简单的混淆在多大程度上足以或不充分地防范这种风险?


第一次编辑:

有问题的代码大约有 20 KLOC,它在最终用户计算机上运行(用户控件,而不是远程服务)。

如果混淆真的是“对于真正的破解者来说几乎微不足道“,我想了解一些why它是无效的(而不仅仅是“多少”无效)。


第二次编辑:

我并不担心有人逆转算法:更担心他们重新利用实际的算法执行算法(即源代码)到他们自己的产品中。

考虑到开发 20 KLOC 需要几个月的时间,那么将其全部反混淆需要比这更多还是更少的时间(几个月)?

是否有必要对某些东西进行反混淆以“窃取”它:或者一个理智的竞争对手可能会在仍然混淆的情况下将其批发到他们的产品中,接受原样这是一个维护噩梦,并希望它几乎不需要维护?如果这个场景is那么是否有可能混淆的 .Net 代码比编​​译的机器代码更容易受到此问题的影响?

大多数混淆“军备竞赛”的主要目的是否是防止人们“破解”某些东西(例如查找并删除实现许可保护/执行的代码片段),而不是防止“源代码盗窃”?


我已经讨论了为什么我不认为混淆是防止破解的有效手段:
保护 .NET 代码免遭逆向工程 https://stackoverflow.com/questions/506282/protect-net-code-from-reverse-engineering/506301#506301

但是,您的问题具体是关于来源盗窃,这是一个有趣的话题。在埃尔达德·埃利亚姆斯的书中,“逆向:逆向工程的秘密 https://rads.stackoverflow.com/amzn/click/com/0764574817”,作者在前两章中讨论了源盗窃作为逆向工程背后的原因之一。

基本上,归根结底,您成为源盗窃目标的唯一机会是,如果您拥有一些与您的领域相关的非常具体的、难以设计的算法,这些算法可以让您在竞争中占据优势。这几乎是唯一一次尝试对应用程序的一小部分进行逆向工程具有成本效益的情况。

因此,除非您拥有一些您不希望竞争对手拥有的绝密算法,否则您无需担心源代码被盗。从应用程序中反转任何大量源代码所涉及的成本很快就会超过从头开始重写它的成本。

即使您确实有一些您不希望他们拥有的算法,您也无法采取太多措施来阻止意志坚定且技术熟练的个人获取它(如果应用程序正在他们的计算机上执行)。

一些常见的防逆转措施有:

  • 混淆 - 在保护源代码或防止其被破解方面没有多大作用。但我们也可能不会让它变得完全容易,对吧?
  • 第 3 方包装商 -Themida http://www.oreans.com/是较好的之一。将可执行文件打包到加密的 win32 应用程序中。如果应用程序也是 .NET 应用程序,则防止反射。
  • 自定义加壳器 - 有时,如果您有能力的话,编写自己的加壳器是有效的,因为在破解场景中关于如何解压应用程序的信息非常少。这可以阻止没有经验的 RE。这tutorial http://www.codebreakers-journal.com/downloads/cbj/2006/CBM_1_2_2006_BigBoote_Own_Packer.pdf提供了一些有关编写自己的打包程序的好信息。
  • 让行业秘密算法远离用户机器。将它们作为远程服务执行,因此指令永远不会在本地执行。唯一“万无一失”的保护方法。

然而,加壳程序可以被解包,并且混淆并不会真正妨碍那些想要查看您的应用程序正在做什么的人。如果该程序在用户计算机上运行,​​则它很容易受到攻击。

最终,它的代码必须作为机器代码执行,通常需要启动调试器、设置一些断点并监视相关操作期间正在执行的指令,并花一些时间仔细研究这些数据。


您提到您花了几个月的时间为您的应用程序编写约 20kLOC。如果您采取最低限度的预防措施,那么将应用程序中那些等效的 20kLOC 反转为可用源将花费几乎一个数量级的时间。

这就是为什么从您的应用程序中逆向小型的、行业特定的算法才具有成本效益。别的什么,都不值得。

以下面虚构的例子为例:假设我刚刚为 iTunes 开发了一款全新的竞争应用程序,该应用程序有大量的附加功能。假设需要几个 100k LOC 和 2 年的时间来开发。我的一个关键功能是一种根据您的音乐聆听品味向您提供音乐的新方式。

苹果(他们就是盗版者)听到了这一消息,并认为他们真的很喜欢你的音乐推荐功能,所以他们决定扭转它。然后,他们将只专注于该算法,逆向工程师最终将提出一种可行的算法,在给定相同数据的情况下提供等效的建议。然后他们在自己的应用程序中实现上述算法,称之为“天才”,并赚取下一个 10 万亿美元。

就是那样来源盗窃下跌降落。

没有人会坐在那里反转所有 100k LOC 来窃取已编译应用程序的大量内容。这样做成本太高,而且太耗时。大约 90% 的情况下,他们会逆向那些无聊的、非行业秘密的代码,这些代码只是处理按钮按下或处理用户输入。相反,他们可以聘请自己的开发人员以更少的钱从头开始重写大部分内容,并简单地反转难以设计且给你带来优势的重要算法(即音乐建议功能)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混淆的效果如何? 的相关文章

  • 当文件已存在时无法创建该文件

    我正在使用 Winforms 并且尝试将文件从一个位置复制到另一个位置 如果同名文件已经存在 我想覆盖它 但我收到类似 当文件已存在时无法创建文件 的错误 我想覆盖该文件 我应该怎么办 我试过File copy代替File move 但我遇
  • 如何使用反应式扩展同时读取交错文件

    我是反应式扩展的新手 我想使用它 在 c 中 来读取包含多个交错流的文件 基本上文件的格式是ABCDABCDABCD 我更喜欢按顺序读取文件并分离流 即AAA BBB 等 并并行处理每个流 为每个流使用单独的线程 必须有某种形式的缓冲来确保
  • .net 应用程序中的内存泄漏

    我正在 VB net 2005 中开发一个桌面应用程序 该应用程序包含一个间隔为 1 分钟的计时器 每次计时器计时 就会执行一组函数 大部分与数据库相关 最初 应用程序运行良好 在进程 任务管理器 中 每次调用计时器时 CPU 使用率都会达
  • 将浮点型转换为双精度型

    我正在尝试转换Single to Double同时保持原来的价值 我找到了以下方法 Single f 5 2F Double d1 f 5 19999980926514 Double d2 Double Parse f ToString 5
  • 正则表达式:如何获取组名称

    我有一个 NET 正则表达式 它看起来类似于
  • 您是否必须在 VB.NET 中显式创建表单实例? [复制]

    这个问题在这里已经有答案了 如果一个项目包含Form类 形式可以通过以下方式显示 Form1 Show 或者是否需要首先创建表单的实例 Dim frm As New Form1 frm Show 正如所建议的 使用表单名称使用默认实例 而第
  • 使用 Serilog 时如何在输出消息中获取丰富的属性

    我正在尝试使用 Serilog 将丰富的属性输出到渲染的消息中 private static Tester GetTester return new Tester Count 7 Name Redmond Log Logger new Lo
  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 检测笔记本电脑盖子的关闭和打开

    是否可以检测笔记本电脑的盖子何时打开或关闭 从我读到的内容来看 这是不可能的 但 SO 之前已经帮助我完成了不可能的任务 我发现唯一可能朝着正确方向的事情是关于报告电源按钮所需的 IOCTL 的 MSDN 博客文章 https learn
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • .NET Framework 2.0 Service Pack 1 中新增的类型

    我以为 NET 2 0 SP1 中只有错误修复 没有新类型 直到我遇到few http davesbox com archive 2008 08 25 new for visual studio 2008 sp1 and fxcop 1 3
  • 从嵌套 ToolStripMenuItem 检索时,ContextMenuStrip.Owner 属性为 null

    我有一个ContextMenuStrip设置有两个ToolStripItem是 第二ToolStripItem有两个额外的嵌套ToolStripItems 我将其定义为 ContextMenuStrip cms new ContextMen
  • C++/CLI 中的 Lambda 表达式

    如何在 C CLI 中使用 lambda 表达式 在 C 中 lambda 实际上只是用于创建委托的语法糖 C CLI支持代表 http www functionx com cppcli classes Lesson15c htm 因此您仍
  • 如何在 IIS 中手动配置虚拟目录

    我正在尝试让外部 Visual Studio 解决方案在 Visual Studio Professional 2010 的本地副本中工作 当我打开该解决方案时 我看到一条错误消息 指出本地 IIS URL 尚未配置 我想创建一个虚拟目录吗
  • 将 KeyDown 事件传递给其他控件

    我正在编写一个 C WinForms 应用程序 NET 4 0 我有一个WinFormsControl on a Form 用户开始使用键盘输入内容后 另一个Control出现 那Control是某种文本输入 我想将用户输入发送到该Cont
  • 有没有办法将对象(及其属性)序列化为 xml?

    创建一个类 将其命名为 FormElement 该类应该具有一些属性 例如它们具有数据元素的元数据 名称 序列号 值 只是一个字符串等 该类具有验证应用程序块验证类类型的属性 我想将其序列化为xml并反序列化 验证类的所有属性 包括验证应用
  • 从 Microsoft Chart Control 单击数据标记获取鼠标单击事件

    我的应用程序中有一个 net 4 0 点图 我想捕获鼠标在数据标记上的点击 当用户单击特定点时 我想转到绑定表中数据来自的行 此功能是否内置于 net 图表控件中 编辑 我发现我可能实际上想要光标位置值 而不是要求用户单击特定的数据点 一旦
  • SecurityAction.RequestMinimum 在 .Net 4.0 中已过时

    最近 我们的 Net 客户端库正在升级以针对 Net 4 0 进行编译 将目标框架更改为4 0后 应用程序出现一些编译错误 In AssemblyInfo cs assembly SecurityPermission SecurityAct
  • 从共享网络文件夹运行的 .NET 应用程序的性能损失

    从共享网络文件夹运行 NET 4 0 应用程序是否有任何性能损失 我发现哪个应用程序启动速度较慢 但 在使用时没有注意到任何变慢 但不确定 当通过网络运行可执行文件时 Windows 不会在应用程序启动时通过网络传输整个应用程序 这样做是为

随机推荐

  • 位图插值c#

    网格尺寸 160 160 行数 列数 16 16 我为此创建了一个位图 网格的每个单元格都填充有不同的颜色 我需要执行颜色插值 我猜您想要执行以下操作 拍摄 16x16 像素图像并将其插值为 160x160 像素图像 以下是三个示例输出 您
  • 实现WebView数据库配额委托

    我如何实现这个方法 见下文 我是 Objective C 的新手 我只是不太了解它 From http lists apple com archives Webkitsdk dev 2008 Apr msg00027 html http l
  • 确定将在 php 中发送的 http 状态

    我正在尝试为管理应用程序标头的类编写一个测试用例 它发送的标头中有 http 状态标头 我正在使用 headers list 来查看将发送哪些标头 如果我现在发送标头的话 headers list 的问题是它不包含 http 状态标头 尽管
  • 为什么 lapply() 不保留我的 data.table 键?

    我的列表中有一堆 data tables 我要申请unique 到我的列表中的每个 data table 但这样做会破坏我的所有 data table 键 这是一个例子 A lt data table a rep c a b each 3
  • 这两组陈述之间的确切区别是什么?

    Set
  • 如何重新索引 pandas 数据透视表

    我创建了一个数据透视表 该表根据其中一列和时间索引的月份进行分组 这是数据透视表 AWRT AWFT AWDT Time type April All 38 190119 65 789103 27 598984 DHW 19 676627
  • 隐式、显式和流利等待之间的区别

    两者之间的确切区别是什么implicitwait explicitwait and fluentwait 您能举例说明吗 我已经发布关于此的博客文章 https medium com austenjt difference betwen i
  • 为什么 (x += x += 1) 在 C 和 Javascript 中的计算结果不同?

    如果变量的值x最初为 0 表达式x x 1在 C 中将计算为 2 在 Javascript 中将计算为 1 C 的语义对我来说似乎很明显 x x 1被解释为x x 1 反过来 这相当于 x 1 x x where x is 1 at thi
  • 在 Angular 6 工作区中安装 NPM 包

    我刚刚开始学习 Angular 6 和 CLI 并创建了一个项目 如下所示 ng new my demo cd my demo ng g library foo prefix my 我的库中没有我想要添加的内容ngx bootstrap因为
  • Scrapy Spider整理抓取过程,不刮任何东西

    我有一只蜘蛛 它会在亚马逊上抓取信息 蜘蛛读取一个 txt 文件 在其中写入它必须搜索的产品 然后进入该产品的亚马逊页面 例如 我使用 keywords laptop 来更改要搜索的产品等 我遇到的问题是蜘蛛无法工作 这很奇怪 因为一周前它
  • 软件开发中的测试人员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我的公司 我们开发一种软 件产品 到目前为止 我们还没有任何测试人员 所以基本上开发人员就是测试人员 当然还有客户和用户 不好 我们的团队现在
  • lsnrctl start rane 当我触发此命令时出现此错误

    oracle myserver lsnrctl start rane LSNRCTL for Linux Version 11 2 0 1 0 Production on 27 SEP 2016 23 04 58 Copyright c 1
  • 错误:无法解析“C:\projects\Project-CMS\Project.Web\src”中的“./app/app.module.ngfactory”

    当我为 Angular 5 应用程序创建构建时 出现以下错误 当我创建构建时它工作正常 ng build 当我创建 buildproductttion 时它显示错误 ng build prod 我没有在应用程序中的任何地方使用 ngfact
  • 关闭模态视图控制器时“[CALayer release]:消息发送到已释放的实例”

    这几天我一直在纠结这个问题 找不到解决办法 所以请教一下 我有两个 UIViewController NewPostUIViewController 和 SettingsUIViewController 在第二个中我有一个字段 id
  • 如何访问数据网格模板列文本框文本 WPF C#

    我需要访问 a 中的文本DataGrid的模板列来自代码后面 但我不知道如何 我需要将文本更改为我在上传递给它的任何字符串SelectionChanged事件 有人可以告诉我如何实现这一目标吗 我发现了一个类似的问题here https s
  • 如果存在则更新,否则插入一个查询中[重复]

    这个问题在这里已经有答案了 我有这样的简单表 ID int KEY varchar VALUE int 1 asdf 100 2 fdsa 321 3 ecda 211 我想更新行KEY some
  • 从 SPSS 中的所有变量名称中去除后缀

    我有一个数据集 其中每个变量名称都有后缀 1 这样做是为了指示第一次采访时间点 我想从所有变量中删除这个后缀 但变量有数百个 所以我正在寻找一种方法来完成此操作 而无需数百次使用 RENAME 语句 我找到的最接近相关信息来自下面的链接 用
  • MinGW 中的静态链接库

    假设我有三个 C 源文件 前两个是 LIB lib a 第三个是使用它们的应用程序 第一个是 re c int re int i return i 第二个是 test c int re int Depends on re c int tes
  • 使用相同端口(80)运行多个 java jetty 实例

    例如 我有一个主要临时域 www product com 对于每个客户端 我需要将单独的子域映射到具有相同端口 80 但具有不同实例名称 不同 wars文件 的同一服务器 www client1 product com www client
  • 混淆的效果如何?

    另一个问题 即最佳 NET 混淆工具 策略 https stackoverflow com questions 2525 best net obfuscation tools strategy 询问混淆是否容易使用工具实现 但我的问题是 混