为了能够选择正确的选项,您应该考虑以下几个方面:
如果问题5的答案是“是”,那么不要担心非法复制。无论如何它们都没用。
如果问题1的答案是“是”,那么首先考虑定价(见问题3)。
如果您回答问题2“是”,那么“按使用付费”模式可能会 适合你。
根据我的经验,按使用付费+定制和培训是最好的保护 对于您的软件,因为:
在您考虑引入DRM或混淆之前,您可能会想到这些要点以及它们是否适用于您的软件。
的 首先要记住隐藏你的代码 强> :并非所有代码都需要隐藏。
的 最终目标 强> :我对大多数软件程序的最终目标是能够销售不同的许可证,这些许可证可以打开和关闭程序中的特定功能。
的 最好的技术 强> :我发现在像WordPress提供的钩子和过滤器系统中构建,是试图混淆对手的绝对最佳方法。这允许您加密某些触发器关联,而无需实际加密代码。
这样做的原因是因为您需要加密尽可能少的代码。
的 知道你的破解者 强> :知道这一点:破解代码的主要原因不是因为恶意分发许可,实际上是因为需要更改代码而他们并不真正需要分发免费副本。
的 入门 强> :抛开你要加密的少量代码,其余代码应该尝试并塞进一个文件中以增加复杂性和理解。
的 准备加密 强> :您将使用我的系统在层中进行加密,这也将是一个非常复杂的过程,因此构建另一个负责加密过程的程序。
的 第一步 强> :使用base64名称对所有内容进行模糊处理。完成后,将64位混淆代码保存到临时文件中,该文件稍后将用于解密和运行此代码。合理?
我会重复,因为你会一次又一次地这样做。您将创建一个base64字符串并将其另存为另一个文件,作为将被解密和呈现的变量。
的 第二步 强> :您将在此临时文件中读取并对其进行模糊处理,然后将其保存到第二个临时文件中,该文件将用于解密并为最终用户呈现。
的 第三步 强> :根据需要重复第二步。一旦你在没有解密错误的情况下正常工作,那么你将要开始为对手开始建造地雷。
的 LAND MINE ONE 强> :你会想要保证你被通知绝对的秘密。因此,为第2层构建一个破解者尝试安全警告邮件系统。如果出现任何问题,这将被解雇,让您知道有关对手的具体信息。
的 地雷二号 强> :依赖关系。你不希望你的对手能够在没有第3层或第4层或第5层的情况下运行第一层,甚至不能为它设计的实际程序。因此,请确保在第一层中包含某种类型的kill脚本,如果程序不存在则会激活该脚本,或者其他层。
我相信你可以拿出自己的地雷,玩得开心。
的 要记住 强> :你实际上可以加密你的代码而不是base64'。这样一个简单的base64就不会解密程序。
的 奖励 强> :请记住,这实际上可能是你和你的对手之间的共生关系。我总是在第一层放置评论,评论祝贺饼干并给他们一个促销代码,以便从您那里获得现金奖励。
使现金奖励显着,不涉及任何偏见。我通常会说500美元。如果你的家伙是第一个破解密码的人,那就给他钱,然后成为他的朋友。如果他是你的朋友,他不会分发你的软件。问他如何做到这一点以及如何改进!
祝好运!
有人试过CodeMorth: http://www.sourceformat.com/code-obfuscator.htm ? 或者Themida: http://www.oreans.com/themida_features.php ?
后来看起来更有意义。
读一读 http://en.wikipedia.org/wiki/Security_by_obscurity#Arguments_against 。我相信其他人也可能会提供一个更好的来源,说明为什么安全隐患是一件坏事。
使用现代加密技术完全可以使你的系统开放(我不是说它 应该 只要它可能是开放的,并且仍然具有完全的安全性,只要加密算法没有漏洞(不太可能选择一个好的),你的私钥/密码保持私密,并且您的代码中没有安全漏洞( 这个 是你应该担心的)。
一开始,虚拟机中的受保护代码似乎无法进行逆向工程。 Themida Packer
但它不再那么安全..无论你如何打包你的代码,你总是可以对任何加载的可执行文件进行内存转储,并用IDA Pro等任何反汇编程序对其进行反汇编。
IDA Pro还为C源代码变换器提供了一个漂亮的汇编代码,虽然生成的代码看起来更像是指针/地址数学混乱......如果你将它与原始数据进行比较,你可以修复所有错误并撕掉任何东西。
没有骰子,你无法保护你的代码免于反汇编。您可以做的是为业务逻辑设置服务器,并使用webservice为您的应用程序提供服务。当然,这种情况并非总是可行。
与大多数人所说的相反,基于他们的直觉和个人经验,我认为加密安全程序混淆不被证明是不可能的。
这是一个完美混淆的程序语句的一个例子来证明我的观点:
printf("1677741794\n");
人们永远无法猜测它真正做的是什么
printf("%d\n", 0xBAADF00D ^ 0xDEADBEEF);
有一篇关于这个主题的有趣论文,证明了一些不可能的结果。它被称为 “关于混淆程序的(Im)可能性” 。
尽管本文确实证明了使程序与其实现的功能无法区分的混淆是不可能的,但是以某种较弱的方式定义的混淆仍然是可能的!
Amber所说的是完全正确的。您可以更加努力地进行逆向工程,但是您永远无法阻止它。你永远不应该相信 “安全”依赖于防止逆向工程 。
也就是说,我所见过的最好的反逆向工程技术不是专注于混淆代码,而是打破人们通常用来理解代码如何工作的工具。找到创造性的方法来打破反汇编程序,调试程序等,可能比仅仅生成大量可怕的意大利面条代码更有效,也更具智力上的满足感。这对阻止一个坚定的攻击者没有任何作用,但它确实增加了J Random Cracker徘徊并更容易处理某些事情的可能性。
为避免逆向工程,您不得将代码提供给用户。也就是说,我建议使用在线应用程序...但是(因为你没有提供任何背景信息)这对你的应用程序毫无意义。
我不认为任何代码是不可攻击的,但是对于想要尝试它的人来说,奖励需要很大。
说过你应该做的事情,比如:
尝试自己破解汇编代码,看看哪些是简单的,哪些是难以做到的。应该提出一些想法,您可以尝试使代码更难以进行逆向工程并使调试变得更加困难。
如果有人想花时间扭转你的二进制文件,那么你绝对没有办法阻止它们。如果中等程度更难,你就可以做到,但这就是它。如果你真的想了解这一点,那就得到一份 http://www.hex-rays.com/idapro/ 并拆解几个二进制文件。
CPU需要执行代码的事实是你的撤销。 CPU只执行机器代码......程序员可以读取机器代码。
话虽如此......你可能有另一个问题可以用另一种方式解决。你想保护什么?根据您的问题,您可以使用加密来保护您的产品。
要了解情况,请阅读学术文献 的 代码混淆 强> 。亚利桑那大学的克里斯蒂安科尔伯格是该领域着名的学者;哈佛大学的Salil Vadhan也做了一些很好的工作。
我对这些文献的支持很少,但我所知道的基本思想是你不能阻止攻击者看到你将要执行的代码,但你可以用代码包围它。 不 执行,并花费攻击者指数时间(使用最熟知的技术)来发现代码的哪些片段被执行,哪些不是。
自2013年7月以来,人们对密码强大的混淆(以...形式)重新产生了兴趣 不可分辨性混淆 这似乎是源于原始研究的刺激 阿米特萨海 。
您可以在此找到一些提炼信息 广达杂志的文章 并在那 IEEE Spectrum文章 。
目前使用这种技术所需的资源量使其不切实际,但AFAICT的共识对未来相当乐观。
的 我非常随便地说这个,但对于那些习惯性地忽视混淆技术的人来说 - 这是不同的。 强> 如果它被证明是真正有效并且变得实用,那么这确实很重要,而不仅仅是为了混淆。
很多时候,对产品进行逆向工程的担心是错误的。是的,它可以进行逆向工程;但 的 它会在很短的时间内变得如此有名,黑客会觉得值得反推。它? 强> (对于大量的代码行,这项工作不是一个小时间活动)。
如果它真的成为赚钱的人,那么你应该收集足够的钱来保护它,使用合法的方式,如, 的 专利和/或版权 强> 。
恕我直言,采取你将采取的基本预防措施并释放它。如果它成为逆向工程的一个点意味着你已经做得很好,你自己会找到更好的方法来克服它。祝好运。
最好的反分解器技巧,特别是在可变字长指令集上是汇编程序/机器代码,而不是C.例如
CLC BCC over .byte 0x09 over:
反汇编程序必须解决分支目标是多字节指令中的第二个字节的问题。但是,指令集模拟器没有问题。分支到计算地址(可以由C引起)也使得反汇编变得困难。指令集模拟器没有任何问题。使用模拟器为您分拣分支目的地可以帮助您进行反汇编过程。对于反汇编程序,编译的代码相对干净且容易。所以我认为需要一些装配。
我认为它接近迈克尔·阿布拉什的汇编语言禅的开头,他展示了一个简单的反反汇编和反调试器技巧。 8088/6有一个预取队列,你所做的是有一条指令修改了下一条指令或前面几条指令。如果单步执行则执行修改后的指令,如果指令集模拟器未完全模拟硬件,则执行修改后的指令。在真正运行的硬件上,实际指令已经在队列中,只要你没有再次执行该指令串,修改后的内存位置就不会造成任何损坏。你今天可能仍然会使用这样的技巧,因为流水线处理器会获取下一条指令。或者,如果你知道硬件有一个单独的指令和数据缓存,你可以修改前面的字节数,如果你正确地在缓存行中对齐这个代码,修改后的字节将不会通过指令缓存而是数据缓存写入,并且没有适当的缓存模拟器的指令集模拟器将无法正常执行。我认为只有软件解决方案不会让你走得太远。
以上是古老的,众所周知的,我不知道当前的工具,知道他们是否已经解决了这些问题。自修改代码可以/将使调试器绊倒,但是人类可以/将缩小问题,然后查看自修改代码并解决它。
过去,黑客需要大约18个月才能完成某些工作,例如dvds。现在他们平均大约2天到2周(如果有动力)(蓝光,iphone等)。这对我来说,如果我在安全上花费超过几天,我可能会浪费我的时间。您将获得的唯一真正的安全性是通过硬件(例如,您的指令是加密的,只有芯片内部的处理器核心在执行之前解密,其方式是它不能暴露解密的指令)。这可能会花费你几个月而不是几天。
另外,阅读凯文米特尼克的书“欺骗的艺术”。像这样的人可以拿起电话,让你或同事向系统分发秘密,认为它是公司另一部分的经理或其他同事或硬件工程师。而且你的安全感很糟糕。安全不仅仅是管理技术,还要管理人类。
可能你最好的选择仍然是使用虚拟化,它引入了旁路所需的另一层间接/混淆,但正如SSpoke在他的说法中所说的那样。 回答 ,这种技术也不是100%安全。
关键是你不会得到最终的保护,因为没有这样的东西,如果有的话,它将不会持续很长时间,这意味着它首先不是最终的保护。
无论人们组装什么,都可以拆卸。
通常(正确的)拆卸通常是(一点或多点)更难的任务,所以你的 对手 一定是 更熟练 ,但你可以假设总有人有这样的品质,这是一个安全的赌注。
如果你想保护REs的东西,你必须至少知道RE使用的常用技术。
这样的话
互联网并不是真正有效防范逆向工程,而是描绘了大量关于逆向工程的信息
显示你的态度不好。我不是说要使用或嵌入保护你必须知道如何打破它,但明智地使用它你应该知道它的弱点和陷阱。你应该 了解 它。
(有一些软件以错误的方式使用保护的例子,实际上不存在这种保护。为了避免模糊地说话,我将给你一个在互联网上简要描述的例子:牛津英语词典第二版CD-ROM v4。你可以阅读它在下一页中未能使用SecuROM: 在16位,32位或64位Windows环境中的CD-ROM上的牛津英语词典(OED):硬盘安装,错误,文字处理宏,网络,字体等等 )
一切都需要时间。
如果您是这个主题的新手,并且没有几个月或几年的时间来适当地进入RE的东西,那么请使用其他人提供的可用解决方案。这里的问题很明显,它们已经存在,所以你已经知道它们不是100%安全,但是制作你自己的新保护只会给你一种虚假的保护感,除非你知道最先进的技术。逆向工程和保护(但至少在此刻你没有)。
软件保护的目的是吓唬新手,阻止常见的RE,并在她/他(希望有趣的)旅程到你的应用程序中心之后,在经验丰富的RE面前微笑。
在商业谈话中,你可能会说尽可能延迟竞争。
(看看好的演示文稿 Skype中的银针 由Philippe Biondi和Fabrice Desclaux在Black Hat 2006上展示。
你知道那里有很多关于RE的东西,所以开始阅读它。 :)
我说过虚拟化,所以我会给你一个示例线程的链接 EXETOOLS FORUM : 最好的软件保护者:Themida或Enigma Protector? 。它可能会帮助您进一步搜索。