软件是如何被“破解”的?开发者可以阻止破解版的产生吗?

昨天有小伙伴留言说;那些软件开发者就不能避免被破解吗,表示很好奇,今天小编就来跟大家好好分析分析吧!

首先什么是软件破解版:使用调试器创建软件的破解版本。 (调试器是一种比较特殊类型的软件,允许程序员将软件分解成不同的组成结构,以便发现bug,解决bug。 此外,调试器还能用于逆向工程,或者查看软件内部的信息,以了解其逻辑。 后一种方法主要被黑客们用来研究恶意软件(或计算机病毒)的内部。 但是也可以被攻击者用来“破解”(或者绕过)合法的软件注册,或者有时候用来改变软件的正常行为,比如木马种植。)

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

因此,我们假设攻击者的目标是绕过软件中的注册思维,这样他就可以免费使用。

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

软件是如何被“破解”的?开发者可以阻止破解版的产生吗?

在本代码示例中,“ RegistrationName”和“ RegistrationCode”是合法软件用户在付费购买许可证后将收到的特殊文本字符串。

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

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

软件是如何被“破解”的?开发者可以阻止破解版的产生吗?

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

软件是如何被“破解”的?开发者可以阻止破解版的产生吗?

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

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

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

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

软件是如何被“破解”的?开发者可以阻止破解版的产生吗?

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

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

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

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

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

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

软件是如何被“破解”的?开发者可以阻止破解版的产生吗?

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

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

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

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

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

不是每个人都有互联网连接,或者愿意上传他们的数据。 此外,某人的互联网连接可能非常昂贵或过于缓慢,使软件运行差.

那么就有一个问题了,分布式计算.。例如,由于为每个玩家渲染每一个场景需要大量的计算资源,暴雪娱乐公司永远不可能在他们的服务器上完全运行魔兽世界。 因此,让每个用户的计算机代替进行渲染是符合他们最大利益的

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

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

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

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

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

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

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

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

所以小编觉得为了达到某种个人利益,抱着不付出就想收获的心态,持有这种心态去做的事情虽然有可能在初期获得一些好处,但最终必将导致失败。

好了,以上就是小编给大家带来的全部内容,转发此文+关注 并私信小编“资料”即可免费领取2019最新python资料和零基础入门教程,不定期分享干货,欢迎初学和进阶中的小伙伴!

来源:编程liyi

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年9月27日
下一篇 2019年9月27日

相关推荐