1
tool2dx 1 天前 via Android
新游戏不太可能用纯随机的算法,十连抽需要保底,会修改一些策略。
当然也有傻乎乎的老游戏使用可预测的客户端算法,比如猫咪大战争,有粉丝网站预测抽卡下一只是啥猫。 |
2
mercury233 1 天前
如果不是杀熟保底算法,而是真正的伪随机,而且产生随机数的方式是仅以当前时间毫秒为种子,那得知抽奖的算法的人就可以知道在哪 1000 毫秒内中奖概率高,哪 1000 毫秒内概率为 0 。所以我印象里一般网游都会采用多个种子,保证实际上的不可预测性。比如给每个账号都设置一个幸运值作为种子,只有脱裤才能获取。
|
3
echo1937 1 天前
大部分扣卡游戏就是去服务器拿个结果,客户端本质是个播放器。
|
4
seers 1 天前 via Android
逆向过某抽卡游戏,在发送抽卡包时候会有个 heat 参数,猜测是控制爆率的
|
5
guanzhangzhang 1 天前
结果是服务器返回的,你客户端只有发送一个请求,包含数量啥的,假设你站着不动,有其他玩家从你旁边经过,你有控制行为吗。
游戏客户端是一个收包,一个发包的。发包后,服务器收到处理后吧结果发给客户端,收包的 handler 会收到处理的 |
6
drymonfidelia OP |
7
aloxaf 1 天前
挺难的,不安全的伪随机数生成器最多让你能预测下一个数字。但你不知道服务端具体是怎么使用这个生成器的,更不用说为了减少极端的抽卡体验,不少游戏都不是真正的随机。
|
8
Donaldo 1 天前
非密码学安全的随机数算法指的是随机性不够,你能不能控制结果跟随机性够不够有啥关系。
|
9
Rickkkkkkk 1 天前
一般为了“尽可能随机”,用的是当前服务器拿到的毫秒数+uid 做种子的,没啥可以钻空子的点。
|
10
drymonfidelia OP @Donaldo 如果是简单用时间做种子的话,随机性不够我只要控制发包时间就能控制抽卡结果了。
另外我想了下个别极端场景的抽卡好像还没办法服务器随机,例如要求极低延迟的打怪爆装备,不能等服务器返回了再显示装备 |
11
drymonfidelia OP @Rickkkkkkk 如果从和游戏服务器相同或地理位置非常接近的机房发请求是否获得比较稳定或在很小范围波动的延迟?我也不确定是否可行
|
12
coolfan 1 天前
有个叫作 Minecraft 的游戏,里面的很多机制也和随机数有关系。直到有人发现了游戏中的某些操作可以定量地影响这个随机数:
https://www.bilibili.com/video/BV1np411Z778/ https://www.bilibili.com/video/BV1Fp411o7Lp https://space.bilibili.com/1311124/search/video?keyword=RNG |
13
Donaldo 1 天前
@drymonfidelia #10 你不仅要控制发包时间,你还要能控制收到包的时间,整个网络链路你都得掌握,这挺难的吧?
另外为什么不能等服务器返回再显示?伤害判定都是服务器做的,这个为什么要求如此低的延迟? |
14
aloxaf 1 天前
看了下前面人说的猫咪大战争,这个游戏就是每个账号初始生成一个种子并且永久不变,而且用的还是非密码学安全的随机算法,而且计算最终抽卡结果用的还是简单的取模,这才被人做到了预测自己的抽卡结果,而且也只是预测,无法控制。
如果想做到控制结果,那必须得有其他方法来影响这个种子,但是这样你能猜到算法的难度就大大增加了。我觉得只有阅读了服务端代码的拉普拉斯抽卡妖能做到。 |
15
Donaldo 1 天前
@drymonfidelia #10 另外先不说你能不能控制网络质量,你还得知道这个随机算法是怎么写的,再加上能预测下一个数。有这些前提,你在密码学里差不多算是 Oracle 了。
|
16
guanzhangzhang 1 天前
@drymonfidelia #6 只有保底机制,和阶段保底机制
|
17
ShadowPower 1 天前
如果只是问有没有可能的话,当然有可能
不过运营商不会担心这个问题。因为要能做到这一点,付出的成本将远远大于直接充钱 |
18
xuanbg 1 天前
就算是伪随机,你也要花很高的成本才能掌握规律。对于网络游戏,这种几十万几百万充值的,游戏运营商可以给到的福利不是你能想象的。所以他们根本不在乎你破解,而且欢迎你破解。
|
19
guyeu 1 天前
这个取决于具体实现,不过国产卡牌进化到今天,我感觉已经不存在运气成分了,了解过一些游戏抽卡的实现,本质上随机的部分都是洗牌,一定次数内抽到的内容几乎可以说是固定的。
|
20
exmario 1 天前
让你写后端程序你会整这么大漏洞吗?那都是钱(点卡)
|
21
Rickkkkkkk 1 天前
@drymonfidelia 没戏。而且既然有保底,那绝对是干预了一个账户能获得东西的上下限。
|
22
liuidetmks 1 天前
@mercury233 系统提供的随机算法,不是仅仅时间作为种子吧,有一个系统熵池,各种系统调用,网络事件等等,已经足够安全了
|
23
Maboroshii 23 小时 27 分钟前
全局一个随机种子,你怎么知道当前随机到第几个数了啊.. 所有玩家都在抽,又不是只有你一个人在抽
|
24
restkhz 20 小时 15 分钟前
我来暴论几句。
这个问题主要取决于游戏开发怎么做的了。 可能种子才是更加关键的问题。不管你是普通 PRNG 还是 CSPRNG 都不可能真正扔一个随机数出来,必须要一个种子。问题就在这个种子这里。 操作系统一般都有一个熵池,直接从这里获取种子是最好的。 从服务器熵池生成一个随机数并且确定结果,客户端放动画,PRNG 一次一种子,这种场景是安全的。 首先客户端。 客户端那里没有安全性可言。但是对于很多游戏大量用随机的时候基本都是客户端获取。比如你打怪随机伤害,暴击的随机。至于抽卡,取决于开发怎么想的。理论上,如果你能控制比如/dev/urandom ,逆向出算法,是可以控制抽卡等结果的。但是讲道理哦,你都能做到这些了,为什么不直接修改游戏本身...直接劫持函数或者改包改存档... 服务器上用时间做种子呢?即便在服务器上这东西也不安全。有一个教科书级别的案例就是有某个 PHPbbs 的密码找回链接用的 md5(时间戳)。时间戳有多少可能呢?反正就那几种可能暴力一下就行了。一旦算法被研究出点眉目就容易出事。 好的,排除这些情况。回到楼主的问题。。 服务器生成,种子来源可靠且不可知,算法是普通 PRNG ,但是种子一直被重用,其他因素没有不太可控的,抽卡算法是可知的,那么这样我们可以通过 PRNG 的结果推算种子,的确有可能做到预测结果。如果不只是抽卡,还可以押东西,考虑赔率,那么我们就能“控制”一些东西了。 如果服务器用的是精确到毫秒的那种时间做种子,那么就像抛硬币,只要你抛够多也能有连续 100 次正面一样。如果可以预测,即便做不到精确控制时间,假设网络延迟波动不大,我们依旧能有效找到“胜率”更高的一小段时间。确保服务器在那段时间处理请求就好了。这种情况就算 CSPRNG 也没用。种子得要当密钥看。种子泄漏了不管你是不是密码学伪随机都不会安全。 上面 mc 的例子我猜测,瞎猜,是可以通过强行刷新种子并且种子可知,结果可预测才做到控制。 不好意思暴论太多了。 |