Гайд Продолжение серии. шема(оффсеты)+локал игрок

Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
может потому что ты передаешь int вместо int* :)
u64 GetLocalPlayerResult = ((u64(__fastcall*)(u64 _CEngineClient, u64 _Result))GetLocalPlayer)(CEngineClient, &IsLocalPlayer);
//функция спрашивает КУДА записать результат, а ты ей даешь вместо этого значение переменной а не ее адрес
еще нолик третьим параметром передай это вроде SplitScreenSlot судя по LWSS virtual int GetLocalPlayer( int splitScreenSlot = 0 )
Спасибо!
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
А вот смотри, сейчас вызвал функцию IsInGame, но она всегда выдает true даже в меню игры, как она работает? Сделал так
if (IsInGame)
{
CMSG ingame
}
else
{
CMSG notingame
}
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
А вот смотри, сейчас вызвал функцию IsInGame, но она всегда выдает true даже в меню игры, как она работает? Сделал так
if (IsInGame)
{
CMSG ingame
}
else
{
CMSG notingame
}
ну во-первых еще раз проверь передаешь ли ты this (InGame(CEngineClient)) , а во-вторых функция возвращает unsigned char, поэтому в прототипе если у тебя стоит возврат другого типа то исправь. ну и еще раз перепроверь индекс(26). если все еще не работает скинь тайпдеф и как вызываешь
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
ну во-первых еще раз проверь передаешь ли ты this (InGame(CEngineClient)) , а во-вторых функция возвращает unsigned char, поэтому в прототипе если у тебя стоит возврат другого типа то исправь. ну и еще раз перепроверь индекс(26). если все еще не работает скинь тайпдеф и как вызываешь
unsigned long long IsInGame = *(unsigned long long*)(CEngineClientVTable + 26 * 8);
unsigned long long IsInGameResult = ((unsigned long long(__fastcall*)(unsigned long long))IsInGame)(CEngineClient);

вот так я ее вызваю
Ща на unsigned char исправлю
И в правду, исправил заработало, спасибо большое
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2020
Сообщения
42
Реакции[?]
3
Поинты[?]
0
можешь сказать название функции панорамы в дилибе, которую мы хукаем
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
можешь сказать название функции панорамы в дилибе, которую мы хукаем
libpanorama.dylib-> panorama::CUIEngine::RunFrame

как видишь она в dylib'е имеет 7 индекс, поэтому ты заходишь в дебагер, находишь эту вмт и ставишь там брейкпоинты на 5 индекс 6 индекс 7 индекс 8 индекс условно, и смотришь кто из них срабатывает каждый кадр. и делаешь вывод что функция сейчас уже находится на 6 индексе. и хукаешь.
если что просто взял рандомную функцию которая вызывается каждый кадр.(искал слово frame просто в названии функций)
 
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2020
Сообщения
42
Реакции[?]
3
Поинты[?]
0
libpanorama.dylib-> panorama::CUIEngine::RunFrame

как видишь она в dylib'е имеет 7 индекс, поэтому ты заходишь в дебагер, находишь эту вмт и ставишь там брейкпоинты на 5 индекс 6 индекс 7 индекс 8 индекс условно, и смотришь кто из них срабатывает каждый кадр. и делаешь вывод что функция сейчас уже находится на 6 индексе. и хукаешь.
если что просто взял рандомную функцию которая вызывается каждый кадр.(искал слово frame просто в названии функций)
блин, не в той базе искал, спасибо)
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
// Offsets
unsigned long long m_hOwnerEntity = 0x3C8;
unsigned long long m_iHealth = 0x2C4;
unsigned long long m_flMana = 0xCC4;
unsigned long long m_iCurrentLevel = 0xC64;

// Entity Iteration
while (Entity)
{
if ((*(int*)(Entity + m_hOwnerEntity) & 0x7FFF) == LocalPlayerIndex)
{
if (!vstrcmp(getBaseClass(Entity), "C_DOTA_BaseNPC_Hero"))
{
LocalEntity = Entity;
break;
}
}
*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58) == 0 ? Entity = 0 : Entity = *(unsigned long long*)(*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58));
}

ConsoleMessage.CMSG("LocalEntity : %s\n", n2hex(LocalEntity));


ConsoleMessage.CMSG("LocalHero Health : %s\n", *(int*)(LocalEntity + m_iHealth));
ConsoleMessage.CMSG("LocalHero Mana : %s\n", (unsigned long long)std::to_string(*(float*)(LocalEntity + m_flMana)).c_str());
ConsoleMessage.CMSG("LocalHero Level : %s\n", *(int*)(LocalEntity + m_iCurrentLevel));
}

Почему может крашить? Крашит именно на последних выводах в консоль информации
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
// Offsets
unsigned long long m_hOwnerEntity = 0x3C8;
unsigned long long m_iHealth = 0x2C4;
unsigned long long m_flMana = 0xCC4;
unsigned long long m_iCurrentLevel = 0xC64;

// Entity Iteration
while (Entity)
{
if ((*(int*)(Entity + m_hOwnerEntity) & 0x7FFF) == LocalPlayerIndex)
{
if (!vstrcmp(getBaseClass(Entity), "C_DOTA_BaseNPC_Hero"))
{
LocalEntity = Entity;
break;
}
}
*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58) == 0 ? Entity = 0 : Entity = *(unsigned long long*)(*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58));
}

ConsoleMessage.CMSG("LocalEntity : %s\n", n2hex(LocalEntity));


ConsoleMessage.CMSG("LocalHero Health : %s\n", *(int*)(LocalEntity + m_iHealth));
ConsoleMessage.CMSG("LocalHero Mana : %s\n", (unsigned long long)std::to_string(*(float*)(LocalEntity + m_flMana)).c_str());
ConsoleMessage.CMSG("LocalHero Level : %s\n", *(int*)(LocalEntity + m_iCurrentLevel));
}

Почему может крашить? Крашит именно на последних выводах в консоль информации
%s подразумевает что параметр будет указателем на строку... тебе нужно std::to_string(MyHealth).c_str() передать
в итоге у тебя(у вальвов точнее) CMSG считывает с указателя *(int*)(LocalEntity + m_iHealth) в надежде получить ASCII байты строки, а это у тебя int, допустим 1000, а не указатель, по этому адресу 1000 нет странички поэтому краш
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
%s подразумевает что параметр будет указателем на строку... тебе нужно std::to_string(MyHealth).c_str() передать
в итоге у тебя(у вальвов точнее) CMSG считывает с указателя *(int*)(LocalEntity + m_iHealth) в надежде получить ASCII байты строки, а это у тебя int, допустим 1000, а не указатель, по этому адресу 1000 нет странички поэтому краш
Спасибо
Вот еще интересно, как можно отсеить энтити вражеских героев?
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
Тоесть мне получается надо сделать так и будет ли это работать?
while (Entity)
{
if (*(unsigned long long*)(Entity + m_iTeamNum) != LocalTeam)
{
if (!vstrcmp(getBaseClass(Entity), "C_DOTA_BaseNPC_Hero"))
{
EnemyEntity = Entity;
break;
}
}
*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58) == 0 ? Entity = 0 : Entity = *(unsigned long long*)(*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58));
}
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Тоесть мне получается надо сделать так и будет ли это работать?
while (Entity)
{
if (*(unsigned long long*)(Entity + m_iTeamNum) != LocalTeam)
{
if (!vstrcmp(getBaseClass(Entity), "C_DOTA_BaseNPC_Hero"))
{
EnemyEntity = Entity;
break;
}
}
*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58) == 0 ? Entity = 0 : Entity = *(unsigned long long*)(*(unsigned long long*)(*(unsigned long long*)(Entity + 0x10) + 0x58));
}
m_iTeamNum это не unsigned long long а int
*(unsigned long long*)(Entity + m_iTeamNum) значит считать по адресу (Entity+m_iTeamNum) 8 байт и представить их как целое число без знака.а тебе нужно 4 байт считать а не 8. *(int*)(Entity+m_iTeamNum)
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
А если сделать так, к примеру на 5 секунде игры инитиализация комманд сущностей, через геймтайм можно сделать?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
А если сделать так, к примеру на 5 секунде игры инитиализация комманд сущностей, через геймтайм можно сделать?
я хз. ты можешь грузиться дофига во-первых плюс еще реконнект стоит учитывать. попробуй кароче и узнаешь
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Жоска. Source2Gen реснул, или своими силами?
нет я свой ген сделал, мне не нравится что сурс2ген с++ заголовки генерирует, я предпочитаю дампить искать что надо в тхт файлах а потом на рантайме оффсет брать из шемы. ну и плюс там шема довольно сильно изменилась с времен последнего апдейта сурс2гена. я с дилибов в основном инфу брал.
там кр4 в системе хранятся все масштабы
C++:
export
class CSchemaSystem : public VClass
{
    static auto GetInstanceImpl()
    {
        return CreateInterface<CSchemaSystem*>("schemasystem.dll", "SchemaSystem");
    }
public:
    static auto& GetInstance()
    {
        static CSchemaSystem& instance = *GetInstanceImpl();
        return instance;
    }

    static inline constexpr auto TypeScopes_offset = 0x190;
    const auto& GetTypeScopes() const noexcept
    {
        return Member<CUtlVector<CSchemaSystemTypeScope*>>(TypeScopes_offset);
    }
};
а в масштабах все классы и енумы(биндинги)
C++:
export
class CSchemaSystemTypeScope : public VClass
{
    std::array<char, 256> name{};
public:
    std::string_view GetName() const noexcept
    {
        return { name.data() };
    }

    static inline constexpr auto Classes_offset = 0x558;
    const auto& GetClasses() const noexcept
    {
        return Member<CUtlTSHashBase<CSchemaClassBinding*>>(Classes_offset);
    }

    static inline constexpr auto Enums_offset = 0x2DA0;
    const auto& GetEnums() const noexcept
    {
        return Member<CUtlTSHashBase<CSchemaEnumBinding*>>(Enums_offset);
    }
};
а в биндингах там сначала идут пачкой члены которые представляют размеры массивов(массивы мемберов, статик мемберов, родителей, метапропов и тд) а потом указатели на память этих массивов
 
Последнее редактирование:
Сверху Снизу