Перейти к содержанию
  • запись
    101
  • комментариев
    110
  • просмотров
    6 597

[Raft] Генерация кодов локаций

Авторизация  
partoftheworlD

147 просмотров

С недавним обновлением Raft в игре изменили радар, теперь необходимо ввести код из 4-х цифр, который является частотой, чтобы радар показал координаты, найти массив с координатами и кодами слишком просто, и поэтому мы будем генерировать коды без какого-либо воздействия на память игры. Открыв dnSpy необходимо найти участок кода, отвечающий за генерацию частот.

1.thumb.png.f02d8d9bf9f94e838f353b290998a997.png

 

Восстановив код и запустив для проверки, обнаружились некоторые проблемы:

1.       Cид используется 1 раз при создании нового мира.

2.       Частота состоит из 4 цифр, из-за чего очень много сидов будет подходить под значение первой частоты, которая дается в начале игры, поэтому придется брутить и генерировать все возможные частоты для 2-4 локаций.

 

Спойлер

#!/usr/bin/python3
seeds = [0x0, 0x0, 0x0, 0x0]
seed_array = []

def generate_seeds(seed):
    seeds[0] = seed
    v0 = 0x6C078965 * seed + 1
    seeds[1] = v0
    v1 = 0x6C078965 * v0 + 1
    seeds[2] = v1
    seeds[3] = v1
    return seeds

def rng_unity(min, max):
    if max <= min:
        if max < min:
            low_part = seeds[3]
            v0 = seeds[0] ^ (seeds[0] << 11)
            seeds[0] = seeds[1]
            seeds[1] = seeds[2]
            seeds[2] = low_part
            v1 = v0 ^ low_part ^ ((v0 ^ (low_part >> 11)) >> 8)
            seeds[3] = v1
            return min - v1 % (min - max)
    else:
        v0 = seeds[0] ^ (seeds[0] << 11)
        seeds[0] = seeds[1]
        seeds[1] = seeds[2]
        v1 = seeds[3]
        seeds[2] = v1
        seeds[3] = v0 ^ v1 ^ ((v0 ^ (v1 >> 8)) >> 8)
        return ((v0 ^ (v1 ^ ((v0 ^ (v1 >> 11)) >> 8))) % (max - min)) + min

def find_seed():
    password = '9839'
    for s in range(0,1000000000):
        seeds = [0x0, 0x0, 0x0, 0x0]
        generated_password = ''
        seeds = generate_seeds(s)
        for _ in range(4):
            generated_password += str(rng_unity(0,10))
        if password == generated_password:
            generate_codes(s)

def generate_codes(seed):
    codes = []
    seeds = [0x0, 0x0, 0x0, 0x0]
    for _ in range(4):
        seeds = generate_seeds(s)
        generated_password = ''
        for _ in range(4):
            generated_password += str(rng_unity(0,10))
        codes.append(generated_password)        
    print("-"*30)
    for i in codes:
        print(i)

if __name__ == '__main__':
	find_seed()

 

 

На генерацию сидов ушло порядка 30 минут, 90000+ возможных сидов и лишь 1 правильный набор кодов.  Занятие было бессмысленным, но это был отличный способ занять вечер.

 

Seed: 1276855
------------------------------
9839
1106
5814
8084
------------------------------

image.png.e3298ef672678f6d6c7fcac25530d93c.png

  • Плюс 2
Авторизация  


1 Комментарий


Рекомендуемые комментарии

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.