> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00100/00400/00081.-zashita-skriptov-snyatie-slaboi-zashity.md).

# 00081. Защита скриптов, снятие слабой защиты

Защита скриптов, снятие слабой защиты|В этом уроке мы рассмотрим защиту скриптов.|wmysterio|wmysterio||||Всем привет! Так или иначе нельзя быть уверенным в том, что защищенный скрипт никто не откроет. В этом уроке мы рассмотрим способы защиты ваших скриптов от хитрых пользователей, которые постоянно заливают скрипт под своим авторством. Я далеко не спец по защитам, поэтому урок выйдет кратким.

Существует три способа защиты: слабая, средняя и сильная. Слабая защита являет собой переименование названия потока на какой-нибудь опкод или класс. При открытии такого скрипта дальнейшая компиляция будет невозможна, так как компилятор сообщит об ошибке, что такого опкода не найдено и в этом духе. Средняя защита, как правило, хранит информацию в hex-кодах.

При попытке компиляции/декомпиляции Санник сообщает об ошибкак, таких как "метка X не найдена" или скрипт не будет похож на себя, тоесть в место привычных опкодов Санник напишет кучу символов и цифр или вообще какие то иероглифы. Компилировать такой код можно, но любое его изменение приводит к какой то ошибке, в т.ч. к зависанию игры. Сильная защита не позволит Саннику открыть скрипт. Пойдёт декомпиляция, но никакого результата не будет, то есть либо Sanny Builder зависнет, либо откроет пустой скрипт.

Перейдём к слабой защите. Для начала напишем простой скрипт:

```
{$CLEO}
0000:
thread 'MyThread '

while true
 if
 0AB0: key_pressed 49 // 1
 then
 Player.Money($PLAYER_CHAR) += 100
 end
wait 0
end
```

С виду всё понятно. Нажимаем 1 - дают 100 баксов. Этот скрипт можно свободно открыть и отредактировать. Теперь давайте сделаем простую замену имени потока. Скопируем выражение "Player.Money", и вставим в название потока, то есть в "thread". Должно быть так:

```
{$CLEO}
0000:
thread 'Player.Money'

while true
 if
 0AB0: key_pressed 49 // 1
 then
 Player.Money($PLAYER_CHAR) += 100
 end
wait 0
end
```

Нажимаем кнопку компиляции и видим, что никаких ошибок не возникает. Запускаем игру, и видим, что никаких аномалий не произошло. Давайте закроем Sanny Builder и попробуем им открыть созданный нами скрипт. Вы увидите эту бадягу:

```
{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP 
thread 'PLAYER.MONEY' 

:PLAYER.MONEY_21
if 
0AB0: key_pressed 49 
else_jump @PLAYER.MONEY_43 
Player.Money($PLAYER_CHAR) += 100

:PLAYER.MONEY_43
wait 0 
jump @PLAYER.MONEY_21
```

Нажимает "Компилировать" и... ОБЛОМ! Компилятор пишет "Неверный символ в идентификаторе PLAYER.MONEY\_21".

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/40549587.png)

Многие из Вас подумали, что этот скрипт не составит труда переделать, заменив все метки на правильные. Это правильный подход, но всё же это маленький скрипт. А представьте, что код скрипта состоит из 1000 строк. Будете все метки переименовать на нужные? Это тоже правильный подход, однако вручную всё это делать - безумие. Если вы вручную переделали такой скрипт - то вы один из самых безумных людей, которых я знаю :) Мы будем подменивать метки на нужные, однако будем использовать функцию замены. Весь процесс пройдёт как минимум в два этапа:

* замена всех имен меток;
* замена всех прыжков на метки;
* возможно нужно будет заменять и другие потоки, если какой то чел заменит все метки из main.scm на классы;

Начнём с первого этапа. Копируем название потока ( **thread** ). Далее нажимаем горячие клавиши CTRL`+<kbd>R` и в поле "Искать" вставляем скопированный текст, поставив знак "**:**" перед текстом. Если этого не сделать, то все классы переименуются, а этого нам ненужно. В поле "Заменить на:" пишем название потока. В моём случаи поток и все его метки будут иметь название "MONEY", и так же обязательно добавим знак "**:**". Нажимаем "Ок". При нахождении совпадения нажимаем кнопку "Да для всех", чтобы не нажимать каждый раз "Далее".

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/1/94787455.png)

Второй этап делается точно так же, только в место символа "**:**" пишем "**@**". В результате таких действий скрипт на глазах изменится, в нашем случаи он будет иметь вид:

```

{$VERSION 3.1.0027}
{$CLEO .cs}
 
//-------------MAIN---------------
0000: NOP 
thread 'MONEY' 
 
:MONEY_21
if 
0AB0: key_pressed 49 
else_jump @MONEY_43 
Player.Money($PLAYER_CHAR) += 100
 
:MONEY_43
wait 0 
jump @MONEY_21
```

Нажимаем "Компилировать" и ву-а-ля! Всё прекрасно скомпилировалось. Осталось только поправить значения на нужные =)

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

Остальные методы защиты рассматривать не будем, так как я в них ещё не ознакомлен. К томуже редактировать скрипты других авторов было бы нарушением его интелектуальной деятельности. Если нужно отредактировать скрипт, то лучше обратится к его автору.

Надеюсь, этот урок был Вам полезен, только используйте его в мирных целях =)|4112|1|0|40549587`png`449`135`400`120``\|94787455`png`379`266

```
`\||zashhita_skriptov_snjatie_slaboj_zashhity|1499757633
```
