Перейти к содержанию
  • записей
    98
  • комментариев
    109
  • просмотра
    6384

[Skyrim] Как генерировать уникальную отмычку, чтобы стражники Вайтрана не прострелили колено

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

88 просмотров

Статья должна была выйти вместе с видео, но мне лень было её писать.

 

В прошлом видео я показывал, как это работает и настало время для того, чтобы рассказать, как это делалось. Да можно было писать свое значение на прямую в значение разблокировки замка, но это скучно и вообще какой-то дет.сад.

 

 

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

 

Рассмотрим код, хотя в нем особо комментировать нечего, я разделил его на блоки, чтобы проще воспринимались стадии работы алгоритма.

 

Спойлер

def GenerateRandomValue(link, max):
    if *(link + 0x9C8):
        seed = time64(arg0)
        link = &QWord_7FF6A0CEED70
        link4 = link + 4
        *(link + 4) = max
        link8 = link + 8
        idx = 1
        do
        {
            link8 += 4
            v6 = *link4 >> 30
            ++link4
            new_seed = idx++ + v6
            *(link4) = 0x6C078965 * (*(link4 - 1) ^ new_seed)
        }
        while ( idx < 0x270 )
        *(link + 0x9C4) = 0x26F
        srand(max)
        *(link + 0x9C8) = 1
##########################################################################
    if !*(link + 0x9C4):
        if *(link + 0x9C4) == 0x271:        
            seed = GetTickCount()
            s_link4 = (link + 4)
            *(link + 4) = seed
            link8 = (link + 8)
            idx = 0
            link4 = (link + 4)
            link8 = (link + 8)
            do
            {
            v6 = (*link4 & 1) + (*link8 % 0x270 & 0x7FFFFFFF)
            result = (idx + 0x18D) % 0x270
            v8 = 2 * v6 ^ *(link + 4 * result + 4)
            *link4 = v8
            if ( v6 & 1 )
            	*link4 = v8 ^ 0x9908B0DF
            ++idx
            ++link8
            ++link4
            }
            while ( idx < 0x270 )
            *(link + 0x9C4) = 0
##########################################################################
  tickcount_based_seed = *(link + 0x9C4)
  new_seed = (tickcount_based_seed + 1) % 0x270
  LODWORD(tickcount_based_seed) = *(link4 * tickcount_based_seed + 4)
  *(link + 0x9C4) = new_seed
  tmp = ((((tickcount_based_rng >> 0xB) ^ tickcount_based_rng) & 0xFF3A58AD) << 7) ^ (tickcount_based_rng >> 0xB) ^ tickcount_based_rng
  new_rng_V = ((((tmp & 0xFFFFDF8C) << 15) ^ tmp) >> 18) ^ ((tmp & 0xFFFFDF8C) << 15) ^ tmp
  if (max + 1) & 0xFFFF7FFF:
    result = new_rng_V % max
  else
    result = max & new_rng_V
  return result

 

 

Дальше можно в ручную уже посчитать текущее значение для открытия замка:
 

v5 = 9.615000725f * 0.5; // 4.8075003625
v6 = v5 - 90.f; // -85.1924996375
v7 = 90.f - v5; // 85.1924996375
link = &qword_7FF6A0CEED70

LockPick->unlock_Value = (		v7 - v6		) * (GenerateRandomValue(link, 0xFFFFFFFF) * 2.328306437E-10) + v6;
LockPick->unlock_Value =	170.38	          *	 (0xAE504DB6    * 2.328306437E-10)                        + -85.1924996375
LockPick->unlock_Value =    170.38            *  (2924498432.00 * 2.328306437E-10)                        + -85.1924996375
LockPick->unlock_Value =    170.38            *  (0.68)                                                   + -85.1924996375
LockPick->unlock_Value =    30.82	

И проверяем в отладчике:

 

Background.thumb.png.a1abef83ca2b3cde67a176a13bd7ba4d.png

 

Генератор отмычек готов.

 

 

 

  • Понравилось 1
Авторизация  


0 Комментариев


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

Комментариев нет

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

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

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

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

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

Войти

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

Войти
×

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

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