【问题标题】:Authentication via command line [closed]通过命令行进行身份验证[关闭]
【发布时间】:2014-09-08 02:38:14
【问题描述】:

我想提供一个用 C 或 C++ 编写的纯二进制程序,用户必须通过命令行传递有效代码才能使用程序本身的一些额外功能。这个想法是在程序中实现一些验证策略,将传递的代码与运行时生成的代码进行比较,该代码明确地识别程序正在运行的系统或硬件。

换句话说,当且仅当运行时检查:

f(<sysinfo>) == <given code>

为真,则允许用户使用程序的额外功能。 f 是在运行时生成代码的函数,sysinfo 是识别当前系统/硬件的适当信息(即第一块以太网卡的 MAC 地址、处理器的序列号等)。

目的是让用户在不知道fsysinfo 先验的情况下尽可能难以猜测或(猜测计算方式)有效代码。更重要的是,我希望通过分析程序的反汇编代码,很难重新实现f

假设以上是一个强有力的策略,我如何在 C 或 C++ 中实现f,我可以选择什么作为它的参数?另外,我可以打开哪些GCC 编译器标志来专门混淆f?请注意,例如 MD5(MAC) 或 MD5(SHA(MAC)) 之类的东西由于显而易见的原因太简单了。

编辑:另一个有趣的点是如何使用户难以通过删除或绕过执行检查的代码部分来直接攻击代码。

【问题讨论】:

  • 你想要非对称加密。
  • @SLaks 你能详细说明一下吗?你有一些资源的链接吗?
  • 所以如果用户更改硬件配置,例如通过添加新的以太网卡,软件会停止工作吗?我的 solve-puzzlesbuild-systems-that-work 指令有冲突...
  • 假设不能添加 eth 卡,在我的情况下确实如此。无论如何,这只是一个例子。

标签: c++ c gcc cryptography


【解决方案1】:

如果您在 Windows 上,标准策略是散列注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid 的值

如果您担心用户可能会“猜测”哈希函数,请采用标准 SHA256 实现并做一些鬼鬼祟祟的事情,例如更改算法初始化值(这两组中的一组使用要初始化的素数 - 将其更改为第 5 或第 7 或任何根,从第 n 位开始,这样您就可以切掉“全零”部分等)

但实际上,如果有人要花时间重新编写您的代码,那么攻击执行 if (codeValid) { allowExtraFeatures(); 的代码中的分支要容易得多。 } 然后搞乱哈希...所以不要担心太多

【讨论】:

  • 好点.. 攻击代码会更容易
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 2020-07-17
  • 2013-06-12
  • 1970-01-01
  • 2013-04-29
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多