Реферат: Арифметика на службе защиты
add al,30h
stosb ; Формирует как раз "594971900000..."
pop cx
loop ...
Честно говоря, я выдрал ее ;) Я выдрал ее из экзешника, выдрал и отладил, научился подавать на вход по 8-мь байт в ds:si и получать вот такие вот "числа". Вот какие данные получает эта процедура, и вот что она выдает всякий раз, когда рассчитывает пароль (всего ~32 раза):
ds:si -> 0,0,0, 0,86,58,31,41 result="1136774000..."
ds:si -> 0,0,0,80,DF,67,40,41 result="2150335000..."
ds:si -> 0,0,0,80,9F,45,4D,41 result="3836735000..."
...
ds:si -> 0,0,0,C0,41,55,52,41 result="4805895000..."
ds:si -> 0,0,0,C0,45,B2,56,41 result="5949719000..."
Я думал, что нашел ключевой код, который итерациями формирует пароль! Когда имеешь дело с криптографией, привыкаешь, что сдвиги да and-ы в огромных количествах просто так не встречаются. Первое число как-то получается из INN и Код'а - слепляется по-хитрому или что-то вроде того, думал я.
Ищу уже ссылки на парметр, передаваемый этой процедуре (в ds:si). Искал сначала внимательно, потом не очень, потом просто тупо переписывал адреса буферов (опять очень много копирований). Но все же я не прошел мимо вот этих двух процедур:
fld real8 ptr [bp+6]
fmul real8 ptr [bp+0E]
fstp real8 ptr ds:[...]
и:
fld real8 ptr [bp+6]
fadd real8 ptr [bp+0E]
fstp real8 ptr ds:[...]
Причем эти процедуры вызываются кратное число раз коду, формирующему эти длинные числа. Уже теплее. Смотрю, что делают эти парни. И вижу, что при очередном вызове, после fadd, сопроцессор выгружает те самые входные байты, которые подаются на вход процедуре создания длинных чисел... Это была просто процедура форматирования real-чисел!
Мда... Вот что значит быть избалованным сопроцессором. Если бы не эта прога, то так бы и не узнал, как выглядят числа в формате с плавающей точкой.
Теперь уже внимательнее смотрю, что же мы там умножаем и делим. Оказывается, циклически вызывается по два умножения, затем - сложение. А вот что умножается и складывается:
Шаг
1. 1x1 = 1 1x2401 = 2401 1+2401 = 2402
2. 2x2 = 4 4x2500 = 10000 2402+10000 = 12402
3. 3x3 = 9 9x2601 = 23409 23409+15986 = 35811
4. 4x4 = 16 16x2704 = 43264 43264+35811 = 79075
...