Сообщений: 1,100
Тем: 157
Зарегистрирован: Feb 2002
19.02.2004, 00:31
(Сообщение последний раз редактировалось: 19.02.2004, 00:38 Jet.)
Сегодня мы решили опубликовать алгоритм шифрования скрипта в .MOB файлах.
Вы можете загрузить исходные коды этого алгоритма, на языке C++ и Delphi из раздела: файлы.
-> Файлы -> Tools -> Mod -> Mob Crypt
Сообщений: 6
Тем: 1
Зарегистрирован: Feb 2004
А что такое алгоритное шифрования (не щетайте меня диб <_< <_< илом)
просто не понел
СОНАТА (итал. sonata, от sonare — звучать), музыкальный жанр, произведение для одного или нескольких инструментов, написанное в форме сонатного цикла.
Сообщений: 677
Тем: 16
Зарегистрирован: Dec 2002
Есть такие файлы в пз, называются мобы. Так вот именно в них прописывается скрипт, отвечающий за квест. Этот скрипт по умолчанию зашифрован, зашифрован нивальским алгоритмом. Как им воспользоваться? Тут уж я не помошник точно. Алгоритм будет давать пользу только тем, кто имеет представление как им пользоваться . Но это лично мое мнение.
"{}•••®/A//P][R[$®•••{}"
Сообщений: 1,050
Тем: 18
Зарегистрирован: Mar 2002
Это и есть функция расшифровывающая/зашифровывающая (симметричный) скрипты в мобах... и понять его совсем не сложно...
SURREAL
Сообщений: 563
Тем: 17
Зарегистрирован: Oct 2003
Угу, все интуитивно понятно...
Say it once, say it twice,
Take a chance and roll the dice...
Сообщений: 613
Тем: 21
Зарегистрирован: Jun 2003
И всё-таки что-то народное мнение значит
Эх,будем разбираться
Петька:Дуб ты,Василий Иванович!
Чапаев:Да,Петька,я могуч!
Сообщений: 214
Тем: 5
Зарегистрирован: Mar 2003
Вроде почти все понятно, только один вопросик, там тип PBYTEArray это массив байтов, типа если на VB, то Dim A() as Byte и вместо переменной buf использовать A?
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Сообщений: 214
Тем: 5
Зарегистрирован: Mar 2003
И еще... Откуда берется dwKey?
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Сообщений: 492
Тем: 22
Зарегистрирован: Sep 2002
из моба: <заголовок скрипта (ACCEECCB)><длина скрипта><Ключ скрипта (тот самый dwKey)><сам скрипт>
Duty is everything, the greatest of joys, the deepest of sorrows.
Сообщений: 1,050
Тем: 18
Зарегистрирован: Mar 2002
Цитата:Dim A() as Byte и вместо переменной buf использовать A?
Думаю так выйдет...
SURREAL
Сообщений: 214
Тем: 5
Зарегистрирован: Mar 2003
21.02.2004, 00:06
(Сообщение последний раз редактировалось: 21.02.2004, 00:08 CAHEK7.)
и еще меня смущает вот эта строка
buf[i]:= buf[i] xor dwTmpKey;
Если buf это массив byte, a TmpKey это DWORD, то при операции Xor в итоге должен получиться тип больше чим Byte, если TmpKey будет больше 255, а соответственно должно получиться или не совпадение типов или переполнение.
И еще: в VB вроде нет функций Shl и Shr, поэтому пришлось их создавать... Как я понял эти функции делают сдвиг на несколько бит, например 5 (00000101) Shl 2 даст в итоге 20 (00010100), а 5 (00000101) Shr 2 даст 1 (00000001). Вопрос в том, правильно ли я думаю...
P.S. К сожалению я не могу проверить этот код ни на Дельфи, ни на Си поэтому возникают такие вопросы...
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Сообщений: 1,050
Тем: 18
Зарегистрирован: Mar 2002
Все правильно shl (<<) , shr (>>) сдвиг влево и вправо соотвественно. Даже не верится что этого нет в VB.
Никакого перенолнения не происходит...
SURREAL
Сообщений: 1,100
Тем: 157
Зарегистрирован: Feb 2002
21.02.2004, 17:57
(Сообщение последний раз редактировалось: 21.02.2004, 18:55 Jet.)
Кстати, вместо shl, shr, << и >> можно использовать деление и умножение, таким образом можно значительно упростить функцию.
Я думаю, что Нивал их и использовал у себя в алгоритме, мы ведь эту функцию восстанавливали из Assembler'а.
Думаю в C++ исходниках Нивала алгоритм имел такой вид:
Код: PBYTE cryptScript( PBYTE buf, DWORD dwKey, DWORD dwSize)
{
for(DWORD i=0;i<dwSize;i++)
{
dwKey = dwKey * 214013 + 2531011;
buf[i] ^= (BYTE)(dwKey / 65536 % 256);
}
return buf;
}
А это, код на C#:
Код: public string ReadCodedString()
{
byte[] coded = new byte[DataSize - 4]; // sizeof(coded string) - sizeof(key)
char[] decoded = new char[coded.Length];
uint uKey;
// Read
uKey = orStream.ReadUInt32(); // KEY
coded = orStream.ReadBytes(coded.Length); // Coded string
// Decode string
for(int i = 0; i < coded.Length; i++)
{
uKey = uKey * 214013 + 2531011;
decoded[i] = Convert.ToChar(coded[i] ^ Convert.ToByte(uKey / 65536 % 256));
}
return new string(decoded, 0, decoded.Length );
}
Если кто может перевести этот код на Delphi и VB
Сообщений: 214
Тем: 5
Зарегистрирован: Mar 2003
вот я и пытаюсь перевести это на ВБ, но пока не очень получается
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Сообщений: 1,050
Тем: 18
Зарегистрирован: Mar 2002
На VB можно забить, там нету беззнаковых типов...
SURREAL
Сообщений: 1,100
Тем: 157
Зарегистрирован: Feb 2002
Зато есть double, в котором можно хранить без знаковое целое, и в ручную обрабатывать переполнение.
Так что возможности есть, вот для того, чтобы это реализовать нужно опыт иметь, так с лету не получится.
Может у нас на форуме найдутся профи, которым это под силу?
Сообщений: 214
Тем: 5
Зарегистрирован: Mar 2003
я возможно реализую все это на ВБ, но я не все понимаю в этих функциях, т.к. си я не знаю совершенно, поэтому возникают некоторые вопросы, вот например строчка buf[i] ^= (BYTE)(dwKey / 65536 % 256); , я так и не понял что означеат (BYTE) , а % в си обозначают остотак от деления или целочисленное деление? А с C# этот знак ^ обзоначает возведение в степень или xor или чтото еще?
Jet давай с тобой в аське свяжемся и там все обсудим?
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Сообщений: 1,100
Тем: 157
Зарегистрирован: Feb 2002
(BYTE) - пеиведение к типу байт
% - остаток от деления, это для того чтобы небыло переполнения
^ - означает XOR
У меня аська не установлена, если можно, то лучше по MSN или IRC
irc.mastak.ru #gipat или выходи в чат сайта
Сообщений: 214
Тем: 5
Зарегистрирован: Mar 2003
22.02.2004, 02:16
(Сообщение последний раз редактировалось: 22.02.2004, 02:57 CAHEK7.)
А вот и на VB:
Код: Public Sub ScriptCrypt(ByRef Script() As Byte, ByVal Key As Long)
Dim Tmp As Double
Dim i As Long
Dim TmpLng As Long
Tmp = Key
For i = 0 To UBound(Script)
Tmp = Tmp * 214013 + 2531011
'-------------------------------------------------
Do While Tmp > 2199023255552#
Tmp = Tmp - 2199023255552#
Loop
Do While Tmp > 274877906944#
Tmp = Tmp - 274877906944#
Loop
Do While Tmp > 34359738368#
Tmp = Tmp - 34359738368#
Loop
Do While Tmp > 4294967296#
Tmp = Tmp - 4294967296#
Loop
' Это все приведение Double к DWORD
' экспериментируюя с количиством циклов
' и со значениями можно добиться большего быстродействия
'-------------------------------------------------
TmpLng = CLng(Int(Tmp / 65536))
TmpLng = TmpLng Mod 256
Script(i) = Script(i) Xor CByte(TmpLng)
Next
End Sub
проверил быстродействие: около 20 - 50 ms (миллисекунд) на 7 кб скрипта
Спасибо Jet'у помог очень...
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Сообщений: 214
Тем: 5
Зарегистрирован: Mar 2003
А как можно определить зашифрованный скрипт или нет? Вот например Zone20.mob. Там после CAECCEAC идет только размер, и сразу незашифрованный скрипт.
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
|