保护可执行文件不受逆向工程的影响



我一直在考虑如何保护我的C/C++代码不受反汇编和逆向工程的影响。通常情况下,在我的代码中,我自己永远不会宽恕这种行为;然而,为了各种人的安全,我一直在研究的现行协议决不能被检查或理解。

现在,这对我来说是一个新课题,互联网并不是真正足智多谋的预防逆向工程,而是描绘了如何逆向工程的大量信息

到目前为止,我想到的一些事情是:

  • 代码注入(在实际函数调用前后调用伪函数)
  • 代码混乱(破坏二进制文件的反汇编)
  • 编写自己的启动例程(调试器更难绑定)

    void startup();  
    int _start()   
    {  
        startup( );  
        exit   (0)   
    }  
    void startup()  
    {  
        /* code here */  
    }
    
  • 调试器的运行时检查(如果检测到则强制退出)

  • 功能蹦床

     void trampoline(void (*fnptr)(), bool ping = false)  
     {  
       if(ping)  
         fnptr();  
       else  
         trampoline(fnptr, true);  
     }
    
  • 无点分配和释放(堆栈变化很大)

  • 无点假人呼叫和蹦床(分解输出中跳跃数吨)
  • 铸造吨数(用于混淆的拆卸)

我的意思是,这些都是我想到的一些事情,但只要时间合适,代码分析师都可以解决和/或找出它们。我还有别的选择吗?

但它们都可以通过代码分析人员在适当的时间框架内解决和/或计算出来。

如果你给人们一个他们能够运行的程序,那么他们也将能够在足够的时间内对其进行逆向工程。这就是程序的本质。一旦二进制文件可供想要破译它的人使用,你就无法阻止最终的逆向工程。毕竟,计算机必须能够破译它才能运行,而人类只是一台速度较慢的计算机。

Amber说的完全正确。你可以让逆向工程变得更难,但你永远无法阻止它。你永远不应该相信依赖于逆向工程预防的"安全性"。

也就是说,我见过的最好的反逆向工程技术并不是集中在混淆代码上,而是集中在破坏人们通常用来理解代码如何工作的工具上。找到创造性的方法来破解反汇编程序、调试器等,可能比生成大量可怕的意大利面条代码更有效,也更令人满意。这并不能阻止一个坚定的攻击者,但它确实增加了J Random Cracker走神并转而做一些更容易的事情的可能性。

安全网哨兵(以前叫阿拉丁)。不过要注意的是,他们的API很糟糕,文档也很糟糕,与他们的SDK工具相比,这两者都很棒。

我已经使用他们的硬件保护方法(Sentinel HASP HL)很多年了。它需要一个专有的USB密钥卡,作为软件的"许可证"。他们的SDK加密和混淆您的可执行文件&库,并允许您将应用程序中的不同功能与刻录到密钥中的功能联系起来。如果没有许可方提供并激活的USB密钥,软件将无法解密,因此将无法运行。Key甚至使用了一个定制的USB通信协议(在我的知识范围之外,我不是一个设备驱动程序),使构建虚拟密钥变得困难,或者篡改运行时包装器和密钥之间的通信。他们的SDK对开发人员不是很友好,将添加保护与自动构建过程集成在一起很痛苦(但可能)。

在我们实施HASP HL保护之前,有7个已知的盗版者从产品中剥夺了dotfuscator的"保护"。我们在对软件进行重大更新的同时添加了HASP保护,该软件实时对视频执行一些繁重的计算。从分析和基准测试中可以看出,HASP HL保护只将密集计算的速度减慢了约3%。自从该软件在大约5年前发布以来,还没有发现一个新的盗版产品。它所保护的软件在其细分市场中需求量很大,客户知道有几个竞争对手正在积极尝试逆向工程(到目前为止没有成功)。我们知道,他们试图向俄罗斯的一些团体寻求帮助,这些团体宣传一项破坏软件保护的服务,因为各种新闻组和论坛上的许多帖子都包含了受保护产品的新版本。

最近,我们在一个较小的项目上尝试了他们的软件许可证解决方案(HASP SL),如果你已经熟悉HL产品,这很简单。它似乎起了作用;目前还没有盗版事件的报道,但这种产品的需求量要低得多。。

当然,没有什么保护是完美的。如果有人有足够的动力,并且有大量的现金需要消耗,我相信HASP提供的保护是可以绕过的。

使代码难以进行逆向工程称为代码混淆。

你提到的大多数技术都很容易解决。他们集中添加一些无用的代码。但是无用的代码很容易被检测和删除,给你留下了一个干净的程序。

为了进行有效的模糊处理,您需要使程序的行为依赖于正在执行的无用位。例如,与其这样做:

a = useless_computation();
a = 42;

这样做:

a = complicated_computation_that_uses_many_inputs_but_always_returns_42();

或者不这样做:

if (running_under_a_debugger()) abort();
a = 42;

这样做(running_under_a_debugger不应该容易被识别为测试代码是否在调试器下运行的函数——它应该将有用的计算与调试器检测混合在一起):

a = 42 - running_under_a_debugger();

有效的模糊处理不是纯粹在编译阶段就能做到的。无论编译器能做什么,反编译器都能做。当然,你可以增加反编译器的负担,但这不会太远。有效的混淆技术,只要它们存在,就涉及从第一天开始编写混淆的源代码。让你的代码自我修改。使用从大量输入中派生的计算跳跃来丢弃代码。例如,而不是简单地调用

some_function();

这样做,您恰好知道some_data_structure:中位的确切预期布局

goto (md5sum(&some_data_structure, 42) & 0xffffffff) + MAGIC_CONSTANT;

如果你真的想搞糊涂,那就在计划中多加几个月;混淆并不便宜。请考虑,到目前为止,避免人们对您的代码进行逆向工程的最佳方法是使其变得无用,这样他们就不会麻烦了。这是一个简单的经济考虑:如果价值大于成本,他们将进行逆向工程;但提高它们的成本也会大大提高你的成本,所以试着降低它们的价值。

既然我已经告诉您,模糊处理很难而且成本高昂,我将告诉您无论如何都不适合。你写

为了各种人的安全,我一直在研究的当前协议决不能被检查或理解

这是一个危险信号。这是一种默默无闻的安全感,它的记录非常糟糕。如果协议的安全性取决于人们不知道协议,那么你已经输了。

推荐阅读:

  • 安全圣经:罗斯·安德森的《安全工程》
  • 混淆圣经:克里斯蒂安·科尔伯格和贾斯维尔·纳格拉的超现实软件

以AES算法为例。这是一个非常非常公开的算法,而且非常安全。为什么?两个原因:它已经被很多聪明人审查过了,"秘密"部分不是算法本身——秘密部分是关键,是算法的输入之一。这是一种更好的方法,可以使用代码之外生成的"秘密"来设计协议,而不是使代码本身保密。无论你做什么,代码总是可以被解释的,(理想情况下)生成的秘密只能通过大规模的暴力方法或盗窃来危害。

我认为一个有趣的问题是"为什么你想混淆你的代码?"你想让攻击者很难破解你的算法?让他们更难在你的代码中找到可利用的漏洞?如果代码一开始是不可破解的,那么您就不需要混淆代码。问题的根源在于可破解的软件。解决问题的根源,不要只是混淆它。

此外,你的代码越混乱,你就越难发现安全漏洞。是的,这对黑客来说很难,但你也需要找到漏洞。几年后代码应该很容易维护,即使写得很好的清晰代码也很难维护。不要让事情变得更糟。

最好的反汇编技巧,特别是在可变字长指令集上,是在汇编程序/机器代码中,而不是C。例如

CLC
BCC over
.byte 0x09
over:

反汇编程序必须解决分支目的地是多字节指令中的第二个字节的问题。不过,指令集模拟器不会有问题。分支到计算地址,这可能是由C引起的,也会使反汇编变得困难到不可能。指令集模拟器不会有任何问题。使用模拟器为您整理分支目的地可以帮助反汇编过程。编译后的代码相对干净,对于反汇编程序来说也很容易。所以我认为需要进行一些组装。

我认为这是在迈克尔·阿布拉什的《汇编语言之禅》的开头,他展示了一个简单的反反汇编程序和反调试器技巧。8088/6有一个预取队列,您所做的是有一条指令修改了下一条指令或前面的几条指令。如果单步执行,那么您执行了修改后的指令,如果您的指令集模拟器没有完全模拟硬件,那么您就执行了修改过的指令。在正常运行的实际硬件上,实际指令已经在队列中,只要您不再执行该指令串,修改后的内存位置就不会造成任何损坏。今天,当流水线处理器获取下一条指令时,您可能仍然可以使用这样的技巧。或者,如果您知道硬件有一个单独的指令和数据缓存,如果您在缓存行中正确对齐此代码,则可以提前修改多个字节,修改后的字节将不会写入指令缓存,而是写入数据缓存,并且没有正确缓存模拟器的指令集模拟器将无法正确执行。我认为纯软件的解决方案不会让你走得很远。

以上都是众所周知的老工具,我对当前的工具了解不够,不知道它们是否已经解决了这些问题。自我修改的代码可以/将绊倒调试器,但人类可以/将缩小问题的范围,然后查看自我修改代码并解决它。

过去,黑客需要大约18个月的时间才能解决问题,例如dvd。现在,他们平均在2天至2周左右(如果有动力的话)(蓝光、iPhone等)。这对我来说意味着,如果我在安保上花了几天以上的时间,我很可能是在浪费时间。你将获得的唯一真正的安全性是通过硬件(例如,你的指令是加密的,只有芯片内部的处理器核心才能在执行前解密,这样它就无法暴露解密的指令)。这可能会为你争取几个月而不是几天的时间。

此外,请阅读凯文·米特尼克的书《欺骗的艺术》。像这样的人可能会拿起电话,让你或同事向系统透露秘密,以为是公司另一部门的经理、另一位同事或硬件工程师。你的安全也被破坏了。安全不全是管理技术,还必须管理人类。

很多时候,担心产品被逆向工程是错误的。是的,它可以进行逆向工程;但是它会在短时间内变得如此出名,以至于黑客会发现逆转engg是值得的。它(对于大量的代码行来说,这项工作不是一项小时间活动)。

如果它真的成为了一个赚钱的人,那么你应该已经收集到足够的钱来使用法律方式来保护它,比如专利和/或版权。

IMHO,采取你要采取的基本预防措施并将其发布。如果它成为逆向工程的一个要点,意味着你做得很好,你自己会找到更好的方法来克服它。祝你好运。

读取http://en.wikipedia.org/wiki/Security_by_obscurity#Arguments_against.我相信其他人可能也能更好地解释为什么默默无闻的安全是一件坏事。

使用现代加密技术,你的系统应该完全可以是开放的(我并不是说应该是开放的,只是它可能是开放的),并且仍然具有完全的安全性,只要加密算法没有漏洞(如果你选择了一个好的算法,就不太可能),你的私钥/密码仍然是私有的,并且您的代码中没有安全漏洞(这是您应该担心的)。

自2013年7月以来,人们对加密鲁棒模糊(以不可识别性模糊的形式)重新产生了兴趣,这似乎源于Amit Sahai的原始研究。

  • Sahai,Garg,Gentry,Halevi,Raykova,Waters,候选人不可识别性困惑以及所有电路的功能加密(2013年7月21日)
  • Sahai,Waters,如何使用模糊性混淆:可拒绝加密等等
  • Sahai,Barak,Garg,Kalai,Paneth,保护混淆免受代数攻击(2014年2月4日)

你可以在Quanta杂志的这篇文章和IEEE Spectrum的那篇文章中找到一些提炼的信息。

目前,使用这项技术所需的资源数量使其不切实际,但AFAICT的共识是对未来相当乐观。

我这么说很随意,但对于每个习惯于本能地忽视模糊技术的人来说,这是不同的如果它被证明是真正有效的,并变得实用,这确实是重要的,而不仅仅是为了混淆。

要了解更多信息,请阅读有关代码混淆的学术文献。亚利桑那大学的克里斯蒂安·科尔伯格是这一领域的著名学者;哈佛大学的Salil Vadhan也做了一些很好的工作。

我在这篇文献中落后了,但我知道的一个重要想法是,你无法阻止攻击者看到你将要执行的代码,但你可以用未执行的代码包围它,攻击者需要指数级的时间(使用最著名的技术)来发现你的代码中哪些片段被执行,哪些片段未被执行。

如果有人想花时间反转你的二进制文件,那么你绝对无法阻止他们。你可以让if稍微难一点,但仅此而已。如果你真的想了解这方面的知识,那就拿一份http://www.hex-rays.com/idapro/并反汇编一些二进制文件。

CPU需要执行代码的事实是你的失败。CPU只执行机器代码。。。程序员可以读取机器代码。

话虽如此。。。你可能有一个不同的问题,可以用另一种方式解决。你想保护什么?根据您的问题,您可能会使用加密来保护您的产品。

要选择正确的选项,您应该考虑以下方面:

  1. 是否可能是"新用户"不想付费而是使用您的软件
  2. 现有客户是否需要比现有客户更多的许可证
  3. 潜在用户愿意支付多少
  4. 您想按每个用户/并发用户/工作站/公司授予许可证吗
  5. 您的软件是否需要培训/定制才能发挥作用

如果问题5的答案是"是",那么不要担心非法复制。无论如何,它们都不会有用。

如果问题1的答案是"是",那么首先考虑定价(见问题3)。

如果你回答问题2"是",那么"按次付费"模式可能适合您。

根据我的经验,按次付费+定制和培训是最好的保护因为:

  • 定价模式吸引了新用户(很少使用->很少付费)
  • 几乎没有"匿名用户",因为他们需要培训和定制
  • 没有软件限制会吓跑潜在客户
  • 现有客户源源不断地提供资金
  • 由于长期的业务关系,您可以从客户那里获得有价值的发展反馈

在你考虑引入DRM或混淆之前,你可能会想到这些点,以及它们是否适用于你的软件。

最近有一篇论文叫做"程序模糊和一次性程序"。如果你真的很认真地保护你的应用程序。本文通过使用简单通用的硬件,概括地讨论了理论上的不可能结果。

如果你负担不起需要额外硬件的费用,那么还有另一篇论文在所有具有相同功能和相同大小的程序中给出了理论上最好的模糊处理"On best possible模糊处理"。然而,本文表明,信息论最可能暗示多项式层次的崩溃。

如果这些结果不符合你的需求,这些论文至少应该给你足够的参考书目线索,让你在相关文献中行走。

更新:模糊处理的一个新概念,称为不可区分模糊处理,可以减轻不可能的结果(纸面)

为了避免逆向工程,您不能将代码提供给用户。也就是说,我建议使用在线应用程序。。。然而(因为你没有给出上下文)这对你来说可能毫无意义。

起初,虚拟机中受保护的代码似乎不可能进行逆向工程。Themida包装机

但它不再那么安全了。。无论你如何打包你的代码,你总是可以对任何加载的可执行文件进行内存转储,并使用IDAPro等反汇编程序对其进行反汇编。

IDAPro还提供了一个漂亮的汇编代码到C源代码转换器,尽管生成的代码看起来更像指针/地址的数学混乱。。若你们把它和原来的进行比较,你们可以修正所有的错误,把任何东西都删掉。

与大多数人所说的相反,基于他们的直觉和个人经验,我不认为加密安全的程序混淆在一般情况下是不可能的。

这是一个完全模糊的程序语句的例子来证明我的观点:

printf("1677741794n");

人们永远猜不到它真正的作用是

printf("%dn", 0xBAADF00D ^ 0xDEADBEEF);

关于这个问题有一篇有趣的论文,它证明了一些不可能的结果。它被称为"关于程序混乱的可能性"。

尽管这篇论文确实证明了使程序与它实现的函数不可区分的模糊处理是不可能的,但以某种较弱的方式定义的模糊处理仍然可能!

没有骰子,您无法保护代码不被反汇编。你可以做的是为业务逻辑设置服务器,并使用Web服务为你的应用程序提供它。当然,这种情况并不总是可能的。

可能你最好的选择仍然是使用虚拟化,它引入了另一种需要绕过的间接/模糊级别,但正如SSpoke在回答中所说,这种技术也不是100%安全的。


关键是你不会得到最终的保护,因为根本没有这样的东西,如果真的有,它不会持续太久,这意味着它一开始就不是最终的保护。

无论人组装什么,都可以拆卸

通常情况下,(正确的)拆卸通常是(一点或更多)更困难的任务,所以你的对手必须更熟练,但你可以假设总有这样的人,这是一个安全的赌注。

如果你想保护某些东西不受RE的影响,你必须至少知道RE使用的常见技术。

因此单词

互联网并不是真正足智多谋的预防逆向工程,而是描绘了大量关于如何逆向工程的信息

表现出你的坏态度。我并不是说要使用或嵌入保护,你必须知道如何打破它,但要明智地使用它,你应该知道它的弱点和陷阱。你应该理解它。

(有些软件以错误的方式使用保护,使这种保护实际上不存在。为了避免含糊不清,我给你举一个在互联网上简要描述的例子:《牛津英语词典第二版CD-ROM v4》。)。你可以在下面的页面上阅读关于它使用SecurROM失败的信息:牛津英语词典(OED)在16、32或64位Windows环境中的CD-ROM上:硬盘安装、错误、文字处理宏、网络、字体等等)

一切都需要时间

如果你是新手,没有几个月甚至几年的时间来正确地学习re,那么就选择其他人提供的可用解决方案。这里的问题很明显,它们已经存在了,所以你已经知道它们不是100%安全的,但制作自己的新保护只会给你一种被保护的错误感觉,除非你非常了解逆向工程和保护的最新技术(但你不知道,至少目前是这样)。

软件保护的目的是吓唬新手,拖延常见的RE,并在经验丰富的RE(希望很有趣)到达应用程序中心后,让她/他脸上露出笑容

在商业谈话中,你可能会说这一切都是为了尽可能地推迟竞争。

(看看Philippe Biondi和Fabrice Desclaux在Black Hat 2006上展示的Skype中的Silver Needle的精彩演示)。


你知道有很多关于re的东西,所以开始读吧。:)

我说过虚拟化,所以我会给你一个链接,链接到EXETOOLS论坛的一个示例线程:最佳软件保护程序:Themida或Enigma protector?。它可能会对你的进一步搜索有所帮助。

我不认为任何代码都是不可破解的,但奖励必须非常好,才能有人尝试。

已经说过,有一些事情你应该做,例如:

  • 使用尽可能高的优化级别(逆向工程不仅是为了获得装配序列,也是为了理解代码并将其移植到C等更高级别的语言中)。高度优化的代码可以遵循b--h
  • 使结构密度不超过必要的数据类型。在正式代码发布之间重新排列结构成员。结构中重新排列的位字段也是可以使用的
  • 您可以检查是否存在某些不应该更改的值(例如版权消息)。如果一个字节向量包含"vwxyz",则可以使用另一个包含"abcde"的字节向量来比较差异。执行此操作的函数不应传递指向矢量的指针,而应使用其他模块中定义的外部指针,如(伪C代码)"char*p1=&string1[539];"one_answers"charp2=amp;string2[-11731];"。这样就不会有任何指针准确地指向这两个字符串。然后在比较代码中比较"(p1-539+i)-*(p2+11731+i)==某个值"。破解者会认为更改字符串1是安全的,因为似乎没有人引用它。把测试埋在某个意想不到的地方

试着自己破解汇编代码,看看什么容易做,什么难做。应该会弹出一些想法,你可以尝试一下,让代码更难进行反向工程,让调试更难。

正如许多人已经说过的那样:在常规CPU上,你无法阻止它们执行操作,你只能延迟它们。正如我的老加密老师告诉我的那样:你不需要完美的加密,破解代码肯定比收益更昂贵。你的困惑也是如此。

但有3个附加说明:

  1. 有可能使逆向工程变得不可能,但是(这是一个非常非常大的问题),你不能在传统的cpu上完成。我也做了很多硬件开发,经常使用FPGA。例如,Virtex 5 FX上有一个PowerPC CPU,您可以使用APU在硬件中实现自己的CPU操作码。您可以使用此功能来真正解密外部或其他软件无法访问的PowerPC的结构,甚至可以在硬件中执行命令。由于FPGA为其配置比特流内置了AES加密,因此您无法对其进行反向工程(除非有人设法破坏了AES,但我想我们还有其他问题…)。这样硬件IP供应商也可以保护他们的工作。

  2. 你是按规定说话的。你没有说它是什么样的协议,但当它是一个网络协议时,你至少应该保护它免受网络嗅探。这确实可以通过加密来实现。但是,如果你想保护加密/解密不受软件所有者的影响,你就回到了模糊处理。

  3. 一定要使你的程序不可调试/不可运行。尝试使用某种调试检测并应用它,例如在某些公式中或将调试寄存器内容添加到魔术常数中。如果你的程序看起来处于调试模式,如果它运行正常,但进行了完全错误的计算、操作或其他一些操作,那就更难了。例如,我知道一些生态游戏有非常糟糕的版权保护(我知道你不想要版权保护,但它是类似的):被盗的版本在游戏玩了30分钟后改变了挖掘的资源,突然你只得到了一个资源。海盗只是破解了它(即反向工程)-检查它是否运行,然后沃利亚释放了它。这种轻微的行为变化很难检测到,尤其是如果它们没有立即出现在检测中,只是延迟了。

因此,最后我建议:估计人们对你的软件进行逆向工程的收益,将其转化为一段时间(例如,使用最便宜的印度工资),并使逆向工程的时间成本更高。

传统的逆向工程技术取决于智能代理使用反汇编程序回答有关代码的问题的能力。如果你想要强大的安全性,你必须做一些可以证明阻止特工得到这样答案的事情。

你可以依靠"停止程序"("程序X停止了吗?")来做到这一点,而这通常是无法解决的。将难以推理的程序添加到程序中,会使程序难以推理。构造这样的程序比把它们拆开更容易。您还可以向程序中添加推理难度不同的代码;一个很好的候选者是关于别名的推理程序("指针")。

Collberg等人的一篇论文("制造廉价、有弹性和隐蔽的不透明结构")讨论了这些主题,并定义了各种"不透明"谓词,这些谓词会使人们很难对代码进行推理:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.39.1946&rep=rep1&type=pdf

我还没有看到Collberg的具体方法应用于生产代码,尤其是C或C++源代码。

DashoJava模糊处理程序似乎使用了类似的思想。http://www.cs.arizona.edu/~collberg/教学/620/2008/作业/tools/DashO/

比如果你必须保护你的客户的通信协议,那么你就是在道德上有义务使用公开的、经过专家充分审查的最佳代码。

这是针对人们可以检查代码的情况。如果您的应用程序要在嵌入式微处理器上运行,您可以选择一个具有密封功能的微处理器,这使得在运行时无法检查代码或观察诸如当前使用情况等琐碎参数。(除了硬件入侵技术,你可以小心地拆除芯片,并使用先进的设备来检查单个晶体管上的电流。)

我是x86逆向工程汇编程序的作者。如果你已经做好了感冒的准备惊喜,把你最大努力的结果发给我。(通过我的网站与我联系。)我在答案中看到的很少会给我带来实质性的障碍复杂的逆向工程代码是如何工作的,你真的应该研究网站逆向工程的挑战。

你的问题需要澄清一下。如果计算机代码可以进行逆向工程吗?如果我的协议是发送RSA加密的消息(甚至是公钥),那么通过对协议保密,你会得到什么?出于所有实际目的,检查员将面临一系列随机比特。

Groetjes Albert

关于隐藏代码要记住的第一件事:并非所有代码都需要隐藏。

最终目标:我对大多数软件程序的最终目标是能够销售不同的许可证,这些许可证将打开和关闭我的程序中的特定功能。

最佳技术:我发现在WordPress提供的挂钩和过滤器系统中构建是试图迷惑对手的最佳方法。这允许您加密某些触发器关联,而无需实际加密代码。

这样做的原因是,您希望加密尽可能少的代码。

了解你的破解者:知道这一点:破解代码的主要原因不是因为恶意分发许可证,而是因为需要更改你的代码,而他们实际上并不需要分发免费副本。

开始:将要加密的少量代码放在一边,其余代码应该尝试压缩到一个文件中,以增加复杂性和理解力。

准备加密:您将使用我的系统进行分层加密,这也是一个非常复杂的过程,因此请构建另一个负责加密过程的程序。

第一步:使用base64名称混淆所有内容。一旦完成,就对模糊代码进行base64处理,并将其保存到一个临时文件中,该文件稍后将用于解密和运行此代码。有道理吗?

我重复一遍,因为你会一次又一次地这样做。您将创建一个base64字符串,并将其作为一个变量保存到另一个文件中,该变量将被解密和呈现。

第二步:您将以字符串的形式读取此临时文件并对其进行模糊处理,然后对其进行base64处理并将其保存到第二个临时文件中,该文件将用于解密并为最终用户呈现。

第三步:根据需要多次重复第二步。一旦你在没有解密错误的情况下正常工作,那么你就会想开始为你的对手建造地雷。

地雷一号:你会想对收到通知的事实保密。因此,为第2层构建一个破解尝试安全警告邮件系统。如果出现任何问题,这将被解雇,让你知道对手的具体情况。

地雷二:依赖项。你不希望你的对手能够在没有第三层、第四层或第五层的情况下运行第一层,甚至不希望对手能够运行它设计的实际程序。因此,请确保在第一层中包含某种终止脚本,如果程序不存在,该脚本将被激活,或者在其他层中。

我相信你可以想出你自己的地雷,玩得开心。

需要记住的事情:你实际上可以加密你的代码,而不是使用base64。这样,简单的base64就不会解密程序。

奖励:请记住,这实际上可能是你和对手之间的共生关系。我总是在第一层里面放一条评论,评论祝贺破解者,并给他们一个促销代码,以便从你那里获得现金奖励。

在不涉及偏见的情况下,使现金奖励意义重大。我通常说500美元左右。如果你的人是第一个破解密码的人,那就付钱给他,成为他的朋友。如果他是你的朋友,他不会分发你的软件。问问他是怎么做到的,以及你如何改进!

祝你好运!

有人尝试过CodeMorth吗:http://www.sourceformat.com/code-obfuscator.htm?或者Themida:http://www.oreans.com/themida_features.php?

后来的一个看起来更有希望。

有一件事到目前为止还没有提到:

您可以在您的端(服务器端,例如由RESTneneneba API调用)运行部分代码。这样,逆向工程师就完全无法访问代码。

当然,这只适用于

  • 延迟
  • 交通量
  • 计算和I/O能力
  • 隐私问题

不会阻止代码的(部分)服务器端执行。

最新更新