• Страница 1 из 1
  • 1
Как найти "дыры" в своем моде.
Дмитрий Дата: Суббота, 22.11.2014, 17:21 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий

Здравствуйте. С вами Igoreshka. Давно не писал своих уроков.
Урок больше для новичков чем для профи.
Сегодня я поделюсь своим опытом в поиске "дыр" в моде. Т.К многие люди качают мод с public, тем самым ставят себя под угрозу взлома.

Начнем с того что многие говорят: "У меня в моде можно выдать себе адм какой-то командой/функцией". Ну что-ж сейчас я немного расскажу вам про это.

Как же постараться найти эту дырку.
1. Находим переменную Admin.
В мое случае это
Код
Player[playerid][pAdmin]  

2. Выделяем и копируем саму переменную а именно:
Код
pAdmin

3. Жмем Ctrl+F вписываем туда pAdmin. И тупо листаем и ищем когда вам покажется код странным:
Пример:
Код
CMD:pdsdsdsdsda(playerid,params[]) return Player[playerid][pAdmin] = 6;

Хмм рассматриваем эту команду видно что дается адм просто так, нету никаких проверок.
P.S многие создают команду в include, так-что прошу если не нашли команду в моде поищите во всех include которых использует ваш мод.
Далее: "У меня в моде кто-то узнает мои id базы данных". Расскажу и про это.

1. Находим #define всех данных от БД.
В моем случае это:
Код
#define Sql_BD "Igoreshkamod"  

2. Копируем и вставляем в поиск(в моем случае Sql_BD), повторюсь поиск CTRL+F. Вы должны скорей всего найти что-то типо.
Код
SendClientMessage(playerid,-1,""Sql_BD" и т.д");  

Если нашли смело удаляем данную команду/функцию.
Далее: "При каком то действие у меня тупо начинает лагать сервер". Расскажу и про это.

1. Ну что-ж тут уже будет сложнее. Тут нужно будет рассмотреть 3 типо, может и больше:
while
for
goto

начнем с While:
while должно где-то заканчиваться пример когда сервер начнет зависать:
Код
new o;  
while(o > -1)  
{  
o++;  
}  

1. Запомните раз и навсегда. Если while || for имеют знак > || >= то в цикле должно быть break. Если его нету то это крах.
Теперь перейдем к For:
for всегда куда лучше. Чем while.
Но бывают дырки и в нем.
пример:
Код
for(new o; o < 10; o++)  
{  
      o--;  
}

Тем самым задается переменная o 0. Но происходит одновременно и + и - тем самым o не будет не прибавляться не убавляться.
Теперь goto.
Его многие не любят использовать т.к многие наводили на него страх что он кладет сервер. (где-то слышал).
Это все не так.
Пример краха сервера:
Код
stock dsds()  
{  
       new d;  
       gt:d = 2;  
       goto dt;  
}  

И вот лучше как использовать лично мое мнение:
Код
expx:if(Player[playerid][pLevel] == 0) expamount = 3;  
         else expamount = Player[playerid][pLevel]*5;  
         if(Player[playerid][pExp] >= expamount)  
         {  
             Player[playerid][pLevel]++;  
             Player[playerid][pExp] -= expamount;  
             SetPlayerScore(playerid,Player[playerid][pLevel]);  
         }  
         if(Player[playerid][pExp] > expamount) goto expx;  

Взял свой код.
Далее: "Если у меня был дом, потом я вышел и кто-то зашел и у него тот-же дом как и у меня". Расскажу и про это.

Это всемирная ошибка сам сталкивался с таким.
А проблема решается легко.
Просто нужно при Connect либо DisConnect задавать переменную на default значение.
Пример:
Код
public OnPlayerConnect(playerid)  
{  
Player[playerid][pHouse] = 0;

Многие спрашивают "зачем?".
Объясню:
playerid-это какое-то число а точнее ваш порядковый номер на сервере.
Если я купил дом то в мою переменную Player[playerid][pHouse] = 32;
То есть если у меня id 1.
То человек который заходит на сервер и имеет id 1. Его переменной pHouse = 32.

На этом я заканчиваю урок. Всем спасибо с вами был Igoreshka.


From Russia With Love!
  • Страница 1 из 1
  • 1
Поиск: