为什么开发者不阻止破解版的产生

avatar 2019年12月3日22:28:14为什么开发者不阻止破解版的产生已关闭评论

首先看看破解版是如何产生的:

使用调试器创建软件的破解版本。 (调试器是一种特殊类型的软件,它允许程序员将软件分解成不同的组成部分,以便发现错误,从而消除错误。 此外,调试器可以用于逆向工程,或者查看软件内部的内容,以了解其逻辑。 后一种方法主要被恶意软件研究人员用来研究恶意软件(或计算机病毒)的内部。 但是它也可以被攻击者用来“破解”(或者绕过)合法的软件注册,或者有时候用来改变软件的正常行为,例如向其中注入恶意代码。)

对于这个示例,假设正在被“破解”的软件被编译成本机代码,而不是基于 .NET 或 JavaScript 的应用程序。 (否则查看它的源代码就显得有些琐碎了。) 编译后的本机代码要研究起来有点棘手。 (本机意味着代码直接由 CPU、 GPU 或其他硬件执行。)

因此,让我们假设攻击者的目标是绕过软件中的注册逻辑,这样他就不必为此付费。

为了简单起见,让我们假设检查软件注册的原始逻辑是用 c + + 编写的,类似于下面的代码片段:

在本代码示例中,“ RegistrationName”和“ RegistrationCode”是合法软件用户在付费购买许可证后将收到的特殊文本字符串。 (名字通常是那个人的真实姓名或者他的电子邮件地址,代码是一些与名字相关的特殊字符串。)

在上面的逻辑中,名为“ isRegistrationCodeGood ()”的函数将检查“ RegistrationName”和“ RegistrationCode”是否被某些专有方法接受。 如果是的话,它将返回 true。 否则就是错误的。 该外部代码将指定执行将遵循的分支(或范围)。

因此,上面的逻辑要么显示注册失败或退出:

或者,如果注册代码和名称匹配,它将使用名为“ rememberRegistrationParameters ()”的功能将注册详细信息保存在持久存储中(如文件系统或系统注册中心) ,然后显示感谢用户注册的消息:

“破解者”显然希望为他输入的任何注册代码获得第二个结果。 但是他们有一个问题。 他们没有 c++ 源代码。

因此,攻击者唯一的办法就是反汇编二进制代码(总是以 .exe 和 .dll 文件,并且大部分是 Unix 可执行文件的应用程序包) 然后,攻击者将使用调试器来研究二进制代码,并试图找到我上面提到的注册逻辑。

接下来,您可以看到我在 c + + 中展示的代码片段的流程图,该代码片段是通过低级调试器提供的。 或者,代码在编译后将以二进制形式读取:

(为了可读性,我在右边添加了带有函数和变量名的注释。 它们不会出现在攻击者可以看到的代码中。)

(要理解上面显示的内容,攻击者必须对本机代码的汇编语言指令有很好的了解。)

我还需要指出,对于攻击者来说,拥有上面这样的反汇编代码片段是最终的结果。 对他来说,主要的困难是如何在数以百万计的其他类似代码行中找到它。 这就是他们面临的主要挑战。 没有多少人能做到这一点,这就是为什么软件“破解”是一种特殊技能。


因此,在软件二进制文件中找到上面的代码片段之后,“黑客”有两个选择:

1)修改(或修补)二进制文件。

2)对“ isRegistrationCodeGood ()”函数进行逆向工程,并复制其逻辑以创建所谓的“ KeyGen”或“ Key Generator”

让我们回顾一下:

第一个选择很简单。 因为攻击者已经到了这一步,所以他对 Intel x64指令集非常了解。 因此,他们只需将地址00007FF645671418(在屏幕截图中用红色圈出)的“ jnz short loc 7ff645671430”的条件跳转为无条件跳转,或“ jmp short loc 7ff645671430”。 这将有效地删除任何失败的注册代码条目,任何用户类型将被接受为一个有效的注册。

还要注意,这种修改可以通过将二进制代码中的一个字节从0x75改为0xEB 来实现:

但是这种方法带来了修改原始二进制文件的“代价”。 为此,攻击者需要编写他自己的“修补程序”(或者一个小的可执行程序,它将应用我上面描述的修改) 对于攻击者来说,这种方法的缺点是修补原始可执行文件会破坏其数字签名,这可能会警告终端用户或供应商。 此外,攻击者制造的“修补程序”可以很容易地被终端用户的防病毒软件标记和阻止,或者引导犯罪调查人员找到攻击者的身份。

第二个选择有点棘手。 攻击者必须研究“ isRegistrationCodeGood ()”功能,然后将其复制到自己的小程序中,这个程序可以有效地复制原始软件中实现的逻辑,并让他根据任何名称生成注册代码,从而使该软件的任何肆无忌惮的用户无需支付费用即可注册该软件。

许多主要软件产品的供应商了解第二种方法的潜在影响,并试图通过要求所谓的“身份验证”来防止这种影响。这基本上是注册后的第二步,软件向公司的网络服务器提交注册名称,该服务器返回对软件的响应,判断代码是否合法。 这是微软在购买 Windows (他们称之为“激活 Windows”)时做的,也是 Adobe 和许多其他公司做的。 第二步可以在软件运行时在幕后进行,如果是非法获得的,通常会导致先前的注册被取消。


现在你知道软件是如何“破解”的了。

现在来回答为什么不可能防止它。 归根结底,任何软件代码都需要由 CPU (如果是二进制本机代码)或由解释器或 JIT 编译器(如果是 JavaScript 或 Net 代码) 这意味着,如果有一种方法可以阅读 / 解释某些内容,不管它有多么复杂或令人费解,具有足够知识和持久性的攻击者也能够阅读它,从而破解它。

有一种观点认为基于云的软件更安全,这是事实,因为它的(二进制)代码保留在服务器上,最终用户不能直接访问它。 尽管基于云的软件无疑是未来的发展方向,但它也有一些主要的缺点,这些缺点使得它永远无法完全取代传统的软件。 举几个例子:

  • 不是每个人都有互联网连接,或者愿意上传他们的数据。 此外,某人的互联网连接可能非常昂贵或过于缓慢,使软件运行差.
  • 那么就有一个问题了,分布式计算.。例如,由于为每个玩家渲染每一个场景需要大量的计算资源,暴雪娱乐公司永远不可能在他们的服务器上完全运行魔兽世界。 因此,让每个用户的计算机代替进行渲染是符合他们最大利益的

作为一个软件开发者,我显然不喜欢有人盗用软件许可证。 但是不得不接受它。 好消息是,没有多少人愿意付出更多努力去寻找一个破解版本的软件。 对于那些下载了修补程序的人来说,主要的问题是,通过下载修补程序、攻击者的 KeyGen 或 Patcher,他们实际上是在“信任”攻击者,不会在其中放入任何不是“在软件包上做广告”的“讨厌的”东西(比如木马、恶意软件或键盘记录器) 所以对于这些人来说,问题就变成了——用软件许可证来潜在地感染你的系统,这值得吗?

另一边,一些开发人员对任何试图窃取他们的软件许可证的行为反应大。 他们试图实现各种各样的对策——从欺骗反向工程师,到在代码中添加陷阱(如果代码检测到代码正在被调试,可能会做一些讨厌的事情) ,到模糊处理或扰乱代码,到实施各种复杂的 DRM 方案,再到阻止来自某些国家的用户。 我个人尽量避开所有这些措施。 原因如下:

A)任何类型的反逆向工程策略都可以被具有足够持久性的攻击者绕过。 那么,既然我可以投入时间为我的软件添加一些有用的东西,使其对合法用户更有效率,为什么还要浪费我的时间呢?

B) 一些代码包可能会用防病毒软件,这显然不利于该软件的市场营销。 它还为开发人员调试软件制造了不必要的复杂性。

C) 在代码中添加陷阱也会对你的合法用户造成“误射” ,这真的会激怒他们,甚至可能导致法律诉讼。

D) 任何数字版权保护计划都可能捕获100个非法用户,给10,000个合法用户带来极大的不便。 那么为什么要这样对待你的好客户呢?

E) 我们的统计数据显示,大约75% 的非法许可证来自中国、俄罗斯、巴西等国家,这些国家的违法行为最为严重。 然而,对我们来说最主要的问题是,如果我们强制执行数字版权管理或者增加一些强大的注册认证,许多想要绕过我们的注册的人只会使用一个被盗的信用卡号码。 我们无法控制它。 我们的系统将使用它发送给他们一个合法的许可证。 因此,我们将失去为许可证支付的钱,加上信用卡公司将征收额外的扣款费用到我们的帐户,这可能范围从0.25美元到20美元,除了许可证成本。

F) 正如在评论中指出的,有些公司实际上可能从允许盗版他们的软件中获益。 例如,微软从使用 Windows 操作系统的用户那里获得了大量的免费宣传,Adobe 的 Photoshop 也是如此。 我同意这个观点。


所以我现在的哲学是---- 如果有人想更进一步,偷走我们的软件,那就去做吧! 不管怎样,他们做到了这一步,所以他们可能有一个很好的理由。 从积极的一面来看,还有很多其他客户欣赏开发软件的工作,这些工作远远超过了那些没有开发软件的客户。

avatar