Алгоритм шифрования скрипта в Mob файлах.
#1
Сегодня мы решили опубликовать алгоритм шифрования скрипта в .MOB файлах.

Вы можете загрузить исходные коды этого алгоритма, на языке C++ и Delphi из раздела: файлы.
-> Файлы -> Tools -> Mod -> Mob Crypt
Ответ
#2
А что такое алгоритное шифрования (не щетайте меня диб <_< <_< илом)
просто не понел Blush
СОНАТА (итал. sonata, от sonare — звучать), музыкальный жанр, произведение для одного или нескольких инструментов, написанное в форме сонатного цикла.



Ответ
#3
Есть такие файлы в пз, называются мобы. Так вот именно в них прописывается скрипт, отвечающий за квест. Этот скрипт по умолчанию зашифрован, зашифрован нивальским алгоритмом. Как им воспользоваться? Тут уж я не помошник точно. Алгоритм будет давать пользу только тем, кто имеет представление как им пользоваться Rolleyes . Но это лично мое мнение.
"{}•••®/A//P][R[$®•••{}"
Ответ
#4
Это и есть функция расшифровывающая/зашифровывающая (симметричный) скрипты в мобах... и понять его совсем не сложно...
SURREAL
Ответ
#5
Угу, все интуитивно понятно...
Say it once, say it twice,
Take a chance and roll the dice...
Ответ
#6
И всё-таки что-то народное мнение значит Smile
Эх,будем разбираться Smile
Петька:Дуб ты,Василий Иванович!
Чапаев:Да,Петька,я могуч!
Ответ
#7
Вроде почти все понятно, только один вопросик, там тип PBYTEArray это массив байтов, типа если на VB, то Dim A() as Byte и вместо переменной buf использовать A?
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#8
И еще... Откуда берется dwKey?
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#9
из моба: <заголовок скрипта (ACCEECCB)><длина скрипта><Ключ скрипта (тот самый dwKey)><сам скрипт>
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#10
Цитата:Dim A() as Byte и вместо переменной buf использовать A?

Думаю так выйдет...
SURREAL
Ответ
#11
и еще меня смущает вот эта строка
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)"
Ответ
#12
Все правильно shl (<<) , shr (>>) сдвиг влево и вправо соотвественно. Даже не верится что этого нет в VB.

Никакого перенолнения не происходит...
SURREAL
Ответ
#13
Кстати, вместо shl, shr, << и >> можно использовать деление и умножение, таким образом можно значительно упростить функцию. Big Grin
Я думаю, что Нивал их и использовал у себя в алгоритме, мы ведь эту функцию восстанавливали из 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
Ответ
#14
вот я и пытаюсь перевести это на ВБ, но пока не очень получается
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#15
На VB можно забить, там нету беззнаковых типов...
SURREAL
Ответ
#16
Зато есть double, в котором можно хранить без знаковое целое, и в ручную обрабатывать переполнение.
Так что возможности есть, вот для того, чтобы это реализовать нужно опыт иметь, так с лету не получится. Sad
Может у нас на форуме найдутся профи, которым это под силу?
Ответ
#17
я возможно реализую все это на ВБ, но я не все понимаю в этих функциях, т.к. си я не знаю совершенно, поэтому возникают некоторые вопросы, вот например строчка buf[i] ^= (BYTE)(dwKey / 65536 % 256); , я так и не понял что означеат (BYTE) , а % в си обозначают остотак от деления или целочисленное деление? А с C# этот знак ^ обзоначает возведение в степень или xor или чтото еще?
Jet давай с тобой в аське свяжемся и там все обсудим?
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#18
(BYTE) - пеиведение к типу байт
% - остаток от деления, это для того чтобы небыло переполнения
^ - означает XOR
У меня аська не установлена, если можно, то лучше по MSN или IRC
irc.mastak.ru #gipat или выходи в чат сайта
Ответ
#19
А вот и на 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)"
Ответ
#20
А как можно определить зашифрованный скрипт или нет? Вот например Zone20.mob. Там после CAECCEAC идет только размер, и сразу незашифрованный скрипт.
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 4 Гость(ей)