pkhex吧 关注:32,817贴子:98,929

简单科普下 Gen5 初始种子如何生成的

只看楼主收藏回复

最近太忙,缓更,之前乱数的神奥 3 幻兽镇


IP属地:四川来自iPhone客户端1楼2022-12-14 16:56回复
    嗯,没心思玩朱紫,只能码码字,悲


    IP属地:四川来自iPhone客户端2楼2022-12-14 16:58
    收起回复
      先说下背景吧,本来打算从 gen3 开始一代代科普的,但是最近太忙加上前面世代的其实没啥有意思,这几天刚好在整理我之前写的东西。gen5 初始种子还算是比较特别,于是发一发,供大伙乐一乐


      IP属地:四川来自iPhone客户端3楼2022-12-14 17:04
      回复
        首先 gen5 的初始种子生成分两种情况:
        1. 无 C-Gear
        2.有 C-Gear
        第二种情况初始种子的生成特别简单,和 gen4 初始种子生成方式大差不多,了解 gen4 初始种子如何生成的大佬估计会很熟悉。
        而第一种情况就有点麻烦了,会用到很多参数包括游戏语言,游戏版本,DS 型号,Timer0,VCount,MAC 地址,游戏是否软重置,VFrame,GxStat,当前日期与时间,以及 boot 过程中按下的按钮,将这些参数进行一些组合运算后得到一个 512 位的块,然后将此块进行 SHA-1 运算,运算后产生的 160 位的数据摘要的一部分会用来生成初始种子。


        IP属地:四川来自iPhone客户端4楼2022-12-14 17:12
        回复
          想死我了宝贝儿


          IP属地:山东来自Android客户端5楼2022-12-14 17:14
          收起回复
            下面具体展开看看每个参数是如何影响 SHA-1 生成种子的。
            为了描述 SHA-1 生成种子时是如何被这些参数影响的,下面定义个数组用来存放之后 SHA-1 运算会用到的那 512 位的信息块。

            SHA-1 将使用它来计算初始种子。


            IP属地:四川6楼2022-12-14 17:18
            回复
              Language, Version, and DS Type
              每种游戏语言 、游戏版本和 DS 类型的组合都有 5 个特定值,称为 Nazos。这些 Nazos 存储在 message[0] 至 message[4],每种组合的 Nazos 可以在下面找到。( 大部分人估计也就用 ENG 和 JPN 玩吧,就只贴这两个的了 )
              EnglishBlack = { 0xB0602102, 0xAC612102, 0xAC612102, 0xF8612102, 0xF8612102 };
              EnglishBlackDSi = { 0x90017602, 0x8C027602, 0x8C027602, 0xD8027602, 0xD8027602 };
              EnglishWhite = { 0xD0602102, 0xCC612102, 0xCC612102, 0x18622102, 0x18622102 };
              EnglishWhiteDSi = { 0xB0017602, 0xAC027602, 0xAC027602, 0xF8027602, 0xF8027602 };
              EnglishBlack2 = { 0xE8AE0902, 0xE99D0302, 0x10002002, 0x64002002, 0x64002002 };
              EnglishBlack2DSi = { 0xE8AE0902, 0xE99D0302, 0x705F7A02, 0xC45F7A02, 0xC45F7A02 };
              EnglishWhite2 = { 0x28AF0902, 0x159E0302, 0x50002002, 0xA4002002, 0xA4002002 };
              EnglishWhite2DSi = { 0x28AF0902, 0x159E0302, 0x905E7A02, 0xE45E7A02, 0xE45E7A02 };
              JapaneseBlack = { 0x105F2102, 0x0C602102, 0x0C602102, 0x58602102, 0x58602102 };
              JapaneseBlackDSi = { 0x50117602, 0x4C127602, 0x4C127602, 0x98127602, 0x98127602 };
              JapaneseWhite = { 0x305F2102, 0x2C602102, 0x2C602102, 0x78602102, 0x78602102 };
              JapaneseWhiteDSi = { 0x50117602, 0x4C127602, 0x4C127602, 0x98127602, 0x98127602 };
              JapaneseBlack2 = { 0xDCA80902, 0xC99A0302, 0xB0F91F02, 0x04FA1F02, 0x04FA1F02 };
              JapaneseBlack2DSi = { 0xDCA80902, 0xC99A0302, 0x30A77A02, 0x84A77A02, 0x84A77A02 };
              JapaneseWhite2 = { 0xFCA80902, 0xF59A0302, 0xD0F91F02, 0x24FA1F02, 0x24FA1F02 };
              JapaneseWhite2DSi = { 0xFCA80902, 0xF59A0302, 0xF0A57A02, 0x44A67A02, 0x44A67A02 };


              IP属地:四川7楼2022-12-14 17:23
              回复
                VCount and Timer0
                这两个参数运算后的值存储在 message[5]。VCount 左移 16 位后与 Timer0 按位或,然后将此结果按字节进行逆置。


                IP属地:四川8楼2022-12-14 17:25
                回复
                  MAC Address and Soft Reset
                  这两个参数运算后的值存储在 message[6]。取 MAC 地址的低 16 位。如果游戏是软重置,则与 0x01000000 按位异或。


                  IP属地:四川9楼2022-12-14 17:26
                  回复
                    MAC Address, VFrame, and GxStat
                    这三个参数运算后的值存储在 message[7]。VFrame 左移 24 位后与 GxStat 按位异或。然后再与右移 16 位后的 MAC 地址按位异或。


                    IP属地:四川11楼2022-12-14 17:27
                    回复
                      Date
                      该参数运算后的值存储在 message[8]。将当前年份减去 2000 后的 BCD 左移 24 位,与当前月份的 BCD 左移 16 位进行按位或,然后与当前天数的 BCD 左移 8 位进行按位或,最后与星期几进行按位或。( 不了解 BCD 的自己去百度 )
                      星期对应的值如下:
                      Monday: 1
                      Tuesday: 2
                      Wednesday: 3
                      Thursday: 4
                      Friday: 5
                      Saturday: 6
                      Sunday: 7


                      IP属地:四川12楼2022-12-14 17:30
                      回复
                        Time and DS Type
                        这两个参数运算后的值存储在 message[9]。将小时、分钟和秒这三个值转换为 BCD。如果当前小时大于等于 12 且 DS 类型不是 3DS,则将小时 BCD 加上 0x40。运算后的小时 BCD 左移 24 位,分钟 BCD 左移 16 位,秒 BCD 左移 8 位。最后将这三个值按位或。


                        IP属地:四川13楼2022-12-14 17:31
                        回复
                          message[10] 与 message[11] 未使用,值为 0。


                          IP属地:四川14楼2022-12-14 17:32
                          回复
                            Keypresses
                            该参数运算后的值存储在 message[12]。基础值为 0xFF2F0000,每按下一个键,将这个基础值减去一个特定的数字,如下。
                            R: 0x10000
                            L: 0x20000
                            X: 0x40000
                            Y: 0x80000
                            A: 0x1000000
                            B: 0x2000000
                            Select: 0x4000000
                            Start: 0x8000000
                            Right: 0x10000000
                            Left: 0x20000000
                            Up: 0x40000000
                            Down: 0x80000000


                            IP属地:四川15楼2022-12-14 17:33
                            回复
                              至此参数已经添加完毕,但这13 个值总长 416 位,距离 SHA-1 运算标准的 512 位相去甚远,我们此时需要补位。message 的其余部分应符合 SHA-1 标准,用 1 标记结束,其余部分用 0 填充,并将 message 的大小放在末尾。


                              IP属地:四川16楼2022-12-14 17:40
                              回复