# 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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00400/00081.-zashita-skriptov-snyatie-slaboi-zashity.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
