通过命令行进行身份验证
Authentication via command line
我想提供一个用C或C++编写的纯二进制程序,用户必须通过命令行传递有效代码才能使用程序本身的一些额外功能。这个想法是在程序中实现一些验证策略,将传递的代码与运行时生成的代码进行比较,该代码唯一标识程序运行的系统或硬件。
换句话说,如果且仅当运行时检查:
f(<sysinfo>) == <given code>
如果为true,则允许用户使用程序的额外功能。f
是在运行时生成代码的函数,sysinfo
是标识当前系统/硬件的适当信息(即第一个以太网卡的MAC地址、处理器的序列号等)
其目的是使用户在不事先知道f
和sysinfo
的情况下尽可能难以猜测或(猜测计算方法)有效代码。更重要的是,我希望通过分析程序的反汇编代码来重新实现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();}的分支会容易得多,然后破坏哈希。。。所以不要太担心。
- 从命令行c++发送文本文件名
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 数组长度,为什么从命令行获取时不能使用它?
- LibGit2 SSH身份验证失败
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 通过 Openssl 命令行加密,通过 c++ 解密
- CMake "--target install"无需"--build"命令行
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 使用 C++ 将命令行参数拆分为参数/向量
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 如何在OMNET++中添加专门的命令行参数?
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 在命令行中创建快捷命令
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- 处理命令行参数解析/验证的代码段/lib
- 通过命令行进行身份验证