-
Автор темы
- #41
как нашел GetSOCache ?SOCache* GCClient::GetInventorySOCache() const
{
return GetSOCache(CDOTALocalInventory::GetInstance()->m_OwnerID);
}
как нашел GetSOCache ?SOCache* GCClient::GetInventorySOCache() const
{
return GetSOCache(CDOTALocalInventory::GetInstance()->m_OwnerID);
}
давай помогу тебе переформулировать твой вопрос. вопрос не в том как Я нашёл. вопрос в том почему ты не нашёл(я так полагаю потому что ты даже не пытался судя по тому как ты вопрос задал).как нашел GetSOCache ?
давай помогу тебе переформулировать твой вопрос. вопрос не в том как Я нашёл. вопрос в том почему ты не нашёл(я так полагаю потому что ты даже не пытался судя по тому как ты вопрос задал).
"как мне найти GetSOCache? я пробовал ..., у меня не получилось потому что ...; В моём распоряжении для решения задачи имеются сурсы и дилибы, в них попробовал найти ... сделать ..., не получилось потому что ...; Я не умею делать/искать ..., интересно было бы узнать как это сделать"
возможно.Посмотреть вложение 204509
1 это адрес CGCClientSystem, а второй CSteamID?
ты SOID_t брал с сурсов кс го? А то я инициализирую эту структуру, передаю в функцию и потом краш. В x64dbg у меня просто эксепшин в функции на cmp(все адреса правильные)возможно.
открой дебагер найди это место, поставь бп, почекай адреса в реклассе. не срабатывает бп - ищи другое место там их много, реверси. не ограничивайся идой. ида, х64дбг, рекласс, чит енджин - это всё мощные инструменты.
Посмотреть вложение 204518
токо там не CSteamID а SOID_t.
1 параметр связанных методов это всегда this. чей метод таков и this. CGCClientSystem::GetSOCache -> this = CGCClientSystem*
отовсюду по чуть чуть насобирал.ты SOID_t брал с сурсов кс го? А то я инициализирую эту структуру, передаю в функцию и потом краш. В x64dbg у меня просто эксепшин в функции на cmp(все адреса правильные)Посмотреть вложение 205078
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 находит?отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
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 - пропала, теперь туда передают сразу кеш, а не ищут его в функции. Я пробовал ставить бряк на начало функции, дошел до этого, но так и не нашел ничего:отовсюду по чуть чуть насобирал.
бп поставь на нормальный вызов функции и посмотри как туда соид передается(указателем, значением и тд и тп) и попробуй так же передавать. также бп оставляешь инжектишь и ловишь свой вызов этой функции и смотришь как ты туда передаешь и сравниваешь(как оригинально передается, и как у тебя передается).
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 - пропала, теперь туда передают сразу кеш, а не ищут его в функции. Я пробовал ставить бряк на начало функции, дошел до этого, но так и не нашел ничего: Посмотреть вложение 205865
и теперь встает вопрос, где и как искать кеш?
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, если ее убралиGetPlayerInventory()->GetSOCache()->m_so_cache_objects_)
А рекласс богом дан для чего?так а где ты нашел GetSOCache, если ее нет в функциях, где она была раньше
auto& GetSOCache() { return m_shared_object_cache_; }
ее не убрали, ее заинлайнили(там получение кеша из мапы). и ты бы это увидел если бы посмотрел на мои скрины повторил бы мои действия и отмотал наверх(специально не постил что там наверху чтобы ты посмотрел сам). и заодно ты бы научился узнавать откуда аргументы берутся.так а где ты нашел GetSOCache, если ее убрали
ну вот я зашел в рекласс все адреса просмотрел, но так я не могу понять, где ты тут ищешь объектыА рекласс богом дан для чего?
CGCClientSharedObjectCache* m_shared_object_cache_; //0x00A0
GetSOCache у меня это просто функция для возврата ^.
C++:auto& GetSOCache() { return m_shared_object_cache_; }
Ты должен учится сам анализировать что ты видишь. У тебя есть в доступе тф2 сурсы и ксго сурсы 2018года, с этим можно отревесить хоть аналы сурс енжин.ну вот я зашел в рекласс все адреса просмотрел, но так я не могу понять, где ты тут ищешь объекты Посмотреть вложение 206275
+, мне тоже не нравится как он свои треды потом еще удаляет чтобы потом никто другой не мог ниче посмотреть разобраться научитьсяЯ бы рекомендовал тебе не тереть за собой коменты.
Если с тобой делятся инфой, то оставляй её публичной, чтобы в будущем люди, что захотят тоже ковырять доту и попали в подобный тупик - могли найти им нужное.
Ладно если ты хотел бы скрыть стим с которого ковыряешь - написал бы мне (я бы убрал из поста его) и замазал бы сам свой стим айди на скрине, но так получается, что ты получаешь нужные ответы и потом прячешь инфу об этом.
Если ты не вернешь скрин, впредь я точно тебе не буду отвечать. Надеюсь любой другой тоже перестанет здесь тебе отвечать.
Хочешь помощи, тебе её дают, даже нянчатся с тобой, но не надо потом убирать скрины и прочее после получения ответа.
CrayZ
я подтерел скриншот, чтобы потом не забанило(всякое может быть)Я бы рекомендовал тебе не тереть за собой коменты.
Если с тобой делятся инфой, то оставляй её публичной, чтобы в будущем люди, что захотят тоже ковырять доту и попали в подобный тупик - могли найти им нужное.
Ладно если ты хотел бы скрыть стим с которого ковыряешь - написал бы мне (я бы убрал из поста его) и замазал бы сам свой стим айди на скрине, но так получается, что ты получаешь нужные ответы и потом прячешь инфу об этом.
Если ты не вернешь скрин, впредь я точно тебе не буду отвечать. Надеюсь любой другой тоже перестанет здесь тебе отвечать.
Хочешь помощи, тебе её дают, даже нянчатся с тобой, но не надо потом убирать скрины и прочее после получения ответа.
CrayZ
ну возможно стоит задуматься о реверсе на каком-нибудь левом нью акке. ну и хуево ты скрин свой подтёр - ты черным замазал только число которые эти 8 байт представляют, а сами 8 байт хекса не замазал(то есть все еще можно твой стим айди получить если захотеть потому что он все еще прямо там на скрине).я подтерел скриншот, чтобы потом не забанило(всякое может быть)
я уже все нашел, теперь с функцией ебусь, я думал что я получаю gc кеш, а там CSharedObjectну возможно стоит задуматься о реверсе на каком-нибудь левом нью акке. ну и хуево ты скрин свой подтёр - ты черным замазал только число которые эти 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 сразу видно с каким классом дело имеешь
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz