我想提供一个用 C 或 C++ 编写的纯二进制程序,用户必须通过命令行传递有效的代码才能使用程序本身的一些额外功能。这个想法是在程序中实现一些验证策略,将传递的代码与运行时生成的代码进行比较,该代码明确标识正在运行程序的系统或硬件。
换句话说,当且仅当运行时检查:
f(<sysinfo>) == <given code>
为 true,则允许用户使用该程序的额外功能。 f
是在运行时生成代码的函数,sysinfo
是识别当前系统/硬件的适当信息(即第一个以太网卡的 MAC 地址、处理器的序列号等)。
目的是让用户在不知道 f
的情况下尽可能难以猜测或(猜测计算方式)有效代码和sysinfo
先验。更重要的是,我希望它很难重新实现f
通过分析程序的反汇编代码。
假设上述是一个强大的策略,我该如何实现 f
在 C 或 C++ 中,我可以选择什么作为其参数?还什么GCC
我可以打开编译器标志来进行混淆f
具体来说?请注意,例如,由于显而易见的原因,MD5(MAC) 或 MD5(SHA(MAC)) 之类的东西就太简单了。
编辑:另一个有趣的点是如何通过删除或绕过执行检查的代码部分来使用户难以直接攻击代码。
最佳答案
如果您使用的是 Windows,标准策略是对注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid 的值进行哈希处理
如果您担心用户可能“猜测”哈希函数,请采用标准 SHA256 实现并做一些偷偷摸摸的事情,例如更改算法初始化值(其中两组使用立方根的二进制表示形式)要初始化的素数 - 将其更改为第 5 个或第 7 个或任何根,从第 n 个位置开始,这样您就可以砍掉“全零”部分等)
但实际上,如果有人花时间重新编写您的代码,那么攻击代码中执行 if (codeValid) {allowExtraFeatures(); 的分支会更容易。然后搞乱哈希...所以不要太担心它。
关于c++ - 通过命令行进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716764/