使 Python 不那么随机

主要观点:在使用 Python 编写游戏原型时遇到棘手 bug,因依赖随机性难以修复,游戏有两个随机源os.urandomrandom.randint,尝试 mock 后发现还有第三方库调用random函数,应将代码从第三方库中拉出并使用伪随机生成器函数,或用unittest.mock.patch改变库的random导入。要实现确定性随机性可通过多种方法,在不改变代码的情况下,ptrace适合此任务,可通过ptrace拦截和修改getrandom系统调用的返回值,让os.urandom返回零字节,random.randint返回确定性随机数。

关键信息:

  • 遇到 bug 及相关情况,如依赖随机性难修复等。
  • 游戏的两个随机源及尝试的 mock 方法。
  • 不同获取确定性随机性的方法及优缺点。
  • ptrace的作用及相关代码实现细节,如找到进程 ID、attach 到进程、拦截和修改系统调用等。

重要细节:

  • strace查看 Python 进程的系统调用,os.urandom调用getrandom获取字节,random.randint在导入时被播种。
  • unrandom程序通过ptrace拦截getrandom系统调用,在调用后将返回值修改为零字节。
  • 示例代码中展示了unrandom程序的具体实现过程,包括读取进程 ID、attach 到进程、拦截和修改系统调用等步骤。
  • 提供了相关资源,如ptrace的 man 页、两篇有帮助的博客文章等。
阅读 9
0 条评论