Город Джунов
Алгоритм шифрования скрипта в Mob файлах. - Версия для печати

+- Город Джунов (https://www.gipat.ru/forum)
+-- Форум Обсуждение Проклятых Земель (https://www.gipat.ru/forum/forum-19.html)
+--- Форум Новости (https://www.gipat.ru/forum/forum-15.html)
+--- Темы: Алгоритм шифрования скрипта в Mob файлах. (/thread-1810.html)

Страницы: 1 2


Алгоритм шифрования скрипта в Mob файлах. - Jet - 19.02.2004

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

Вы можете загрузить исходные коды этого алгоритма, на языке C++ и Delphi из раздела: файлы.
-> Файлы -> Tools -> Mod -> Mob Crypt


Алгоритм шифрования скрипта в Mob файлах. - Slother - 19.02.2004

А что такое алгоритное шифрования (не щетайте меня диб <_< <_< илом)
просто не понел Blush


Алгоритм шифрования скрипта в Mob файлах. - Mephisto - 19.02.2004

Есть такие файлы в пз, называются мобы. Так вот именно в них прописывается скрипт, отвечающий за квест. Этот скрипт по умолчанию зашифрован, зашифрован нивальским алгоритмом. Как им воспользоваться? Тут уж я не помошник точно. Алгоритм будет давать пользу только тем, кто имеет представление как им пользоваться Rolleyes . Но это лично мое мнение.


Алгоритм шифрования скрипта в Mob файлах. - heller - 19.02.2004

Это и есть функция расшифровывающая/зашифровывающая (симметричный) скрипты в мобах... и понять его совсем не сложно...


Алгоритм шифрования скрипта в Mob файлах. - Talarasha - 19.02.2004

Угу, все интуитивно понятно...


Алгоритм шифрования скрипта в Mob файлах. - Александр - 19.02.2004

И всё-таки что-то народное мнение значит Smile
Эх,будем разбираться Smile


Алгоритм шифрования скрипта в Mob файлах. - CAHEK7 - 19.02.2004

Вроде почти все понятно, только один вопросик, там тип PBYTEArray это массив байтов, типа если на VB, то Dim A() as Byte и вместо переменной buf использовать A?


Алгоритм шифрования скрипта в Mob файлах. - CAHEK7 - 19.02.2004

И еще... Откуда берется dwKey?


Алгоритм шифрования скрипта в Mob файлах. - ALtair - 19.02.2004

из моба: <заголовок скрипта (ACCEECCB)><длина скрипта><Ключ скрипта (тот самый dwKey)><сам скрипт>


Алгоритм шифрования скрипта в Mob файлах. - heller - 20.02.2004

Цитата:Dim A() as Byte и вместо переменной buf использовать A?

Думаю так выйдет...


Алгоритм шифрования скрипта в Mob файлах. - CAHEK7 - 21.02.2004

и еще меня смущает вот эта строка
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. К сожалению я не могу проверить этот код ни на Дельфи, ни на Си поэтому возникают такие вопросы...


Алгоритм шифрования скрипта в Mob файлах. - heller - 21.02.2004

Все правильно shl (<<) , shr (>>) сдвиг влево и вправо соотвественно. Даже не верится что этого нет в VB.

Никакого перенолнения не происходит...


Алгоритм шифрования скрипта в Mob файлах. - Jet - 21.02.2004

Кстати, вместо 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


Алгоритм шифрования скрипта в Mob файлах. - CAHEK7 - 21.02.2004

вот я и пытаюсь перевести это на ВБ, но пока не очень получается


Алгоритм шифрования скрипта в Mob файлах. - heller - 21.02.2004

На VB можно забить, там нету беззнаковых типов...


Алгоритм шифрования скрипта в Mob файлах. - Jet - 21.02.2004

Зато есть double, в котором можно хранить без знаковое целое, и в ручную обрабатывать переполнение.
Так что возможности есть, вот для того, чтобы это реализовать нужно опыт иметь, так с лету не получится. Sad
Может у нас на форуме найдутся профи, которым это под силу?


Алгоритм шифрования скрипта в Mob файлах. - CAHEK7 - 22.02.2004

я возможно реализую все это на ВБ, но я не все понимаю в этих функциях, т.к. си я не знаю совершенно, поэтому возникают некоторые вопросы, вот например строчка buf[i] ^= (BYTE)(dwKey / 65536 % 256); , я так и не понял что означеат (BYTE) , а % в си обозначают остотак от деления или целочисленное деление? А с C# этот знак ^ обзоначает возведение в степень или xor или чтото еще?
Jet давай с тобой в аське свяжемся и там все обсудим?


Алгоритм шифрования скрипта в Mob файлах. - Jet - 22.02.2004

(BYTE) - пеиведение к типу байт
% - остаток от деления, это для того чтобы небыло переполнения
^ - означает XOR
У меня аська не установлена, если можно, то лучше по MSN или IRC
irc.mastak.ru #gipat или выходи в чат сайта


Алгоритм шифрования скрипта в Mob файлах. - CAHEK7 - 22.02.2004

А вот и на 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'у помог очень...


Алгоритм шифрования скрипта в Mob файлах. - CAHEK7 - 22.02.2004

А как можно определить зашифрованный скрипт или нет? Вот например Zone20.mob. Там после CAECCEAC идет только размер, и сразу незашифрованный скрипт.