Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Поиск уязвимостей в мультиселлах
#1
Что делает этот скрипт:
- Берет цену продажи в магазин готовой продукции и сравнивает её суммарной стоимостью всех ингредиентов.
- Если цена продажи в магазин больше, чем суммарные затраты, то при загрузке указывается название мультиселла и 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
Ответ
#2
А я тут глазами сижу в блокноте и сравниваю ;D
Спасибо.
Ответ
#3
А какой смысл крутить эту задачу много раз, если можно проверить все мультиселлы один раз при загрузке сервера ?
Ответ
#4
GabberBaby Написал:А какой смысл крутить эту задачу много раз, если можно проверить все мультиселлы один раз при загрузке сервера ?

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

Не путай с scheduleAtFixedDelay(final Runnable r, final long initial, final long delay)
Ответ
#5
WoWan-SM Написал:30000L - Это задержка в милисекундах выполнения запланированной задачи (чтобы сервер до конца прогрузился), а не кол-во вызовов, вызывается проверка один раз.

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

Точно, забыл что в оригинальных оверах другой ThreadPoolManager. Smile
Ответ
#6
На лавео, через скрипты рисовали без проблем любой шмот Big Grin
Ответ
#7
RaRus Написал:На лавео, через скрипты рисовали без проблем любой шмот Big Grin

До того как я пришел, там было все очень плачевно, не отрицаю.
Студия L2dev.su. Сборки Lindvior, Epilogue. ICQ 1817070. Skype wowan.sm
Ответ
#8
WoWan-SM Написал:До того как я пришел, там было все очень плачевно, не отрицаю.
Интересно услышать как ты это пофиксил.
Ответ
#9
Deazer Написал:Интересно услышать как ты это пофиксил.

Подозреваю что чудом...:redlol:
Ответ
#10
Deazer Написал:Интересно услышать как ты это пофиксил.

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

Да и те что разрешены, добавлены дополнительные условия.
Студия L2dev.su. Сборки Lindvior, Epilogue. ICQ 1817070. Skype wowan.sm
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Поиск скриптера fuzja1999 0 1,607 06-29-2018, 09:48 PM
Последний пост: fuzja1999
  [Поиск] Rebellion Hellbound moveton 0 1,099 03-13-2014, 06:22 PM
Последний пост: moveton
  [Поиск] Nexus Event Engine & Зоны moveton 10 3,835 10-20-2013, 01:19 AM
Последний пост: Visor

Перейти к форуму:


Пользователи, просматривающие эту тему: 5 Гость(ей)