Вопрос Опять эта ваша Schema (проблема с получением нетваров)

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
1 Ноя 2019
Сообщения
3
Реакции
0
Я только листочек в этой теме, прошу, не бейте сильно.

У меня есть вот такая функция


C++:
Expand Collapse Copy
    void SchemaDumpToMap(const char* _module, const char* _class) {
        std::cout << "Try to dump " << _class << " from " << _module << "\n";
        ui point = *(ui*)(Interfaces::Schema);
        std::cout << "Point of Shema: " << point << " | "<< *(ui*)(point+0x68)<<"\n";
        ui Scope = ((ui(__fastcall*)(ui schemasys, const char* _mod, char** idk))
            (*(ui*)(point+0x68)))(Interfaces::Schema, _module, NULL);
        if (!Scope) { std::cout<<"No such scope "<< (ui)_module<<"\n"; return; }
        std::cout << "Scope addres: " << Scope << "\n";
        ui result = 0;
        ui Test1 = ((ui(__fastcall*)(ui scope,ui *a2, const char* _class))

            (*(ui*)(*(ui*)(Scope)+0x10)))(Scope,&result, _class);
        if (!result) { std::cout << "No such class "<<(ui)_class<<"\n"; return; }
        std::cout << "Result: " << result << "\n";

        std::ofstream myfile;

        std::string filepath = "E:\\DOTA_OFFSETS\\";

        filepath = filepath + _class + ".txt";

        myfile.open(filepath.c_str());
        
        ClassDescription* a = (ClassDescription*)result;
    label_1: {}
        std::cout << a<<" | Class name: " << (cc)a->classname << "\n";
        std::string className = (cc)a->classname;
        myfile << (cc)a->classname << "\n";

        if (!a->memberstoiterate) myfile << "<no members>" << "\n";
        for (uintptr_t i = 0; i < a->memberstoiterate; i++) {
            MemberDescription* z = (MemberDescription*)(a->MemberInfo + i * 0x20);
            myfile << "Member " << (const char*)z->name << " type " << (const char*)z->schematypeptr->name << " offset " << z->offset << "\n";

            Netvars[className][(cc)z->name] = z->offset;
        }

        if (a->parent) { a = a->parent->parent; goto label_1; }
        myfile.close();
    }

До крупного обновления (7.38) в доте всё работало отлично. После обновления стало происходить вот такие гадости
p0XJxAw.png

После этого происходит краш.

(Да, можно заметить что EntitySystem = 0, почему-то после обновления аналогично не получается найти EntitySystem (Получилось единожды после перезагрузки пк и при первом запуске игры, при последующих попытках - краш), с чем всё это связано я также без понятия, как и где искать решение проблемы)
C++:
Expand Collapse Copy
    inline void InitInterfaces() {
        Engine = GetInterface<IEngineClient*>("engine2.dll", "Source2EngineToClient001");
        Client = GetInterface<CSource2Client*>("client.dll", "Source2Client002");
        CVar = GetInterface<CVarSystem*>("tier0.dll", "VEngineCvar007");
        uintptr_t* vmt_slot = [I](uintptr_t*[/I])Interfaces::Client + 25;                                //25th function in Source2Client vtable
        std::cout << "25th function in Source2Client vtable finded "<<vmt_slot<<"\n";
        uintptr_t addr_start = *vmt_slot + 3;                                                        //stores the relative address portion of the mov rax, [rip + 0x2512059] instruction
        std::cout <<"addr start: "<< addr_start<< " | "<< [I](uint32_t[/I])(addr_start)<<" | "<< addr_start + [I](uint32_t[/I])(addr_start)+4 << "\n";
        Entity = [I](CGameEntitySystem*[/I])(addr_start + [I](uint32_t[/I])(addr_start)+4); // краш
        ...
    }


Я не понимаю почему это и как это, если кто-то поможет мне разобарться почему так происходит и как это можно исправить, буду очень признателен
 
Я только листочек в этой теме, прошу, не бейте сильно.

У меня есть вот такая функция


C++:
Expand Collapse Copy
    void SchemaDumpToMap(const char* _module, const char* _class) {
        std::cout << "Try to dump " << _class << " from " << _module << "\n";
        ui point = *(ui*)(Interfaces::Schema);
        std::cout << "Point of Shema: " << point << " | "<< *(ui*)(point+0x68)<<"\n";
        ui Scope = ((ui(__fastcall*)(ui schemasys, const char* _mod, char** idk))
            (*(ui*)(point+0x68)))(Interfaces::Schema, _module, NULL);
        if (!Scope) { std::cout<<"No such scope "<< (ui)_module<<"\n"; return; }
        std::cout << "Scope addres: " << Scope << "\n";
        ui result = 0;
        ui Test1 = ((ui(__fastcall*)(ui scope,ui *a2, const char* _class))

            (*(ui*)(*(ui*)(Scope)+0x10)))(Scope,&result, _class);
        if (!result) { std::cout << "No such class "<<(ui)_class<<"\n"; return; }
        std::cout << "Result: " << result << "\n";

        std::ofstream myfile;

        std::string filepath = "E:\\DOTA_OFFSETS\\";

        filepath = filepath + _class + ".txt";

        myfile.open(filepath.c_str());
       
        ClassDescription* a = (ClassDescription*)result;
    label_1: {}
        std::cout << a<<" | Class name: " << (cc)a->classname << "\n";
        std::string className = (cc)a->classname;
        myfile << (cc)a->classname << "\n";

        if (!a->memberstoiterate) myfile << "<no members>" << "\n";
        for (uintptr_t i = 0; i < a->memberstoiterate; i++) {
            MemberDescription* z = (MemberDescription*)(a->MemberInfo + i * 0x20);
            myfile << "Member " << (const char*)z->name << " type " << (const char*)z->schematypeptr->name << " offset " << z->offset << "\n";

            Netvars[className][(cc)z->name] = z->offset;
        }

        if (a->parent) { a = a->parent->parent; goto label_1; }
        myfile.close();
    }

До крупного обновления (7.38) в доте всё работало отлично. После обновления стало происходить вот такие гадости
p0XJxAw.png

После этого происходит краш.

(Да, можно заметить что EntitySystem = 0, почему-то после обновления аналогично не получается найти EntitySystem (Получилось единожды после перезагрузки пк и при первом запуске игры, при последующих попытках - краш), с чем всё это связано я также без понятия, как и где искать решение проблемы)
C++:
Expand Collapse Copy
    inline void InitInterfaces() {
        Engine = GetInterface<IEngineClient*>("engine2.dll", "Source2EngineToClient001");
        Client = GetInterface<CSource2Client*>("client.dll", "Source2Client002");
        CVar = GetInterface<CVarSystem*>("tier0.dll", "VEngineCvar007");
        uintptr_t* vmt_slot = [I](uintptr_t*[/I])Interfaces::Client + 25;                                //25th function in Source2Client vtable
        std::cout << "25th function in Source2Client vtable finded "<<vmt_slot<<"\n";
        uintptr_t addr_start = *vmt_slot + 3;                                                        //stores the relative address portion of the mov rax, [rip + 0x2512059] instruction
        std::cout <<"addr start: "<< addr_start<< " | "<< [I](uint32_t[/I])(addr_start)<<" | "<< addr_start + [I](uint32_t[/I])(addr_start)+4 << "\n";
        Entity = [I](CGameEntitySystem*[/I])(addr_start + [I](uint32_t[/I])(addr_start)+4); // краш
        ...
    }


Я не понимаю почему это и как это, если кто-то поможет мне разобарться почему так происходит и как это можно исправить, буду очень признателен
1) https://yougame.biz/threads/139802/page-8#post-3241189
апдейт структурки ClassDescription был(ее официально название CSchemaClassBinding), см. код который там по ссылке(два поля были убраны - колво статик мемберов и птр на статик мемберы)
C++:
Expand Collapse Copy
    namespace schema_2025/*Wed Feb 18 2025 18:14:54*/
    {
        struct CSchemaClassBinding;
        struct SchemaBaseClassInfoData_t
        {
            std::uint32_t m_nOffset;
            CSchemaClassBinding* m_pClass;
        };

        struct CSchemaClassBinding
        {
            CSchemaClassBinding* first_instance_{};
            const char* Name_{};
            const char* Project_{};
            std::int32_t m_nSizeOf{};
            std::uint16_t m_Fields_count{};
            std::uint16_t m_Metadata_count{};
            std::int8_t m_nAlignOf{};
            std::uint8_t m_BaseClasses_count{};
            std::int16_t unk_5_{};
            std::int16_t unk_6_{};
            std::uint8_t unk_7_{};
            std::uint8_t unk_8_{};
            schema_2019::SchemaClassFieldData_t* m_Fields{};
            schema_2019::SchemaBaseClassInfoData_t* m_BaseClasses{};
            schema_2019::datamap_t* datamap_{};
            schema_2019::SchemaMetadataEntryData_t* m_Metadata{};
            CSchemaSystemTypeScope* scope_ptr_{};
            schema_2019::CSchemaType* declared_type_{};
            schema_2019::SchemaClassFlags_t flags_{};
            void* binding_func_{};
        };
        static_assert(offsetof(CSchemaClassBinding, first_instance_) == 0);
    }  // namespace schema_2025
2) там виртуальный индекс сместился но вопрос зачем ты вообще так делаешь... не привязывайся к тому что ты потом после апдейта не сможешь найти(если возможно) и документируй как находил.
элементарный способ найти энтитисистему - чекнуть функцию консольной команды cl_ent_find, там есть вызов GetEntityByIndex, там есть хреф на g_pEntitySystem
C++:
Expand Collapse Copy
00007FF93CD8BE70 | 48:83EC 28                 | sub rsp,28                                                             |
00007FF93CD8BE74 | 83BA 38040000 02           | cmp dword ptr ds:[rdx+438],2                                           |
00007FF93CD8BE7B | 7D 12                      | jge client.7FF93CD8BE8F                                                |
00007FF93CD8BE7D | 48:8D0D CC88D702           | lea rcx,qword ptr ds:[7FF93FB04750]                                    | 00007FF93FB04750:"Format: ent_find_index <index>\n"
00007FF93CD8BE84 | 48:83C4 28                 | add rsp,28                                                             |
00007FF93CD8BE88 | 48:FF25 4166D102           | jmp qword ptr ds:[<&Msg>]                                              |
00007FF93CD8BE8F | 48:8B82 40040000           | mov rax,qword ptr ds:[rdx+440]                                         |
00007FF93CD8BE96 | 48:895C24 20               | mov qword ptr ss:[rsp+20],rbx                                          |
00007FF93CD8BE9B | 48:8B48 08                 | mov rcx,qword ptr ds:[rax+8]                                           |
00007FF93CD8BE9F | FF15 4B6CD102              | call qword ptr ds:[<&V_atoi>]                                          |
00007FF93CD8BEA5 | 8BC8                       | mov ecx,eax                                                            |
00007FF93CD8BEA7 | 8BD8                       | mov ebx,eax                                                            |
00007FF93CD8BEA9 | E8 B2261601                | call client.7FF93DEEE560                                               | <---- GetEntityByIndex
00007FF93CD8BEAE | 48:85C0                    | test rax,rax                                                           |
00007FF93CD8BEB1 | 74 3E                      | je client.7FF93CD8BEF1                                                 |
00007FF93CD8BEB3 | 48:8B48 10                 | mov rcx,qword ptr ds:[rax+10]                                          |
00007FF93CD8BEB7 | 48:8D15 3C04D502           | lea rdx,qword ptr ds:[7FF93FADC2FA]                                    |
00007FF93CD8BEBE | 4C:8BC2                    | mov r8,rdx                                                             |
00007FF93CD8BEC1 | 44:8BCB                    | mov r9d,ebx                                                            |
00007FF93CD8BEC4 | 48:8B41 18                 | mov rax,qword ptr ds:[rcx+18]                                          |
00007FF93CD8BEC8 | 48:85C0                    | test rax,rax                                                           |
00007FF93CD8BECB | 4C:0F45C0                  | cmovne r8,rax                                                          |
00007FF93CD8BECF | 48:8B41 20                 | mov rax,qword ptr ds:[rcx+20]                                          |
00007FF93CD8BED3 | 48:85C0                    | test rax,rax                                                           |
00007FF93CD8BED6 | 48:8D0D C387D702           | lea rcx,qword ptr ds:[7FF93FB046A0]                                    | 00007FF93FB046A0:"   '%s' : '%s' (entindex %d) \n"
00007FF93CD8BEDD | 48:0F45D0                  | cmovne rdx,rax                                                         |
00007FF93CD8BEE1 | 48:8B5C24 20               | mov rbx,qword ptr ss:[rsp+20]                                          |
00007FF93CD8BEE6 | 48:83C4 28                 | add rsp,28                                                             |
00007FF93CD8BEEA | 48:FF25 DF65D102           | jmp qword ptr ds:[<&Msg>]                                              |
00007FF93CD8BEF1 | 8BD3                       | mov edx,ebx                                                            |
00007FF93CD8BEF3 | 48:8D0D 8E88D702           | lea rcx,qword ptr ds:[7FF93FB04788]                                    | 00007FF93FB04788:"Found no entity at %d.\n"
00007FF93CD8BEFA | 48:8B5C24 20               | mov rbx,qword ptr ss:[rsp+20]                                          |
00007FF93CD8BEFF | 48:83C4 28                 | add rsp,28                                                             |
00007FF93CD8BF03 | 48:FF25 C665D102           | jmp qword ptr ds:[<&Msg>]                                              |
C++:
Expand Collapse Copy
00007FF93DEEE560 | 8BD1                       | mov edx,ecx                                                            | GetEntityByIndex
00007FF93DEEE562 | 48:8B0D DF7AD603           | mov rcx,qword ptr ds:[7FF941C56048]                                    | <--- g_pEntitySystem
00007FF93DEEE569 | E9 B204F4FF                | jmp client.7FF93DE2EA20                                                |
либо альтернативно engine2.dll -> GameResourceServiceClientV001 и там на 0x58 лежит адрес энтитисистемы
 
Я только листочек в этой теме, прошу, не бейте сильно.

У меня есть вот такая функция


C++:
Expand Collapse Copy
    void SchemaDumpToMap(const char* _module, const char* _class) {
        std::cout << "Try to dump " << _class << " from " << _module << "\n";
        ui point = *(ui*)(Interfaces::Schema);
        std::cout << "Point of Shema: " << point << " | "<< *(ui*)(point+0x68)<<"\n";
        ui Scope = ((ui(__fastcall*)(ui schemasys, const char* _mod, char** idk))
            (*(ui*)(point+0x68)))(Interfaces::Schema, _module, NULL);
        if (!Scope) { std::cout<<"No such scope "<< (ui)_module<<"\n"; return; }
        std::cout << "Scope addres: " << Scope << "\n";
        ui result = 0;
        ui Test1 = ((ui(__fastcall*)(ui scope,ui *a2, const char* _class))

            (*(ui*)(*(ui*)(Scope)+0x10)))(Scope,&result, _class);
        if (!result) { std::cout << "No such class "<<(ui)_class<<"\n"; return; }
        std::cout << "Result: " << result << "\n";

        std::ofstream myfile;

        std::string filepath = "E:\\DOTA_OFFSETS\\";

        filepath = filepath + _class + ".txt";

        myfile.open(filepath.c_str());
       
        ClassDescription* a = (ClassDescription*)result;
    label_1: {}
        std::cout << a<<" | Class name: " << (cc)a->classname << "\n";
        std::string className = (cc)a->classname;
        myfile << (cc)a->classname << "\n";

        if (!a->memberstoiterate) myfile << "<no members>" << "\n";
        for (uintptr_t i = 0; i < a->memberstoiterate; i++) {
            MemberDescription* z = (MemberDescription*)(a->MemberInfo + i * 0x20);
            myfile << "Member " << (const char*)z->name << " type " << (const char*)z->schematypeptr->name << " offset " << z->offset << "\n";

            Netvars[className][(cc)z->name] = z->offset;
        }

        if (a->parent) { a = a->parent->parent; goto label_1; }
        myfile.close();
    }

До крупного обновления (7.38) в доте всё работало отлично. После обновления стало происходить вот такие гадости
p0XJxAw.png

После этого происходит краш.

(Да, можно заметить что EntitySystem = 0, почему-то после обновления аналогично не получается найти EntitySystem (Получилось единожды после перезагрузки пк и при первом запуске игры, при последующих попытках - краш), с чем всё это связано я также без понятия, как и где искать решение проблемы)
C++:
Expand Collapse Copy
    inline void InitInterfaces() {
        Engine = GetInterface<IEngineClient*>("engine2.dll", "Source2EngineToClient001");
        Client = GetInterface<CSource2Client*>("client.dll", "Source2Client002");
        CVar = GetInterface<CVarSystem*>("tier0.dll", "VEngineCvar007");
        uintptr_t* vmt_slot = [I](uintptr_t*[/I])Interfaces::Client + 25;                                //25th function in Source2Client vtable
        std::cout << "25th function in Source2Client vtable finded "<<vmt_slot<<"\n";
        uintptr_t addr_start = *vmt_slot + 3;                                                        //stores the relative address portion of the mov rax, [rip + 0x2512059] instruction
        std::cout <<"addr start: "<< addr_start<< " | "<< [I](uint32_t[/I])(addr_start)<<" | "<< addr_start + [I](uint32_t[/I])(addr_start)+4 << "\n";
        Entity = [I](CGameEntitySystem*[/I])(addr_start + [I](uint32_t[/I])(addr_start)+4); // краш
        ...
    }


Я не понимаю почему это и как это, если кто-то поможет мне разобарться почему так происходит и как это можно исправить, буду очень признателен
может тебе будет полезен этот
Пожалуйста, авторизуйтесь для просмотра ссылки.
, это микропатчер на погоду и тд
 
does it really change after the last update ?
 
Последнее редактирование:
Назад
Сверху Снизу