通过命令行进行身份验证

Authentication via command line

本文关键字:身份验证 命令行      更新时间:2023-10-16

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

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

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

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

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

假设以上是一个强大的策略,我如何在C或C++中实现f,我可以选择什么作为它的论据?此外,我可以打开哪些GCC编译器标志来具体模糊f?请注意,例如,由于明显的原因,MD5(MAC)或MD5(SHA(MAC。

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

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

如果你担心用户可能会"猜测"散列函数,采用标准的SHA256实现,并偷偷地做一些事情,比如更改算法初始化值(其中两组中的一组使用素数的立方根的二进制表示进行初始化-从第n位开始将其更改为第5或第7根或任何根,这样就可以切掉"全零"部分,等等)

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