代码混淆和运行时行为更改
Posted
技术标签:
【中文标题】代码混淆和运行时行为更改【英文标题】:Code obfuscation and runtime behaviour changes 【发布时间】:2011-09-07 00:07:11 【问题描述】:有没有什么方法可以用你的代码创建一个由三部分组成的谜题,你可以让你有一个加密的字符串,一个专门为那个字符串构建的函数,并且只为那个字符串,(解密形式的字符串是实际上要执行的代码/指令)。第三个也是最重要的,最后一部分是使函数的执行成为可能的上下文,并且该环境状态必须是不可伪造的。所以函数只对匹配的字符串执行一次,只有一个环境状态,然后过期。它必须是一个完美的时钟机制,即使只缺少一个部件,也使它“不可……滴答”(当然,不能滴答,就像“发挥作用”一样,因为每个部分都是至关重要的)。
我在这里谈论的是脚本语言,其中存在 eval 之类的东西,但它可以作为一种通用技术应用。
使用基于各种内存状态和变量(随机或非随机)的某种“多米诺骨牌”效应,您可以创建类似于“泄漏效应”的东西,让您的代码位在结构化(但隐藏)中放置,以便最后使用一个奇怪的工具作为“代码漏斗”,全部安排在一个执行流程中。
由于我不知道这样的事情,我的文字是虚构的,以便能够给出任何可读和可理解的形式。
我的问题正是关于这个......这可能吗?我能得到什么帮助吗?有什么想法吗?因为我现在找不到能有这种效果的东西。
当然,您可能会发现我没有理由要求这样的事情,因为您可以说没有人对我的代码感兴趣,或者我患有偏执狂。但仍然认为这可能是一个原因。不,这肯定是我想知道这个的原因。
请不要急于下结论,例如“已明确说明这不是论坛”,因为这是我面临的问题,迫切需要解决方案。由于我对很多事情都缺乏经验,包括严肃的数学和扎实的算法思维,我急切地寻求帮助。所以我感谢那些愿意考虑这件事的人。
【问题讨论】:
【参考方案1】:从根本上说,这基本上是不可能的。
您想向某人提供一些信息(您的代码)。您希望他们能够在一种特定状态下(您没有很好地定义)执行一次代码。但是您不希望他们能够检查该代码,或在其他情况下执行它。不可能。
该人机器上的程序(将执行代码)必须能够检查代码,才能执行它。因此,该机器上的其他程序也将能够检查代码。
您可以对您的代码进行加密,这样任意程序就无法对其进行检查,然后您就可以重新获得控制权。但是要执行代码的程序仍然需要检查它,因此您必须以某种方式获取解密代码所需的信息。
但现在你又回到了原来的问题:你想为用户提供一些信息(解密密钥)用于特定用途(仅在以下情况下解密和运行你的代码)您指定的情况),而不是针对任何其他情况。
更有趣的是,您可以改为使用从您要检查的环境部分派生的哈希值来加密您的代码(如果不知道您要检查什么,就不可能说您是如何获得密钥的)。然后,如果用户(或代表他们执行您的代码的程序)想要检查代码,它必须遵循从环境中获取哈希值的相同过程并且具有正确的环境.但是用户可以安排从该环境中收集哈希值并保留它,让他们可以随时检查您的代码。
另外,我不知道您可以检查什么实际上 保证正确的环境。如果程序应该在解密它自己的秘密部分并运行它之前检查它是否正确运行(没有修改对你的代码进行监视),那么间谍可以很容易地提取加密的东西,从(未加密)检查代码进行了哪些计算来检查环境,然后根据“正确”环境而不是实际存在的环境进行自己的计算。
最终,您所能做的就是让恢复您的最高机密代码的过程变得更加烦人,从而消除烦恼。大多数人无论如何都不会费心去看你的代码。他们只是不在乎。剩下的大多数人都会在最轻微的阻力下放弃(尽管使用您的软件可能会推迟他们)。在那之后仍在尝试的人......总是有机会(如果你的密码真的那么有价值/有趣)会有足够积极的人来解决你所做的任何事情(除非你只是从不给任何人你的密码首先)。因此,我的倾向是只需花些小功夫来隐藏您的密码,不要担心实现完美的安全性,因为这是不可能的。
【讨论】:
【参考方案2】:您可以简单地使用symmetric encryption 加密代码。使用随机密钥对其进行加密,将该密钥存储在计算机上,然后在加密代码中包含一个在代码运行时从内存中删除该密钥的部分。当然,有人在删除之前复制密钥并稍后将其恢复到内存中会相对容易,但是您可以将其放在不起眼的地方,而且我认为无论您做什么,都可以将计算机恢复到较早的状态(使用backup软件)。
【讨论】:
感谢您的回答。您在帖子末尾提到的正是我的问题。没有任何方法可以制作不可恢复的上下文吗?或者其中包含信息,因此它可以自动执行并且本身就是上下文,因为它结束时无法重新启动。【参考方案3】:@Ben,有趣的介绍,我相信从我了解什么可以做,什么不能做的那一刻起,我就在思考这个问题。你说的每一种可能的情况我都想到了,更何况,确实好像没有办法。也许我应该限制自己,尽可能让自己头疼。这不仅是一个超级机密的代码,正如你所说的那样,而且我隐藏它还有另一个意图,那就是,原谅我缺乏谦虚,这确实是一个有趣的代码,我真的想过滤那些看到它, 如果不经过 B 从 A 到 C 需要一个天才,那么它必须需要另一个才能弄清楚如何。我虽然是我缺乏经验让我沮丧的是无法解决的问题。但是,我总是被摆在这些看似不可能的情况面前,我通常会拼命寻找解决方案,我处理得很好。但现在只是我不能投降。
我可能从一开始就知道答案,无论你怎么尝试都做不到,当然很容易找出原因,因为它不正常或不正确,它必须取决于你的知识和经验,你所创造的东西的极限。考虑到这一点,很明显,为什么一定会有比你更好的人,而且肯定会有比你更好的人来克服你。即使这对我来说,至少从主观上来说,是一件很麻烦的事。那么,我想我会尽力减少那些知道我的超级机密代码的人。毕竟,即使是上帝也是伟大的拼图制造者。
无论如何,我非常感谢您的回答。
附:抱歉回答晚了,但由于我 8 小时无法回答我的问题,我不得不等待,之后我无法找到任何可用的时间来回答。
【讨论】:
以上是关于代码混淆和运行时行为更改的主要内容,如果未能解决你的问题,请参考以下文章