Вопрос Краш без какой-либо причины

Статус
В этой теме нельзя размещать новые ответы.
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
В деббагере ничего не отлавливается, адреса рабочие
Код:
static auto Inventory = reinterpret_cast<CDOTAInventoryManager*>(ReadPtr((SIZE_T)findPattern(L"client.dll", "48 89 05 ? ? ? ? 4C 89 3D ? ? ? ? C7 05 ? ? ? ? ? ? ? ? 44 89 3D ? ? ? ?"), 3));
static auto CPlayerInv = reinterpret_cast<void*>(ReadPtr((SIZE_T)findPattern(L"client.dll", "48 8D 05 ? ? ? ? 48 89 74 24 ? 48 89 01 48 8B D9 48 8B 0D ? ? ? ?"), 3));

Inventory->EquipItem(CPlayerInv, Message->new_slot(), Message->new_class());
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,380
Реакции[?]
2,284
Поинты[?]
189K
vac же детектит LL
Это вроде только в кс. Энивей, можешь использовать Kirin Injector, там есть обход невозможности инжекта при использовании LL.
В деббагере ничего не отлавливается, адреса рабочие
Код:
static auto Inventory = reinterpret_cast<CDOTAInventoryManager*>(ReadPtr((SIZE_T)findPattern(L"client.dll", "48 89 05 ? ? ? ? 4C 89 3D ? ? ? ? C7 05 ? ? ? ? ? ? ? ? 44 89 3D ? ? ? ?"), 3));
static auto CPlayerInv = reinterpret_cast<void*>(ReadPtr((SIZE_T)findPattern(L"client.dll", "48 8D 05 ? ? ? ? 48 89 74 24 ? 48 89 01 48 8B D9 48 8B 0D ? ? ? ?"), 3));

Inventory->EquipItem(CPlayerInv, Message->new_slot(), Message->new_class());
А как ты узнал, что крашит именно тут, если в дебаггере ничего нет?
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
А как ты узнал, что крашит именно тут, если в дебаггере ничего нет?
другое ничего не может быть, закомментировал этот код и никаких вылетов
Это вроде только в кс. Энивей, можешь использовать Kirin Injector, там есть обход невозможности инжекта при использовании LL.
1650033973427.png
работает только 2,3 метод
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В деббагере ничего не отлавливается, адреса рабочие
Код:
static auto Inventory = reinterpret_cast<CDOTAInventoryManager*>(ReadPtr((SIZE_T)findPattern(L"client.dll", "48 89 05 ? ? ? ? 4C 89 3D ? ? ? ? C7 05 ? ? ? ? ? ? ? ? 44 89 3D ? ? ? ?"), 3));
static auto CPlayerInv = reinterpret_cast<void*>(ReadPtr((SIZE_T)findPattern(L"client.dll", "48 8D 05 ? ? ? ? 48 89 74 24 ? 48 89 01 48 8B D9 48 8B 0D ? ? ? ?"), 3));

Inventory->EquipItem(CPlayerInv, Message->new_slot(), Message->new_class());
Тут 5 моментов краша.

1) if(!Inventory)return;
2) if(!CPlayerInv )return;
3) Inventory->EquipItem
4) Message->new_slot()
5) Message->new_class()
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
Тут 5 моментов краша.

1) if(!Inventory)return;
2) if(!CPlayerInv )return;
3) Inventory->EquipItem
4) Message->new_slot()
5) Message->new_class()
мб 3, но как починить нет идей, поставишь 2 поинтер -> вызывается 1 функция
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,380
Реакции[?]
2,284
Поинты[?]
189K
1) if(!Inventory)return;
2) if(!CPlayerInv )return;
Так это ж Read Memory, оно энивей NULL не должно быть.
Даже если так, то лучше уж if ( Inventory == nullptr ) return.

Я вполне могу ошибаться, я не погромист..
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
в дебагере не может ничего не отлавливаться.(если конечно ты его правильно настроил.
ставь First chance(то есть брейк как токо исключение вылетело) либо Second chance(то есть исключение никто не смог нормально обработать и оно щас крашнет приложуху) на рейндж 0xC0000000+, это майкрософтовские исключения(0xC0000005 это например нарушение прав виртуальной странички)
на моем скрине от 0 до 0x7FFFFFFF игнор(юзер исключения) а на все остальные(0x80000000+, 0x80000003 например это int3 исключение) First Chance
1650044857800.png
)
вместо указателей юзай референсы(то есть берешь указатель, чекаешь ноль, делаешь референс если не ноль, кидаешь исключение если ноль).
T& ReadPtr(blablabla):
T* result = ReadPtrImpl(blablabla);
if(!result) throw xxxNullPtrExceptionxxx("blablabla is nullptr");
return *result;
тогда не будет проблем с дереференсом нуля и не придется чекать на нуллптр(чек будет, но скрыт под капотом).
если ты с протобафами, они сделаны через жопу и могут крашить при определенных способах инжекта, попробуй способ инжекта поменять.
и что значит код
Inventory->EquipItem(CPlayerInv, Message->new_slot(), Message->new_class());
при чем тут CPlayerInv?
инвентарьменеджер уже содержит в себе локальный инвентарь
Пожалуйста, авторизуйтесь для просмотра ссылки.
ты уверен что ты всё правильно делаешь? я не вижу причины по которой метод инвентарь менеджера нуждался бы в инвентаре в качестве аргумента с учётом того что он у него уже есть как член.
и перед Message->new_slot не забывай Message->has_new_slot чекать(его может не быть).
вак тебе бан 100% даст в доте независимо от того LL ты используешь или ммап или что-то другое(при условии что ты делаешь что-то серьезное. не ну можно конечно в теории всякие хуки и прочее говно через жопу аккуратно делать чтобы вак ничего не детектил но смысл когда полно отрубателей вака в паблике. это сложно неудобно некрасиво и может крашнуть если чето неправильно сделаешь). ты либо отрубаешь вак(как делают все другие читы и скинчейнджеры) либо гарантировано получаешь бан(у меня миллион ваков в доте. сыграешь катку с читами(будь то скинчейнджер или что-либо другое) на некст день сразу бан прилетает)
ну и еще раз спрашиваю ты уверен что EquipItem это функция одевания шмотки клиентсайд а не функция отправки запроса на одевание на сервер?
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
в дебагере не может ничего не отлавливаться.(если конечно ты его правильно настроил.
ставь First chance(то есть брейк как токо исключение вылетело) либо Second chance(то есть исключение никто не смог нормально обработать и оно щас крашнет приложуху) на рейндж 0xC0000000+, это майкрософтовские исключения(0xC0000005 это например нарушение прав виртуальной странички)
на моем скрине от 0 до 0x7FFFFFFF игнор(юзер исключения) а на все остальные(0x80000000+, 0x80000003 например это int3 исключение) First Chance
стоит
Inventory->EquipItem(CPlayerInv, Message->new_slot(), Message->new_class());
при чем тут CPlayerInv?
инвентарьменеджер уже содержит в себе локальный инвентарь
1650169995922.png

UPD: краш из-за того, что я неправильно определил функцию
 
Последнее редактирование:
Продам прострел стен Warface 10к руб!
Забаненный
Статус
Оффлайн
Регистрация
7 Авг 2018
Сообщения
308
Реакции[?]
106
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Краш не возможен без причины! И не обязательно всегда проверять класс на пустоту. Прежде чем проверять, посмотри код движка, и если есть pdb игры, лучше посмотреть там, так что от этого мало вероятно, что будет краш!
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
Краш не возможен без причины! И не обязательно всегда проверять класс на пустоту. Прежде чем проверять, посмотри код движка, и если есть pdb игры, лучше посмотреть там, так что от этого мало вероятно, что будет краш!
крашен мб из-за того, что я принял 1 функцию за 2 1650183783633.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Продам прострел стен Warface 10к руб!
Забаненный
Статус
Оффлайн
Регистрация
7 Авг 2018
Сообщения
308
Реакции[?]
106
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
тогда что хукать?
ну во-первых не хукать а вызывать а во-вторых я тебе уже говорил,
Пожалуйста, авторизуйтесь для просмотра ссылки.
прямо так и ребилдишь
C++:
void Equip(equipped_class_t unClass, equipped_slot_t unSlot)
    {

        UnequipFromClass(unClass);

        if (m_pCustomData)
        {
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
        else if (!m_dirtyBits.m_bHasEquipSingleton)
        {
            m_EquipInstanceSingleton = { unClass, unSlot };
            m_dirtyBits.m_bHasEquipSingleton = true;
        }
        else
        {
            EnsureCustomDataExists();
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
    }
потом кеш обновляешь
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
ну во-первых не хукать а вызывать а во-вторых я тебе уже говорил,
Пожалуйста, авторизуйтесь для просмотра ссылки.
прямо так и ребилдишь
C++:
void Equip(equipped_class_t unClass, equipped_slot_t unSlot)
    {

        UnequipFromClass(unClass);

        if (m_pCustomData)
        {
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
        else if (!m_dirtyBits.m_bHasEquipSingleton)
        {
            m_EquipInstanceSingleton = { unClass, unSlot };
            m_dirtyBits.m_bHasEquipSingleton = true;
        }
        else
        {
            EnsureCustomDataExists();
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
    }
потом кеш обновляешь
так а как я могу получить функцию, если ее нет в классе CEconItem и в DeserializeFromProtoBufItem()?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
так а как я могу получить функцию, если ее нет в классе CEconItem и в DeserializeFromProtoBufItem()?
какую именно? Equip?
нафига ее получать если можно сделать то же самое что делает она.
это я тебе скинул мою собственную функцию, ребилд игровой по сурсам.
условно имея f(x) = x + 1 ты можешь сделать g(x) = x + 1 и у тебя будет g(x) = f(x). если функция просто прибавляет один, зачем ее получать когда можно самому прибавить один?
C++:
void UnequipFromClass(equipped_class_t unClass) noexcept
    {
        if (m_dirtyBits.m_bHasEquipSingleton)
        {
            if (m_EquipInstanceSingleton.m_unEquippedClass == unClass)
            {
                m_dirtyBits.m_bHasEquipSingleton = false;
                m_EquipInstanceSingleton.m_unEquippedClass = 0;
                m_EquipInstanceSingleton.m_unEquippedSlot = std::numeric_limits<std::uint16_t>::max();
            }
        }
        else if (m_pCustomData)
        {
            for(int i = 0; i < m_pCustomData->m_vecEquipped.size(); i++)
            {
                if (m_pCustomData->m_vecEquipped.at(i).m_unEquippedClass == unClass)
                {
                    m_pCustomData->m_vecEquipped.pop(i);
                    break;
                }
            }
        }
    }


    void Equip(equipped_class_t unClass, equipped_slot_t unSlot)
    {

        UnequipFromClass(unClass);

        if (m_pCustomData)
        {
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
        else if (!m_dirtyBits.m_bHasEquipSingleton)
        {
            m_EquipInstanceSingleton = { unClass, unSlot };
            m_dirtyBits.m_bHasEquipSingleton = true;
        }
        else
        {
            EnsureCustomDataExists();
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
    }
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
какую именно? Equip?
нафига ее получать если можно сделать то же самое что делает она.
это я тебе скинул мою собственную функцию, ребилд игровой по сурсам.
условно имея f(x) = x + 1 ты можешь сделать g(x) = x + 1 и у тебя будет g(x) = f(x). если функция просто прибавляет один, зачем ее получать когда можно самому прибавить один?
C++:
void UnequipFromClass(equipped_class_t unClass) noexcept
    {
        if (m_dirtyBits.m_bHasEquipSingleton)
        {
            if (m_EquipInstanceSingleton.m_unEquippedClass == unClass)
            {
                m_dirtyBits.m_bHasEquipSingleton = false;
                m_EquipInstanceSingleton.m_unEquippedClass = 0;
                m_EquipInstanceSingleton.m_unEquippedSlot = std::numeric_limits<std::uint16_t>::max();
            }
        }
        else if (m_pCustomData)
        {
            for(int i = 0; i < m_pCustomData->m_vecEquipped.size(); i++)
            {
                if (m_pCustomData->m_vecEquipped.at(i).m_unEquippedClass == unClass)
                {
                    m_pCustomData->m_vecEquipped.pop(i);
                    break;
                }
            }
        }
    }


    void Equip(equipped_class_t unClass, equipped_slot_t unSlot)
    {

        UnequipFromClass(unClass);

        if (m_pCustomData)
        {
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
        else if (!m_dirtyBits.m_bHasEquipSingleton)
        {
            m_EquipInstanceSingleton = { unClass, unSlot };
            m_dirtyBits.m_bHasEquipSingleton = true;
        }
        else
        {
            EnsureCustomDataExists();
            m_pCustomData->m_vecEquipped.push_back({ unClass, unSlot });
        }
    }
а кто будет заполнять m_pCustomData?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
а кто будет заполнять m_pCustomData?
тоже ребилд, там простая структура.
C++:
void CEconItem::EnsureCustomDataExists()
{
    if ( m_pCustomData == NULL )
    {
        m_pCustomData = new CEconItemCustomData();
        
        if ( m_dirtyBits.m_bHasEquipSingleton )
        {
            m_pCustomData->m_vecEquipped.AddToTail( m_EquipInstanceSingleton );
            m_EquipInstanceSingleton = EquippedInstance_t();
            m_dirtyBits.m_bHasEquipSingleton = false;
        }
        if ( m_dirtyBits.m_bHasAttribSingleton )
        {
            m_pCustomData->m_vecAttributes.AddToTail( m_CustomAttribSingleton );
            m_dirtyBits.m_bHasAttribSingleton = false;
        }
    }
}
C++:
class CEconItemCustomData
{
public:
    CEconItemCustomData()
        : m_pInteriorItem( NULL )
        , m_ulOriginalID( INVALID_ITEM_ID )
        , m_unQuantity( 1 )
        , m_vecAttributes( /* grow size: */ 1, /* init size: */ 0 )
        , m_vecEquipped( /* grow size: */ 1, /* init size: */ 0 )
    {}

    ~CEconItemCustomData();

    CUtlVector< CEconItem::attribute_t > m_vecAttributes;
    CEconItem* m_pInteriorItem;
    uint64 m_ulOriginalID;    // Original Item ID
    uint16 m_unQuantity;    // Consumable stack count (ammo, money, etc)   

    CUtlVector<CEconItem::EquippedInstance_t> m_vecEquipped;

    static void FreeAttributeMemory( CEconItem::attribute_t *pAttrib );

#ifdef GC_DLL
    DECLARE_CLASS_MEMPOOL( CEconItemCustomData );
#endif
};
C++:
export
struct EquippedInstance_t
{
    equipped_class_t m_unEquippedClass;
    equipped_slot_t m_unEquippedSlot;
};

export
class CEconItemCustomData
{
    void* InteriorItem{};
public:
    CUtlVector<attribute_t> m_vecAttributes{};
    CUtlVector<EquippedInstance_t> m_vecEquipped{};
    std::uint64_t m_ulOriginalID{};
};
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу