• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

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

  • Автор темы Автор темы CrayZ
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
как нашел GetSOCache ?
давай помогу тебе переформулировать твой вопрос. вопрос не в том как Я нашёл. вопрос в том почему ты не нашёл(я так полагаю потому что ты даже не пытался судя по тому как ты вопрос задал).
"как мне найти GetSOCache? я пробовал ..., у меня не получилось потому что ...; В моём распоряжении для решения задачи имеются сурсы и дилибы, в них попробовал найти ... сделать ..., не получилось потому что ...; Я не умею делать/искать ..., интересно было бы узнать как это сделать"
 
давай помогу тебе переформулировать твой вопрос. вопрос не в том как Я нашёл. вопрос в том почему ты не нашёл(я так полагаю потому что ты даже не пытался судя по тому как ты вопрос задал).
"как мне найти GetSOCache? я пробовал ..., у меня не получилось потому что ...; В моём распоряжении для решения задачи имеются сурсы и дилибы, в них попробовал найти ... сделать ..., не получилось потому что ...; Я не умею делать/искать ..., интересно было бы узнать как это сделать"
1653137002667.png

1 это адрес CGCClientSystem, а второй CSteamID?
 
Последнее редактирование:
Посмотреть вложение 204509
1 это адрес CGCClientSystem, а второй CSteamID?
возможно.
открой дебагер найди это место, поставь бп, почекай адреса в реклассе. не срабатывает бп - ищи другое место там их много, реверси. не ограничивайся идой. ида, х64дбг, рекласс, чит енджин - это всё мощные инструменты.
13233.PNG

токо там не CSteamID а SOID_t.
1 параметр связанных методов это всегда this. чей метод таков и this. CGCClientSystem::GetSOCache -> this = CGCClientSystem*
 
возможно.
открой дебагер найди это место, поставь бп, почекай адреса в реклассе. не срабатывает бп - ищи другое место там их много, реверси. не ограничивайся идой. ида, х64дбг, рекласс, чит енджин - это всё мощные инструменты.
Посмотреть вложение 204518
токо там не CSteamID а SOID_t.
1 параметр связанных методов это всегда this. чей метод таков и this. CGCClientSystem::GetSOCache -> this = CGCClientSystem*
ты SOID_t брал с сурсов кс го? А то я инициализирую эту структуру, передаю в функцию и потом краш. В x64dbg у меня просто эксепшин в функции на cmp(все адреса правильные)
1653578071673.png
 
Последнее редактирование:
ты SOID_t брал с сурсов кс го? А то я инициализирую эту структуру, передаю в функцию и потом краш. В x64dbg у меня просто эксепшин в функции на cmp(все адреса правильные)Посмотреть вложение 205078
отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
C++:
Expand Collapse Copy
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{};
    }
};
 
отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
C++:
Expand Collapse Copy
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: не ту функцию использую
 
Последнее редактирование:
отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
C++:
Expand Collapse Copy
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

и теперь встает вопрос, где и как искать кеш?
 
после обновы доты, теперь в функции 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).
h9w8Stb.png
 
Зачем тебе вообще внутриигровая функция на это?
Все это можно ребилднуть себе и разницы будет 0. зато больше поймешь как работает GC Client.

C++:
Expand Collapse Copy
        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;
        }
 
так а где ты нашел GetSOCache, если ее нет в функциях, где она была раньше
А рекласс богом дан для чего?

CGCClientSharedObjectCache* m_shared_object_cache_; //0x00A0

GetSOCache у меня это просто функция для возврата ^.
C++:
Expand Collapse Copy
auto& GetSOCache() { return m_shared_object_cache_; }
 
так а где ты нашел GetSOCache, если ее убрали
ее не убрали, ее заинлайнили(там получение кеша из мапы). и ты бы это увидел если бы посмотрел на мои скрины повторил бы мои действия и отмотал наверх(специально не постил что там наверху чтобы ты посмотрел сам). и заодно ты бы научился узнавать откуда аргументы берутся.
кеш лежит в мапе(ключ соид_т, значение кеш*), эта мапа в гсклиенте(там все кеши).
так же в самом инвентаре тоже есть указатель на инвентори кеш(не только в доке 2 но и в других сурс играх тоже) как написал человек выше.
 
Последнее редактирование:
А рекласс богом дан для чего?

CGCClientSharedObjectCache* m_shared_object_cache_; //0x00A0

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

Вложения

  • Безымянный.png
    Безымянный.png
    82.7 KB · Просмотры: 45
Последнее редактирование:
ну вот я зашел в рекласс все адреса просмотрел, но так я не могу понять, где ты тут ищешь объекты Посмотреть вложение 206275

Ты должен учится сам анализировать что ты видишь. У тебя есть в доступе тф2 сурсы и ксго сурсы 2018года, с этим можно отревесить хоть аналы сурс енжин.

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

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

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

Я конечно понимаю, что ты привык когда с тобой нянчатся, но имей совесть. Тебе уже тут на 4 страницы нянчат, а ты все никак не соизволишь подумать своей головой и ждешь спунфида.
 
Последнее редактирование:
Я бы рекомендовал тебе не тереть за собой коменты.

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

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

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

@CrayZ
 
Я бы рекомендовал тебе не тереть за собой коменты.

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

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

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

@CrayZ
+, мне тоже не нравится как он свои треды потом еще удаляет чтобы потом никто другой не мог ниче посмотреть разобраться научиться
 
Я бы рекомендовал тебе не тереть за собой коменты.

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

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

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

@CrayZ
я подтерел скриншот, чтобы потом не забанило(всякое может быть)
 
я подтерел скриншот, чтобы потом не забанило(всякое может быть)
ну возможно стоит задуматься о реверсе на каком-нибудь левом нью акке. ну и хуево ты скрин свой подтёр - ты черным замазал только число которые эти 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 сразу видно с каким классом дело имеешь
 
ну возможно стоит задуматься о реверсе на каком-нибудь левом нью акке. ну и хуево ты скрин свой подтёр - ты черным замазал только число которые эти 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
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу