【发布时间】:2011-09-23 19:16:11
【问题描述】:
我想用 C 预处理器生成一系列随机数,并将它们存储在变量中以供我的程序使用。
目标:
我想在每次构建程序时生成一组“唯一”的随机数。存储随机数的一小部分变量将被有意义的(即非随机)数字覆盖。我希望黑客不可能通过调试程序或比较多个版本来区分有意义的数字和随机数。我希望构建过程是自动化的和独立的。我希望实现可以跨 Visual Studio 和 GCC 移植。
澄清:
- 必须在编译时进行计算,而不是在程序执行时进行。调试程序的任何人都应该只能看到,例如,一个变量被初始化为一个常量(随机数)。
- 随机数应该是整数。
- 随机数生成器应以某种方式从
__DATE__和__TIME__播种,以便不同的构建会产生不同的随机数。 - 最好能够指定随机数的范围(例如,从 1 到 100),但并非绝对必要。
- 最好能够指定要生成的随机数的总数(例如,声明 1000 个变量并将每个变量初始化为一个随机数),但并非绝对必要。
目前的尝试:
- 预处理器中的上一个算术线程:Can the C preprocessor perform integer arithmetic? 要点是 #if 条件可以评估算术。
- 谷歌搜索显示,除了算术,移位和位操作也可以通过#if 进行评估。我已经用 Visual Studio C++ 确认了这一点。
-
简单随机数生成器的候选人:http://www.ciphersbyritter.com/NEWS4/RANDC.HTM#369B5E30.65A55FD1@stat.fsu.edu 这些生成器中的任何一个,或者任何不可能从给定的一系列随机数进行逆向工程的生成器都可以,因为我不需要性能特别好的生成器。为了这个练习,我们可以使用以下示例:
unsigned long jcong=380116160; #define CONG (jcong=69069*jcong+1234567) 我认为基本问题是在对生成器的连续调用之间存在存储在变量 jcong 中的状态。据我所知,预处理器不支持变量赋值。也许有一些聪明的递归宏可以解决问题?
-
我能得到的最接近但不满足由预处理器执行的目标是:
unsigned long jcong=380116160; unsigned long randomBlock[] = {jcong=69069*jcong+1234567, jcong=69069*jcong+1234567};我已经在 Visual Studio C++ 中确认这确实将数组成员初始化为不同的随机数。但是,调试器仍会逐步完成初始化。
这是一个纯粹的编程/实现问题,所以请不要宣传预处理器的邪恶或打击黑客的徒劳。
【问题讨论】:
-
你真的需要预处理器还是C++模板就可以了?
-
预处理器不是必需的。我只需要通过可执行文件将其全部“破解”即可。
-
@Dale “我只需要这一切都是“不可破解的””——我有坏消息要告诉你,那是行不通的。没有一个系统是牢不可破的。
-
我可以推荐VS的msbuild.exe吗?因为它的构建过程是不可预测的。我可以在一次运行中构建而不会出现任何错误,而在下一次构建时不触及任何东西,它会产生错误。
标签: c visual-c++ random c-preprocessor