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