如果抽卡游戏用的不是密码学安全的随机数算法(我觉得大部分游戏都不是),是不是有可能从客户端控制服务器的随机抽卡结果? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drymonfidelia
V2EX    信息安全

如果抽卡游戏用的不是密码学安全的随机数算法(我觉得大部分游戏都不是),是不是有可能从客户端控制服务器的随机抽卡结果?

  •  1
     
  •   drymonfidelia 267 天前 2317 次点击
    这是一个创建于 267 天前的主题,其中的信息可能已经有所发展或是发生改变。
    24 条回复    2025-01-17 16:50:27 +08:00
    tool2dx
        1
    tool2dx  
       267 天前 via Android
    新游戏不太可能用纯随机的算法,十连抽需要保底,会修改一些策略。
    当然也有傻乎乎的老游戏使用可预测的客户端算法,比如猫咪大战争,有粉丝网站预测抽卡下一只是啥猫。
    mercury233
        2
    mercury233  
       267 天前
    如果不是杀熟保底算法,而是真正的伪随机,而且产生随机数的方式是仅以当前时间毫秒为种子,那得知抽奖的算法的人就可以知道在哪 1000 毫秒内中奖概率高,哪 1000 毫秒内概率为 0 。所以我印象里一般网游都会采用多个种子,保证实际上的不可预测性。比如给每个账号都设置一个幸运值作为种子,只有脱裤才能获取。
    echo1937
        3
    echo1937  
       267 天前
    大部分扣卡游戏就是去服务器拿个结果,客户端本质是个播放器。
    seers
        4
    seers  
    &nsp;  267 天前 via Android
    逆向过某抽卡游戏,在发送抽卡包时候会有个 heat 参数,猜测是控制爆率的
    guanzhangzhang
        5
    guanzhangzhang  
       267 天前
    结果是服务器返回的,你客户端只有发送一个请求,包含数量啥的,假设你站着不动,有其他玩家从你旁边经过,你有控制行为吗。
    游戏客户端是一个收包,一个发包的。发包后,服务器收到处理后吧结果发给客户端,收包的 handler 会收到处理的
    drymonfidelia
        6
    drymonfidelia  
    OP
       267 天前
    @echo1937
    @guanzhangzhang 我知道正常的网络游戏抽卡随机肯定是在服务器服务器上计算,但是非密码学安全的随机数算法计算结果是有可能被预测的。
    aloxaf
        7
    aloxaf  
       267 天前
    挺难的,不安全的伪随机数生成器最多让你能预测下一个数字。但你不知道服务端具体是怎么使用这个生成器的,更不用说为了减少极端的抽卡体验,不少游戏都不是真正的随机。
    Donaldo
        8
    Donaldo  
       267 天前
    非密码学安全的随机数算法指的是随机性不够,你能不能控制结果跟随机性够不够有啥关系。
    Rickkkkkkk
        9
    Rickkkkkkk  
       267 天前
    一般为了“尽可能随机”,用的是当前服务器拿到的毫秒数+uid 做种子的,没啥可以钻空子的点。
    drymonfidelia
        10
    drymonfidelia  
    OP
       267 天前
    @Donaldo 如果是简单用时间做种子的话,随机性不够我只要控制发包时间就能控制抽卡结果了。
    另外我想了下个别极端场景的抽卡好像还没办法服务器随机,例如要求极低延迟的打怪爆装备,不能等服务器返回了再显示装备
    drymonfidelia
        11
    drymonfidelia  
    OP
       267 天前
    @Rickkkkkkk 如果从和游戏服务器相同或地理位置非常接近的机房发请求是否获得比较稳定或在很小范围波动的延迟?我也不确定是否可行
    coolfan
        12
    coolfan  
       267 天前
    有个叫作 Minecraft 的游戏,里面的很多机制也和随机数有关系。直到有人发现了游戏中的某些操作可以定量地影响这个随机数:

    https://www.bilibili.com/video/BV1np411Z778/

    https://www.bilibili.com/video/BV1Fp411o7Lp

    https://space.bilibili.com/1311124/search/video?keyword=RNG

    Donaldo
        13
    Donaldo  
       267 天前
    @drymonfidelia #10 你不仅要控制发包时间,你还要能控制收到包的时间,整个网络链路你都得掌握,这挺难的吧?

    另外为什么不能等服务器返回再显示?伤害判定都是服务器做的,这个为什么要求如此低的延迟?
    aloxaf
        14
    aloxaf  
       267 天前
    看了下前面人说的猫咪大战争,这个游戏就是每个账号初始生成一个种子并且永久不变,而且用的还是非密码学安全的随机算法,而且计算最终抽卡结果用的还是简单的取模,这才被人做到了预测自己的抽卡结果,而且也只是预测,无法控制。

    如果想做到控制结果,那必须得有其他方法来影响这个种子,但是这样你能猜到算法的难度就大大增加了。我觉得只有阅读了服务端代码的拉普拉斯抽卡妖能做到。
    Donaldo
        15
    Donaldo  
       267 天前
    @drymonfidelia #10 另外先不说你能不能控制网络质量,你还得知道这个随机算法是怎么写的,再加上能预测下一个数。有这些前提,你在密码学里差不多算是 Oracle 了。
    guanzhangzhang
        16
    guanzhangzhang  
       267 天前
    @drymonfidelia #6 只有保底机制,和阶段保底机制
    ShadowPower
        17
    ShadowPower  
       267 天前
    如果只是问有没有可能的话,当然有可能
    不过运营商不会担心这个问题。因为要能做到这一点,付出的成本将远远大于直接充钱
    xuanbg
        18
    xuanbg  
       267 天前
    就算是伪随机,你也要花很高的成本才能掌握规律。对于网络游戏,这种几十万几百万充值的,游戏运营商可以给到的福利不是你能想象的。所以他们根本不在乎你破解,而且欢迎你破解。
    guyeu
        19
    guyeu  
       267 天前
    这个取决于具体实现,不过国产卡牌进化到今天,我感觉已经不存在运气成分了,了解过一些游戏抽卡的实现,本质上随机的部分都是洗牌,一定次数内抽到的内容几乎可以说是固定的。
    exmario
        20
    exmario  
       267 天前
    让你写后端程序你会整这么大漏洞吗?那都是钱(点卡)
    Rickkkkkkk
        21
    Rickkkkkkk  
       267 天前
    @drymonfidelia 没戏。而且既然有保底,那绝对是干预了一个账户能获得东西的上下限。
    liuidetmks
        22
    liuidetmks  
       267 天前
    @mercury233 系统提供的随机算法,不是仅仅时间作为种子吧,有一个系统熵池,各种系统调用,网络事件等等,已经足够安全了
    Maboroshii
        23
    Maboroshii  
       267 天前
    全局一个随机种子,你怎么知道当前随机到第几个数了啊.. 所有玩家都在抽,又不是只有你一个人在抽
    restkhz
        24
    restkhz  
       266 天前
    我来暴论几句。

    这个问题主要取决于游戏开发怎么做的了。
    可能种子才是更加关键的问题。不管你是普通 PRNG 还是 CSPRNG 都不可能真正扔一个随机数出来,必须要一个种子。问题就在这个种子这里。

    操作系统一般都有一个熵池,直接从这里获取种子是最好的。
    从服务器熵池生成一个随机数并且确定结果,客户端放动画,PRNG 一次一种子,这种场景是安全的。

    首先客户端。
    客户端那里没有安全性可言。但是对于很多游戏大量用随机的时候基本都是客户端获取。比如你打怪随机伤害,暴击的随机。至于抽卡,取决于开发怎么想的。理论上,如果你能控制比如/dev/urandom ,逆向出算法,是可以控制抽卡等结果的。但是讲道理哦,你都能做到这些了,为什么不直接修改游戏本身...直接劫持函数或者改包改存档...

    服务器上用时间做种子呢?即便在服务器上这东西也不安全。有一个教科书级别的案例就是有某个 PHPbbs 的密码找回链接用的 md5(时间戳)。时间戳有多少可能呢?反正就那几种可能暴力一下就行了。一旦算法被研究出点眉目就容易出事。

    好的,排除这些情况。回到楼主的问题。。

    服务器生成,种子来源可靠且不可知,算法是普通 PRNG ,但是种子一直被重用,其他因素没有不太可控的,抽卡算法是可知的,那么这样我们可以通过 PRNG 的结果推算种子,的确有可能做到预测结果。如果不只是抽卡,还可以押东西,考虑赔率,那么我们就能“控制”一些东西了。

    如果服务器用的是精确到毫秒的那种时间做种子,那么就像抛硬币,只要你抛够多也能有连续 100 次正面一样。如果可以预测,即便做不到精确控制时间,假设网络延迟波动不大,我们依旧能有效找到“胜率”更高的一小段时间。确保服务器在那段时间处理请求就好了。这种情况就算 CSPRNG 也没用。种子得要当密钥看。种子泄漏了不管你是不是密码学伪随机都不会安全。

    上面 mc 的例子我猜测,瞎猜,是可以通过强行刷新种子并且种子可知,结果可预测才做到控制。
    不好意思暴论太多了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6040 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 43ms UTC 06:15 PVG 14:15 LAX 23:15 JFK 02:15
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86