Нужна помощь в реверсе алго. Есть выражение v18 := 5257 * ((67108865 * v17) mod $3FFFC); Как получить V17? Чем-то мне напомнило рса, но пока не проверял эту мысль.
Во-первых, 67108865 делится на 262140 вполне себе с остатком. Во-вторых, полагаю, что текущая форма записи не полная, ибо как минимум умножение тоже происходит по модулю. В-третьих, расширенный алгоритм Евклида вполне должен это решать.
Ранг: 241.9 (наставник), 107thx Активность: 0.14↘0.01 Статус: Участник
Создано: 25 августа 2011 10:24 · Поправил: Nightshade · Личное сообщение · #7
Ненавижу флудерастов вроде промикса. Вообщем (x * 67108865)mod $3FFFC =y x=y-$800 такая бодяга получается. Видно мы что-то не проходили про mod... Мля меня похакал виндозный калькулятор-он не показывает остаток в программерском виде
У вас умножение происходит в кольце. В кольце нет операции деления, есть понятие обратного элемента и умножения на него. И ищется он через РАЕ, про который я выше написал. Забудьте про деление.
Ранг: 52.1 (постоянный), 1thx Активность: 0.02↘0 Статус: Участник
Создано: 25 августа 2011 15:03 · Поправил: Wyfinger · Личное сообщение · #19
Никакой формулы-решения не может быть, это алгоритм. Обратите внимание. Ваша задача - решение сравнений (67108865 * v17) mod $3FFFC Кроме этого заметьте, что 67108865 > $3FFFC, поэтому сократим 67108865 до 1025 (1025 = 67108865 mod $3FFFC). Задача - найти x в выражении (1025 * x) mod $3FFFC О решении задачи можно почитать в разделе Решение сравнений на Википедии.
(x*4000000 +x) mod (40000-4)=y нельзя это разложить как-то красиво? Может компилятор оптимизировал операции? Заметил что последний байт х и у всегда одиннаковый. изначально х из 2 байт call _rand_0 movzx eax, ax mov [ebp+var_14], eax
Поскольку сервер это расшифровывает -формула решение есть Заморочил ты всем голову. Нет решения для той функции, для которой ты привел код. Поделив на 1489 получим остаток, который должен получится из 32-битного слова при делении на 0x3FFFC Очевидно, что получаем неоднозначное соответствие. Но это я потом сообразил. Сначала пытался получить формулу . Поняв, что не получится, вбил команды в Олли и стал гонять. А формула для остатка ПРОСТАЯ!!! Для диапазона v17=0-0x3FFFB такая : (v17%0x40)*0x400+v17 Если обозначить остаток через О, то v17=O-(O%0x40)*0x400 Надо только учесть, что O не попадает в диапазоны 1-3FF и некоторые другие. Для больших чисел можно легко посчитать коллизию. 50E221 и A271 -> остаток 16671 и т.д. Вот так!!! Надо будет прогнать все числа и посмотреть точнее, что там получается.
Archer совершенно прав, необходимо найти обратное по модулю число. Так как используется только 32 бита, то имеем выражение X = (67108865 * v17) % 2**32 Надо найти число обратное по модулю (Modular multiplicative inverse) константе 67108865 A = 67108865 % 2**32 A * A**(-1) = (67108865 * A**(-1)) % 2**32 1 = (67108865 * A**(-1)) % 2**32 Используем расширенный алгоритм Евклида (а можно через сайт wolfram.com) найдем его: A**(-1) = 4227858433 Проверка - (4227858433 * 67108865) % 2*32 = 1
Теперь кодируем так X = (67108865 * v17) % 2**32 а раскодируем так v17 = (4227858433 * X) % 2**32
Fedonin Это все здорово. Но для байтов по моей формуле быстрее и проще. Только вряд ли там каждый байт кодируется 4-мя. Ну правда можно кодировать 2 байта и даже почти 18 бит, только ТС не сказал про разрядность. Говорил только про 32 бита. А где?
Я не понимаю, чем вам моя формула не нравится? А именно v17=(((v18/(5257*5))*35293) mod 0x3FFFC)+(k*0x3FFFC/5) mod 0x3FFFC, где k=0,1,2,3,4. Если кодируются небольшие числа (символы), то берём k=0. Если хотите, сейчас напишу решение.
Пусть х=v18/5257, y=v17. Получается: x=67108865*y mod $3FFFC x=1025*y mod 262140 Т.к. НОД(1025,262140)=5, то обратного элемента к 1025 по модулю 262140 не существует => данное сравнение имеет решения тогда и только тогда, когда х делится на НОД(1025,262140)=5 Количество решений по модулю 262140 равно 5.Тогда, x=1025*y mod 262140 => х/5=205*y mod 52428 Обратный элемент к 205 по модулю 52428 равен 35293, тогда 35293*x/5=35293*205*y mod 52428 y=35293*x/5 mod 52428 - частное решение v17=(((v18/(5257*5))*35293) mod 52428)+(k*52428) mod 0x3FFFC, где k=0,1,2,3,4 - общее решение
Promix_17 Твоя формула не дает нужный результат. Формула Тундры на 2 тестовых значениях выдала нужный результат. Не знаю насколько она правильна, но факт остается таким. Формулу Fedonin не пробовал. tundra37 спасибо. Если будут еще умные мысли - пишите. Пока топ закрывать не буду, поскольку плохо знаю вышку и мало ли в формуле есть ошибка.