Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Работа со скриптами (https://forum.zone-game.info/forumdisplay.php?f=37)
-   -   Поиск уязвимостей в мультиселлах (https://forum.zone-game.info/showthread.php?t=34295)

WoWan-SM 04.03.2014 15:18

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

Такой скрипт критически необходим людям, которые ставят свой серверна шарных исходниках, для проверки своего сервера на наличие уязвимостей в мультиселлах.

В свое время очень помогло мне, когда работал на лавео, сразу с десяток уязвимостей обнаружилось

Код:

package l2p.gameserver.taskmanager.tasks;

import java.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import l2p.commons.threading.RunnableImpl;
import l2p.gameserver.data.xml.holder.ItemHolder;
import l2p.gameserver.data.xml.holder.MultiSellHolder;
import l2p.gameserver.data.xml.holder.MultiSellHolder.MultiSellListContainer;
import l2p.gameserver.model.base.MultiSellEntry;
import l2p.gameserver.model.base.MultiSellIngredient;
import l2p.gameserver.templates.item.ItemTemplate;

/**
 * @author WoWan-SM
 * ICQ 181-70-70
 * Skype WoWan.SM
 *
 *        Класс для проверки итемов на корректную цену продажи в магазины
 *        Проверяет цену и количество products в мультиселлах и цену, количество ingridients
 */
public class InspectionItem extends RunnableImpl{

        static long _productPrice = 0;
        static long _ingredientPrice = 0;
        static boolean _isQuestItem = false;
        static boolean _isIgnoreItem = false;
       
        //Список игнорируемых итемов
        /*
        4356, //Laveon
        4357, //Little Laveon
        9600, //Первая Страница (Hidden First Page)
        9601, //Вторая Страница (Hidden Second Page)
        9602, //Часть Контракта Демона (Demon Contract Fragment)
        4310, //Чек Ясона Хейна (Iason Heine's Bill)
        3472 Blood Medusa
        3473 Blood Werewolf
        3474 Blood Basilisk
        3475 Blood Drevanul
        3476 Blood Succubus
        3477 Blood Dragon
        3478 Beleths Blood
        3479 Manaks Blood Werewolf
        3480 Nia's Blood Medusa
        3481 Gold Dragon
        3482 Gold Wyvern
        3483 Gold Knight
        3484 Gold Giant
        3485 Gold Drake
        3486 Gold Wyrm
        3487 Beleths Gold
        3488 Manaks Gold Giant
        3489 Nia's Gold Wywern
        3490 Silver Unicorn
        3491 Silver Fairy
        3492 Silver Dryad
        3493 Silver Dragon
        3494 Silver Golem
        3495 Silver Undine
        3496 Beleths Silver
        3497 Manaks Silver Dryad
        3498 Nia's Silver Fairy
        5575 Древняя Адена (Ancient Adena)
        5961 Серебряный Василиск Кайла (Kail's Silver Basilisk)
        5962 Золотой Голем Кайла (Kail's Gold Golem)
        5963 Кровавый Дракон Кайла (Kail's Blood Dragon)
        6016 Руда Инферниума (Infernium Ore)
        6021 Плазма Дракона (Dracoplasm)
        6023 Лунная Пыль (Moon Dust)
        6024 Некроплазма (Necroplasm)
        6025 Плазма Демона (Demonplasm)
        6027 Драконья Эссенция (Draconic Essence)
        6028 Пламенная Эссенция (Fire Essence)
        6029 Лунный Камень (Lunargent)
        6030 Полуночное Масло (Midnight Oil)
        6031 Демоническая Эссенция (Demonic Essence)
        6032 Масло Преисподней (Abyss Oil)
        6033 Масло Огня Ада (Hellfire Oil)
        6034 Масло Кошмара (Nightmare Oil)
        7562 Алмаз Иных Миров (Dimensional Diamond)
        9451 Эссенция Династии (Dynastic Essence)
        10413 Эссенция Династии II (Dynastic Essence II)
        14052 Усиливающий Камень Венеры (Noble Enhancement Stone)
        14861 Проклятое Украшение (Cursed Burial Items)
        14873 Шкура Макронианина (Mucrokian Hide)
        14836 Библиография Гигантов, 1-й том (Knowledge of the Giants Anthology, Chapter 1)
        14837 Библиография Гигантов, 2-й том (Knowledge of the Giants Anthology, Chapter 2)
        14838 Библиография Гигантов, 3-й том (Knowledge of the Giants Anthology, Chapter 3)
        14839 Библиография Гигантов, 4-й том (Knowledge of the Giants Anthology, Chapter 4)
        14840 Библиография Гигантов, 5-й том (Knowledge of the Giants Anthology, Chapter 5)
        13796 Ядро Освобожденной Души (Freed Soul)
        13841 Амулет Дракона (Dragonkin Charm)
       
        */
        final static int[] ignore_item = {-300,-200,7562,6016,6021,6023,6024,6025,6027,6028,6029,6030,6031,6032,6033,6034,5575,5961,5962,5963,13796,13841,14836,14837,14838,14839,14840,9451,10413,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,4356,4357,9600,9601,9602,4310,3488,3492,3497,14861,14873,3840};
       
        private static final Logger        _log        = LoggerFactory.getLogger(InspectionItem.class);

        @Override
        public void runImpl() throws Exception {
               
                Arrays.sort(ignore_item);
               
                int _multisellID = 0;
                MultiSellListContainer list;
               
                for (final int i : MultiSellHolder.entries.keys()) {
                        _multisellID = i;
                        list = MultiSellHolder.entries.get(_multisellID);
                       
                        _productPrice = 0;
                        _ingredientPrice = 0;
                        _isQuestItem = false;
                        _isIgnoreItem = false;
                        for (final MultiSellEntry j: list.getEntries())
                        {
                                for (final MultiSellIngredient _ingredient: j.getIngredients())
                                {
                                        if (_ingredient.getItemId() <= 0)
                                                break;
                                       
                                        final ItemTemplate item = ItemHolder.getInstance().getTemplate(_ingredient.getItemId());
                                       
                                        if (item == null)
                                                break;
                               
                                        if (Arrays.binarySearch(ignore_item, _ingredient.getItemId()) >= 0)
                                        {
                                                _isIgnoreItem = true;
                                                break;
                                        }
                                       
                                        if(item.isQuest())
                                        {
                                                _isQuestItem = true;
                                                break;
                                        }
                                       
                                        _ingredientPrice += (item.getReferencePrice() * _ingredient.getItemCount());
                                }
                               
                                for (final MultiSellIngredient _production: j.getProduction())
                                {
                                        if (!_isQuestItem || !_isIgnoreItem)
                                        {
                                                final ItemTemplate item = ItemHolder.getInstance().getTemplate(_production.getItemId());
                                               
                                                if (item == null)
                                                        break;
                                               
                                                _productPrice += (item.getReferencePrice() * _production.getItemCount());
                                        }
                                }
                               
                                if ((_productPrice  > _ingredientPrice) && !_isQuestItem && !_isIgnoreItem)
                                {
                                        _log.warn("The total price of product " + j.getEntryId() + " bigger then ingredient price. Check multisell ID:" + _multisellID);
                                        _log.warn("Product price: " + _productPrice + " ingredient price: " + _ingredientPrice);
                                }
                        }
                }
        }

}

В GameServer.java после последнего ***.getInstance() добавляем:
Код:

ThreadPoolManager.getInstance().schedule(new InspectionItem(), 30000L);
При необходимости можно закомментировать.

https://yadi.sk/d/vfQmyq06Z2J7Y

desolator 04.03.2014 15:35

Re: Поиск уязвимостей в мультиселлах
 
А я тут глазами сижу в блокноте и сравниваю ;D
Спасибо.

JavaMan 04.03.2014 17:47

Re: Поиск уязвимостей в мультиселлах
 
А какой смысл крутить эту задачу много раз, если можно проверить все мультиселлы один раз при загрузке сервера ?

WoWan-SM 04.03.2014 17:51

Re: Поиск уязвимостей в мультиселлах
 
Цитата:

Сообщение от GabberBaby (Сообщение 355344)
А какой смысл крутить эту задачу много раз, если можно проверить все мультиселлы один раз при загрузке сервера ?

30000L - Это задержка в милисекундах выполнения запланированной задачи (чтобы сервер до конца прогрузился), а не кол-во вызовов, вызывается проверка один раз.

Не путай с scheduleAtFixedDelay(final Runnable r, final long initial, final long delay)

JavaMan 04.03.2014 17:58

Re: Поиск уязвимостей в мультиселлах
 
Цитата:

Сообщение от WoWan-SM (Сообщение 355346)
30000L - Это задержка в милисекундах выполнения запланированной задачи (чтобы сервер до конца прогрузился), а не кол-во вызовов, вызывается проверка один раз.

Не путай с scheduleAtFixedDelay(final Runnable r, final long initial, final long delay)

Точно, забыл что в оригинальных оверах другой ThreadPoolManager. :)

RaRus 04.03.2014 19:35

Re: Поиск уязвимостей в мультиселлах
 
На лавео, через скрипты рисовали без проблем любой шмот :D

WoWan-SM 04.03.2014 20:07

Re: Поиск уязвимостей в мультиселлах
 
Цитата:

Сообщение от RaRus (Сообщение 355389)
На лавео, через скрипты рисовали без проблем любой шмот :D

До того как я пришел, там было все очень плачевно, не отрицаю.

Deazer 04.03.2014 21:42

Re: Поиск уязвимостей в мультиселлах
 
Цитата:

Сообщение от WoWan-SM (Сообщение 355391)
До того как я пришел, там было все очень плачевно, не отрицаю.

Интересно услышать как ты это пофиксил.

Nechaino 04.03.2014 22:05

Re: Поиск уязвимостей в мультиселлах
 
Цитата:

Сообщение от Deazer (Сообщение 355394)
Интересно услышать как ты это пофиксил.

Подозреваю что чудом...:redlol:

WoWan-SM 04.03.2014 22:08

Re: Поиск уязвимостей в мультиселлах
 
Цитата:

Сообщение от Deazer (Сообщение 355394)
Интересно услышать как ты это пофиксил.

Запрет на использование всех байпасов, кроме тех, что разрешены.

Да и те что разрешены, добавлены дополнительные условия.


Текущее время: 18:51. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot