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

Статус
В этой теме нельзя размещать новые ответы.
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
как нашел GetSOCache ?
давай помогу тебе переформулировать твой вопрос. вопрос не в том как Я нашёл. вопрос в том почему ты не нашёл(я так полагаю потому что ты даже не пытался судя по тому как ты вопрос задал).
"как мне найти GetSOCache? я пробовал ..., у меня не получилось потому что ...; В моём распоряжении для решения задачи имеются сурсы и дилибы, в них попробовал найти ... сделать ..., не получилось потому что ...; Я не умею делать/искать ..., интересно было бы узнать как это сделать"
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
давай помогу тебе переформулировать твой вопрос. вопрос не в том как Я нашёл. вопрос в том почему ты не нашёл(я так полагаю потому что ты даже не пытался судя по тому как ты вопрос задал).
"как мне найти GetSOCache? я пробовал ..., у меня не получилось потому что ...; В моём распоряжении для решения задачи имеются сурсы и дилибы, в них попробовал найти ... сделать ..., не получилось потому что ...; Я не умею делать/искать ..., интересно было бы узнать как это сделать"
1653137002667.png
1 это адрес CGCClientSystem, а второй CSteamID?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
Посмотреть вложение 204509
1 это адрес CGCClientSystem, а второй CSteamID?
возможно.
открой дебагер найди это место, поставь бп, почекай адреса в реклассе. не срабатывает бп - ищи другое место там их много, реверси. не ограничивайся идой. ида, х64дбг, рекласс, чит енджин - это всё мощные инструменты.
13233.PNG
токо там не CSteamID а SOID_t.
1 параметр связанных методов это всегда this. чей метод таков и this. CGCClientSystem::GetSOCache -> this = CGCClientSystem*
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
возможно.
открой дебагер найди это место, поставь бп, почекай адреса в реклассе. не срабатывает бп - ищи другое место там их много, реверси. не ограничивайся идой. ида, х64дбг, рекласс, чит енджин - это всё мощные инструменты.
Посмотреть вложение 204518
токо там не CSteamID а SOID_t.
1 параметр связанных методов это всегда this. чей метод таков и this. CGCClientSystem::GetSOCache -> this = CGCClientSystem*
ты SOID_t брал с сурсов кс го? А то я инициализирую эту структуру, передаю в функцию и потом краш. В x64dbg у меня просто эксепшин в функции на cmp(все адреса правильные)1653578071673.png
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
ты SOID_t брал с сурсов кс го? А то я инициализирую эту структуру, передаю в функцию и потом краш. В x64dbg у меня просто эксепшин в функции на cmp(все адреса правильные)Посмотреть вложение 205078
отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
C++:
enum class EAccountType
{
    k_EAccountTypeInvalid = 0,
    k_EAccountTypeIndividual = 1,        // single user account
    k_EAccountTypeMultiseat = 2,        // multiseat (e.g. cybercafe) account
    k_EAccountTypeGameServer = 3,        // game server account
    k_EAccountTypeAnonGameServer = 4,    // anonomous game server account
    k_EAccountTypePending = 5            // pending
};

enum class EUniverse
{
    k_EUniverseInvalid = 0,
    k_EUniversePublic = 1,
    k_EUniverseTestPublic = 2,
    k_EUniverseInternal = 3,

    k_EUniverseMax
};

export
class CSteamID
{
public:
    CSteamID() noexcept
    {
        m_unAccountID = 0;
        m_EAccountType = EAccountType::k_EAccountTypeInvalid;
        m_EUniverse = EUniverse::k_EUniverseInvalid;
        m_unAccountInstance = 0;
    }

    CSteamID(std::uint64_t ulSteamID) noexcept
    {
        m_unAccountID = (ulSteamID & 0xFFFFFFFF);                            // account ID is low 32 bits
        m_unAccountInstance = ((ulSteamID >> 32) & 0xFFFFF);            // account instance is next 20 bits

        m_EAccountType = static_cast<EAccountType>((ulSteamID >> 52) & 0xF);    // type is next 4 bits
        m_EUniverse = static_cast<EUniverse>((ulSteamID >> 56) & 0xFF);            // universe is next 8 bits
    }
public:
    bool IsValid() const noexcept { return m_EAccountType != EAccountType::k_EAccountTypeInvalid; }
    std::uint32_t GetAccountID() const noexcept { return m_unAccountID; }
private:
    // 64 bits total
    std::uint32_t        m_unAccountID : 32;            // unique account identifier
    unsigned int        m_unAccountInstance : 20;    // dynamic instance ID (used for multiseat type accounts only)
    EAccountType        m_EAccountType : 4;            // type of account
    EUniverse            m_EUniverse : 8;            // universe this account belongs to
};

enum k_SOID_Type
{
    k_SOID_Type_SteamID = 1,
    k_SOID_Type_PartyGroupID,
    k_SOID_Type_LobbyGroupID,
    k_SOID_Type_PartyInvite,
    k_SOID_Type_CheatReport,
    k_SOID_Type_NqmmRating
};

export
struct SOID_t
{
    std::uint64_t m_id;
    std::uint32_t m_type;
    std::uint32_t m_padding;
    bool operator==(const SOID_t& other) const noexcept
    {
        return m_id == other.m_id && m_type == other.m_type;
    }
    std::uint64_t ID() const noexcept
    {
        return m_id;
    }

    std::uint32_t Type() const noexcept
    {
        return m_type;
    }

    bool IsValid() const noexcept
    {
        return m_type != 0;
    }

    CSteamID GetSteamID() const noexcept
    {
        if (m_type == k_SOID_Type_SteamID)
            return CSteamID{ ID() };
        else return CSteamID{};
    }
};
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
C++:
enum class EAccountType
{
    k_EAccountTypeInvalid = 0,
    k_EAccountTypeIndividual = 1,        // single user account
    k_EAccountTypeMultiseat = 2,        // multiseat (e.g. cybercafe) account
    k_EAccountTypeGameServer = 3,        // game server account
    k_EAccountTypeAnonGameServer = 4,    // anonomous game server account
    k_EAccountTypePending = 5            // pending
};

enum class EUniverse
{
    k_EUniverseInvalid = 0,
    k_EUniversePublic = 1,
    k_EUniverseTestPublic = 2,
    k_EUniverseInternal = 3,

    k_EUniverseMax
};

export
class CSteamID
{
public:
    CSteamID() noexcept
    {
        m_unAccountID = 0;
        m_EAccountType = EAccountType::k_EAccountTypeInvalid;
        m_EUniverse = EUniverse::k_EUniverseInvalid;
        m_unAccountInstance = 0;
    }

    CSteamID(std::uint64_t ulSteamID) noexcept
    {
        m_unAccountID = (ulSteamID & 0xFFFFFFFF);                            // account ID is low 32 bits
        m_unAccountInstance = ((ulSteamID >> 32) & 0xFFFFF);            // account instance is next 20 bits

        m_EAccountType = static_cast<EAccountType>((ulSteamID >> 52) & 0xF);    // type is next 4 bits
        m_EUniverse = static_cast<EUniverse>((ulSteamID >> 56) & 0xFF);            // universe is next 8 bits
    }
public:
    bool IsValid() const noexcept { return m_EAccountType != EAccountType::k_EAccountTypeInvalid; }
    std::uint32_t GetAccountID() const noexcept { return m_unAccountID; }
private:
    // 64 bits total
    std::uint32_t        m_unAccountID : 32;            // unique account identifier
    unsigned int        m_unAccountInstance : 20;    // dynamic instance ID (used for multiseat type accounts only)
    EAccountType        m_EAccountType : 4;            // type of account
    EUniverse            m_EUniverse : 8;            // universe this account belongs to
};

enum k_SOID_Type
{
    k_SOID_Type_SteamID = 1,
    k_SOID_Type_PartyGroupID,
    k_SOID_Type_LobbyGroupID,
    k_SOID_Type_PartyInvite,
    k_SOID_Type_CheatReport,
    k_SOID_Type_NqmmRating
};

export
struct SOID_t
{
    std::uint64_t m_id;
    std::uint32_t m_type;
    std::uint32_t m_padding;
    bool operator==(const SOID_t& other) const noexcept
    {
        return m_id == other.m_id && m_type == other.m_type;
    }
    std::uint64_t ID() const noexcept
    {
        return m_id;
    }

    std::uint32_t Type() const noexcept
    {
        return m_type;
    }

    bool IsValid() const noexcept
    {
        return m_type != 0;
    }

    CSteamID GetSteamID() const noexcept
    {
        if (m_type == k_SOID_Type_SteamID)
            return CSteamID{ ID() };
        else return CSteamID{};
    }
};
так она получается только 2002 находит?
UPD: не ту функцию использую
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
C++:
enum class EAccountType
{
    k_EAccountTypeInvalid = 0,
    k_EAccountTypeIndividual = 1,        // single user account
    k_EAccountTypeMultiseat = 2,        // multiseat (e.g. cybercafe) account
    k_EAccountTypeGameServer = 3,        // game server account
    k_EAccountTypeAnonGameServer = 4,    // anonomous game server account
    k_EAccountTypePending = 5            // pending
};

enum class EUniverse
{
    k_EUniverseInvalid = 0,
    k_EUniversePublic = 1,
    k_EUniverseTestPublic = 2,
    k_EUniverseInternal = 3,

    k_EUniverseMax
};

export
class CSteamID
{
public:
    CSteamID() noexcept
    {
        m_unAccountID = 0;
        m_EAccountType = EAccountType::k_EAccountTypeInvalid;
        m_EUniverse = EUniverse::k_EUniverseInvalid;
        m_unAccountInstance = 0;
    }

    CSteamID(std::uint64_t ulSteamID) noexcept
    {
        m_unAccountID = (ulSteamID & 0xFFFFFFFF);                            // account ID is low 32 bits
        m_unAccountInstance = ((ulSteamID >> 32) & 0xFFFFF);            // account instance is next 20 bits

        m_EAccountType = static_cast<EAccountType>((ulSteamID >> 52) & 0xF);    // type is next 4 bits
        m_EUniverse = static_cast<EUniverse>((ulSteamID >> 56) & 0xFF);            // universe is next 8 bits
    }
public:
    bool IsValid() const noexcept { return m_EAccountType != EAccountType::k_EAccountTypeInvalid; }
    std::uint32_t GetAccountID() const noexcept { return m_unAccountID; }
private:
    // 64 bits total
    std::uint32_t        m_unAccountID : 32;            // unique account identifier
    unsigned int        m_unAccountInstance : 20;    // dynamic instance ID (used for multiseat type accounts only)
    EAccountType        m_EAccountType : 4;            // type of account
    EUniverse            m_EUniverse : 8;            // universe this account belongs to
};

enum k_SOID_Type
{
    k_SOID_Type_SteamID = 1,
    k_SOID_Type_PartyGroupID,
    k_SOID_Type_LobbyGroupID,
    k_SOID_Type_PartyInvite,
    k_SOID_Type_CheatReport,
    k_SOID_Type_NqmmRating
};

export
struct SOID_t
{
    std::uint64_t m_id;
    std::uint32_t m_type;
    std::uint32_t m_padding;
    bool operator==(const SOID_t& other) const noexcept
    {
        return m_id == other.m_id && m_type == other.m_type;
    }
    std::uint64_t ID() const noexcept
    {
        return m_id;
    }

    std::uint32_t Type() const noexcept
    {
        return m_type;
    }

    bool IsValid() const noexcept
    {
        return m_type != 0;
    }

    CSteamID GetSteamID() const noexcept
    {
        if (m_type == k_SOID_Type_SteamID)
            return CSteamID{ ID() };
        else return CSteamID{};
    }
};
после обновы доты, теперь в функции SOCacheSubscribed где раньше была GetSOCache - пропала, теперь туда передают сразу кеш, а не ищут его в функции. Я пробовал ставить бряк на начало функции, дошел до этого, но так и не нашел ничего: 1654069739726.png
и теперь встает вопрос, где и как искать кеш?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
после обновы доты, теперь в функции SOCacheSubscribed где раньше была GetSOCache - пропала, теперь туда передают сразу кеш, а не ищут его в функции. Я пробовал ставить бряк на начало функции, дошел до этого, но так и не нашел ничего: Посмотреть вложение 205865
и теперь встает вопрос, где и как искать кеш?
"теперь туда передают сразу кеш, а не ищут его в функции"
ну так найди кто его туда передает. реверси по хрефам/коллстеку. он не с неба берется
ставишь бп на CPlayerInventory::SOCacheSubscribed, перезапускаешь доту. сработал бп - смотришь кто вызывает
заодно смотришь где именно кеш - по реклассам тыкаешь там по регистрам хуистрам и прочей хуйне(кеш у него в r8)
1654100614900.png
вызывает его CDOTAPlayerInventory::SOCacheSubscribed. идешь ставишь на него бп, перезапускаешь доту. смотришь кто его вызывает.
заодно смотришь откуда у него берется r8(то есть анализируешь асм перед call). в конкретно данном случае r8 тут пробрасывается с вызывающей функции(другими словами, кто-то перед вызовом CDOTAPlayerInventory::SOCacheSubscribed кладет кеш в r8 и этот же самый кеш в этом же самом регистре летит потом дальше в CPlayerInventory::SOCacheSubscribed). поэтому идешь дальше смотришь кто вызывает(чтобы понять откуда там кеш в r8)
1654100655400.png
вызывает его <хуй пойми кто, не важно>:
1654101040200.png
r8 там(кеш) заполняется из rbp. отматываешь наверх и смотришь кто там в rbp и что откуда почему зачем и как пишет внутри данной функции(ищешь сверху инструкцию типа mov rbp, blablabla).
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Зачем тебе вообще внутриигровая функция на это?
Все это можно ребилднуть себе и разницы будет 0. зато больше поймешь как работает GC Client.

C++:
        std::optional<CSharedObjectTypeCache*> FindBaseTypeCache(const std::int32_t cache_id)
        {
            for (const auto cache : GetPlayerInventory()->GetSOCache()->m_so_cache_objects_)
            {
                if (cache->m_cache_id_ == cache_id)
                    return cache;
            }

            return std::nullopt;
        }
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
так а где ты нашел GetSOCache, если ее нет в функциях, где она была раньше
А рекласс богом дан для чего?

CGCClientSharedObjectCache* m_shared_object_cache_; //0x00A0

GetSOCache у меня это просто функция для возврата ^.
C++:
auto& GetSOCache() { return m_shared_object_cache_; }
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
так а где ты нашел GetSOCache, если ее убрали
ее не убрали, ее заинлайнили(там получение кеша из мапы). и ты бы это увидел если бы посмотрел на мои скрины повторил бы мои действия и отмотал наверх(специально не постил что там наверху чтобы ты посмотрел сам). и заодно ты бы научился узнавать откуда аргументы берутся.
кеш лежит в мапе(ключ соид_т, значение кеш*), эта мапа в гсклиенте(там все кеши).
так же в самом инвентаре тоже есть указатель на инвентори кеш(не только в доке 2 но и в других сурс играх тоже) как написал человек выше.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
А рекласс богом дан для чего?

CGCClientSharedObjectCache* m_shared_object_cache_; //0x00A0

GetSOCache у меня это просто функция для возврата ^.
C++:
auto& GetSOCache() { return m_shared_object_cache_; }
ну вот я зашел в рекласс все адреса просмотрел, но так я не могу понять, где ты тут ищешь объекты
 

Вложения

Последнее редактирование:
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
ну вот я зашел в рекласс все адреса просмотрел, но так я не могу понять, где ты тут ищешь объекты Посмотреть вложение 206275
Ты должен учится сам анализировать что ты видишь. У тебя есть в доступе тф2 сурсы и ксго сурсы 2018года, с этим можно отревесить хоть аналы сурс енжин.

Вот у тебя открыт рекласс, ты что-ли не можешь подумать что ты видишь?

С 0x28 у тебя идет SOID_t m_owner

С 0x8 у тебя идет то, что тебе должно быть интересно.
Сайз + поинтер на список кешей.

Я конечно понимаю, что ты привык когда с тобой нянчатся, но имей совесть. Тебе уже тут на 4 страницы нянчат, а ты все никак не соизволишь подумать своей головой и ждешь спунфида.
 
Последнее редактирование:
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Я бы рекомендовал тебе не тереть за собой коменты.

Если с тобой делятся инфой, то оставляй её публичной, чтобы в будущем люди, что захотят тоже ковырять доту и попали в подобный тупик - могли найти им нужное.

Ладно если ты хотел бы скрыть стим с которого ковыряешь - написал бы мне (я бы убрал из поста его) и замазал бы сам свой стим айди на скрине, но так получается, что ты получаешь нужные ответы и потом прячешь инфу об этом.

Если ты не вернешь скрин, впредь я точно тебе не буду отвечать. Надеюсь любой другой тоже перестанет здесь тебе отвечать.
Хочешь помощи, тебе её дают, даже нянчатся с тобой, но не надо потом убирать скрины и прочее после получения ответа.

CrayZ
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
Я бы рекомендовал тебе не тереть за собой коменты.

Если с тобой делятся инфой, то оставляй её публичной, чтобы в будущем люди, что захотят тоже ковырять доту и попали в подобный тупик - могли найти им нужное.

Ладно если ты хотел бы скрыть стим с которого ковыряешь - написал бы мне (я бы убрал из поста его) и замазал бы сам свой стим айди на скрине, но так получается, что ты получаешь нужные ответы и потом прячешь инфу об этом.

Если ты не вернешь скрин, впредь я точно тебе не буду отвечать. Надеюсь любой другой тоже перестанет здесь тебе отвечать.
Хочешь помощи, тебе её дают, даже нянчатся с тобой, но не надо потом убирать скрины и прочее после получения ответа.

CrayZ
+, мне тоже не нравится как он свои треды потом еще удаляет чтобы потом никто другой не мог ниче посмотреть разобраться научиться
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
Я бы рекомендовал тебе не тереть за собой коменты.

Если с тобой делятся инфой, то оставляй её публичной, чтобы в будущем люди, что захотят тоже ковырять доту и попали в подобный тупик - могли найти им нужное.

Ладно если ты хотел бы скрыть стим с которого ковыряешь - написал бы мне (я бы убрал из поста его) и замазал бы сам свой стим айди на скрине, но так получается, что ты получаешь нужные ответы и потом прячешь инфу об этом.

Если ты не вернешь скрин, впредь я точно тебе не буду отвечать. Надеюсь любой другой тоже перестанет здесь тебе отвечать.
Хочешь помощи, тебе её дают, даже нянчатся с тобой, но не надо потом убирать скрины и прочее после получения ответа.

CrayZ
я подтерел скриншот, чтобы потом не забанило(всякое может быть)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
я подтерел скриншот, чтобы потом не забанило(всякое может быть)
ну возможно стоит задуматься о реверсе на каком-нибудь левом нью акке. ну и хуево ты скрин свой подтёр - ты черным замазал только число которые эти 8 байт представляют, а сами 8 байт хекса не замазал(то есть все еще можно твой стим айди получить если захотеть потому что он все еще прямо там на скрине).
но в чём вопрос то был?
"ну вот я зашел в рекласс все адреса просмотрел, но так я не могу понять, где ты тут ищешь объекты"
что конкретно ты тут не понял? какие действия ты предпринял перед тем как сюда писать?
на 0x8 какая-то хуйня неинтересная(на самом деле это версия кеша, юинт64)
на 0x10-0x27 типичный CUtlVector(int(4 bytes) size + padding(4 bytes), void*(8 bytes) memory, int(4 bytes) capacity + padding(4 bytes))
указатель который лежит на оффсете 0x18(CUtlVector::memory) скопируй открой в новой вкладке в реклассе и посмотри что там лежит. везде тут тебе показывает RTTI сразу видно с каким классом дело имеешь
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
ну возможно стоит задуматься о реверсе на каком-нибудь левом нью акке. ну и хуево ты скрин свой подтёр - ты черным замазал только число которые эти 8 байт представляют, а сами 8 байт хекса не замазал(то есть все еще можно твой стим айди получить если захотеть потому что он все еще прямо там на скрине).
но в чём вопрос то был?
"ну вот я зашел в рекласс все адреса просмотрел, но так я не могу понять, где ты тут ищешь объекты"
что конкретно ты тут не понял? какие действия ты предпринял перед тем как сюда писать?
на 0x8 какая-то хуйня неинтересная(на самом деле это версия кеша, юинт64)
на 0x10-0x27 типичный CUtlVector(int(4 bytes) size + padding(4 bytes), void*(8 bytes) memory, int(4 bytes) capacity + padding(4 bytes))
указатель который лежит на оффсете 0x18(CUtlVector::memory) скопируй открой в новой вкладке в реклассе и посмотри что там лежит. везде тут тебе показывает RTTI сразу видно с каким классом дело имеешь
я уже все нашел, теперь с функцией ебусь, я думал что я получаю gc кеш, а там CSharedObject
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу