【发布时间】:2014-09-08 02:38:14
【问题描述】:
我想提供一个用 C 或 C++ 编写的纯二进制程序,用户必须通过命令行传递有效代码才能使用程序本身的一些额外功能。这个想法是在程序中实现一些验证策略,将传递的代码与运行时生成的代码进行比较,该代码明确地识别程序正在运行的系统或硬件。
换句话说,当且仅当运行时检查:
f(<sysinfo>) == <given code>
为真,则允许用户使用程序的额外功能。 f 是在运行时生成代码的函数,sysinfo 是识别当前系统/硬件的适当信息(即第一块以太网卡的 MAC 地址、处理器的序列号等)。
目的是让用户在不知道f 和sysinfo 先验的情况下尽可能难以猜测或(猜测计算方式)有效代码。更重要的是,我希望通过分析程序的反汇编代码,很难重新实现f。
假设以上是一个强有力的策略,我如何在 C 或 C++ 中实现f,我可以选择什么作为它的参数?另外,我可以打开哪些GCC 编译器标志来专门混淆f?请注意,例如 MD5(MAC) 或 MD5(SHA(MAC)) 之类的东西由于显而易见的原因太简单了。
编辑:另一个有趣的点是如何使用户难以通过删除或绕过执行检查的代码部分来直接攻击代码。
【问题讨论】:
-
你想要非对称加密。
-
@SLaks 你能详细说明一下吗?你有一些资源的链接吗?
-
所以如果用户更改硬件配置,例如通过添加新的以太网卡,软件会停止工作吗?我的 solve-puzzles 和 build-systems-that-work 指令有冲突...
-
假设不能添加 eth 卡,在我的情况下确实如此。无论如何,这只是一个例子。
标签: c++ c gcc cryptography