Гайд Продолжение. панорама - меню и кд абилок врагов

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
че то странная тема какая-то, почему SetProperty крашит при вызове?

C++:
    std::uint16_t GetStyleOffset( ) {
        auto res = util::get_absolute_address( this->GetVF<std::uintptr_t>( 304 ) + 0x31D, 3, 7 );
        return *(std::uint16_t*)res;
    }

    std::uintptr_t SetProperty( const char* style ) {
        auto style_offset = this->GetStyleOffset( );
        return CallVFunc<304>( &style_offset, style );
    }
...
        static CUIPanel* test_panel = nullptr;

        if ( wParam == VK_UP ) {
            auto& UIEngine = IPanoramaUIEngine::GetInstance( );
            CUIPanel* hud_parent = UIEngine.FindPanel( IEngineClient::GetInstance().IsInGame() ? "DotaHud" : "Hud" );
            CPanoramaSymbol symbol = UIEngine.m_pUIEngineSource2->MakeSymbol( "Panel" );
            test_panel = UIEngine.m_pUIEngineSource2->CreatePanel( symbol, "TestPanel", hud_parent )->GetUIPanel( );
            test_panel->LoadLayoutErrorHandle( R"xml(file://{resources}/xml.xml)xml", true );
        }
        if ( wParam == VK_F1 ) {
            if ( test_panel ) {
                test_panel->SetProperty( "background-color:white;" );
            }
        }
styleoffset(
Посмотреть вложение 246496
)

Кароче я +- разобрался с гет/сетатрибут но есть проблема:
Посмотреть вложение 246533то есть сам бекграунд колор не меняется, а строчка меняется(после смены на white уже гетатрибутстринг вернул вайт)

Посмотреть вложение 246534

вот тоже самое почти(стайл валидные и т.д.) но вернуло nullpid(который return_if_null как я понял из псевдокода)
Пожалуйста, авторизуйтесь для просмотра ссылки.
setAttribute("style", "background-color: red;") попробуй. атрибут style содержит css код. ты не бекграунд колор выставляй, а стайл в котором прописан бекграунд колор
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
ничего не поменялось вообще там
с другими аттрибутами перепроверь, text на Lable'е например и чекни в панорама дебагере меняется или нет
и чекни что ты на той панели меняешь
индекс перепроверь, бпшку поставь посмотри как дота вызывает и тд
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
с другими аттрибутами перепроверь, text на Lable'е например и чекни в панорама дебагере меняется или нет
и чекни что ты на той панели меняешь
индекс перепроверь, бпшку поставь посмотри как дота вызывает и тд
Вот пытался тоже реверсить следуя дилибам и макдоте. Вот что вышло. Проблема оказывается лежит еще с поиском нужной функции.

 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Пытался отреверсить параметр RDX внутри CUIPanel::BSetProperty(CUIPanel*, somestr* )
C++:
struct somestr
{
uint16_t k_symbolID;
uint32_t unk;
uint16_t unk0;
void* PtrToData; /// Там крч такой вид(имею в виду что лежит в PtrToData
////false....,y....
////false..,false..
////.,false....
/////false....
/////true,50% 60%
/////....
}
Но я не могу понять как туда ложат данные в RDX( пробовал смотреть по возврату но там нереально)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Пытался отреверсить параметр RDX внутри CUIPanel::BSetProperty(CUIPanel*, somestr* )
C++:
struct somestr
{
uint16_t k_symbolID;
uint32_t unk;
uint16_t unk0;
void* PtrToData; /// Там крч такой вид(имею в виду что лежит в PtrToData
////false....,y....
////false..,false..
////.,false....
/////false....
/////true,50% 60%
/////....
}
Но я не могу понять как туда ложат данные в RDX( пробовал смотреть по возврату но там нереально)
ну ты близко был
C++:
    static constexpr auto SetAttribute_VFTable_Index = 304;
    void SetAttribute(std::uint16_t symbol, std::string_view value)
    {
        struct attribinfo
        {
            std::uint16_t _symbol{};
            const char* _value{};
        };
        attribinfo info{ ._symbol = symbol, ._value = value.data() };
        CallVFunc<SetAttribute_VFTable_Index>(&info);
    }

void SetAttribute(CUIPanel* panel, std::string_view name, std::string_view value) const
{
    panel->SetAttribute(MakeSymbol(name), value);
}

panorama.SetAttribute((CUIPanel*)0x2493BAF1180, "style", "visibility: visible; background-color: black;");
1683316571958.png
функция с хрефа легко находится, в рдкс очевидно лежит как минимум значение аттрибута(явная строка)
1.PNG
видим что в рдкс засовывает хммворд(это 16 байт. т.е. 2 ячейки по 8 байт) и сразу всё понятно - первая ячейка шорт, символ имени аттрибута(индекс в табилце строк панорамы), а вторая строка(значение аттрибута)
(ну точнее в рдкс засовывается адрес в стеке а по этому адресу засовывается хммворд)
(в виде указателя-на-хммворд, зачастую передаются структуры(которые больше 8 байт) в функцию. тот же Vector3 какой-нибудь например)
1683316856313.png
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
ну ты близко был
C++:
    static constexpr auto SetAttribute_VFTable_Index = 304;
    void SetAttribute(std::uint16_t symbol, std::string_view value)
    {
        struct attribinfo
        {
            std::uint16_t _symbol{};
            const char* _value{};
        };
        attribinfo info{ ._symbol = symbol, ._value = value.data() };
        CallVFunc<SetAttribute_VFTable_Index>(&info);
    }

void SetAttribute(CUIPanel* panel, std::string_view name, std::string_view value) const
{
    panel->SetAttribute(MakeSymbol(name), value);
}

panorama.SetAttribute((CUIPanel*)0x2493BAF1180, "style", "visibility: visible; background-color: black;");
Посмотреть вложение 246910
функция с хрефа легко находится, в рдкс очевидно лежит как минимум значение аттрибута(явная строка)
Посмотреть вложение 246911
видим что в рдкс засовывает хммворд(это 16 байт. т.е. 2 ячейки по 8 байт) и сразу всё понятно - первая ячейка шорт, символ имени аттрибута(индекс в табилце строк панорамы), а вторая строка(значение аттрибута)
(ну точнее в рдкс засовывается адрес в стеке а по этому адресу засовывается хммворд)
(в виде указателя-на-хммворд, зачастую передаются структуры(которые больше 8 байт) в функцию. тот же Vector3 какой-нибудь например)
Посмотреть вложение 246912
Ах вот чё за шорты в качестве панорамаСимволов в том же BHasClass. Перемудрили они, кончено
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Ура!! Спасибо. Та я почему-то не подумал что это const char* а пад то я так вставил для прикола.
Я увидел типа что какой-то набор значений true;true;false;false;false;....50% и растерялся немного.

Не совсем понимаю почему ты называешь это SetAttribute если внутри фунции написано же SetProperty.


Если вдруг кому-то сложно то можна вручную вызывать функцию из CPanelStyle( нужно поискать где-то на начале, там есть SetBackground и т.д. credits go to Morphling )
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
ну ты близко был
C++:
    static constexpr auto SetAttribute_VFTable_Index = 304;
    void SetAttribute(std::uint16_t symbol, std::string_view value)
    {
        struct attribinfo
        {
            std::uint16_t _symbol{};
            const char* _value{};
        };
        attribinfo info{ ._symbol = symbol, ._value = value.data() };
        CallVFunc<SetAttribute_VFTable_Index>(&info);
    }

void SetAttribute(CUIPanel* panel, std::string_view name, std::string_view value) const
{
    panel->SetAttribute(MakeSymbol(name), value);
}

panorama.SetAttribute((CUIPanel*)0x2493BAF1180, "style", "visibility: visible; background-color: black;");
Посмотреть вложение 246910
функция с хрефа легко находится, в рдкс очевидно лежит как минимум значение аттрибута(явная строка)
Посмотреть вложение 246911
видим что в рдкс засовывает хммворд(это 16 байт. т.е. 2 ячейки по 8 байт) и сразу всё понятно - первая ячейка шорт, символ имени аттрибута(индекс в табилце строк панорамы), а вторая строка(значение аттрибута)
(ну точнее в рдкс засовывается адрес в стеке а по этому адресу засовывается хммворд)
(в виде указателя-на-хммворд, зачастую передаются структуры(которые больше 8 байт) в функцию. тот же Vector3 какой-нибудь например)
Посмотреть вложение 246912
да все получилось

(с д2js напастил немного
Пожалуйста, авторизуйтесь для просмотра ссылки.
)

только вот прикол один есть когда героя удаляешь
1683346213914.png(onremoveentity)
панель остается то есть removeanddeletechildren почему-то панель не удаляет, она так и остается в воздухе висеть(понимаю что можно просто setvisibility false сделать, нолучше конечно удалить
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
да все получилось

(с д2js напастил немного
Пожалуйста, авторизуйтесь для просмотра ссылки.
)

только вот прикол один есть когда героя удаляешь
Посмотреть вложение 246925(onremoveentity)
панель остается то есть removeanddeletechildren почему-то панель не удаляет, она так и остается в воздухе висеть(понимаю что можно просто setvisibility false сделать, нолучше конечно удалить
На кой ляд ты вообще это на панораме делаешь? Ты че, поехавший?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Ура!! Спасибо. Та я почему-то не подумал что это const char* а пад то я так вставил для прикола.
Я увидел типа что какой-то набор значений true;true;false;false;false;....50% и растерялся немного.

Не совсем понимаю почему ты называешь это SetAttribute если внутри фунции написано же SetProperty.


Если вдруг кому-то сложно то можна вручную вызывать функцию из CPanelStyle( нужно поискать где-то на начале, там есть SetBackground и т.д. credits go to Morphling )
ну так то да сетпроперти по факту но я просто по аналогии с DOM апи имя выбрал для себя
Пожалуйста, авторизуйтесь для просмотра ссылки.
и твой "паддинг" абсолютно неправильный(убрал последний void* для упрощения)
C++:
struct somestr
{
    uint16_t k_symbolID;
    uint32_t unk;
    uint16_t unk0;
};
это 12 байт.
сначала на +0 оффсете идёт шорт
дальше свободное место у нас на +2(шорт два байта предыдущих +0 и +1 занял), но у нас ЮИНТ32, который должен быть выровнен на 4 байтовой границе, т.е. +2 ему не подойдет. компилятор вставляет еще один паддинг(шорт(ну или два чара не суть). занимает +2 +3 байты) чтобы до +4 выровнять. потом этот инт занимает 4 байта. потом свободное место на +8. шорт должен быть выровнен на 2 байтовой границе, все нормально, 8 % 2 = 0 поэтому шорт будет на +8(+8 +9 байты занимает). структура по факту 10 байт. однако еще и сама структура тоже выравнивается(чтобы паддинг не поломался если струкутуры в массив друг за дружкой засунут). представь если бы у нас 10 байт размер был. тогда некст структура начиналась бы с +10.
у первого шорта мы выяснили +0 оффсет(т.е. +10 в нашем случае), у инта +4, это +14 в нашем случае, а 14 нихуя не кратно 4 байтам поэтому пизда нашему выравниванию
чтобы такой хуйни не было в конец структуры тоже добавляется паддинг, чтобы структура была выровнена, в большинстве случаев, до N-байтной границы где N это максимальное выравнивание среди всех мемберов(в нашем случае у нас максимальное выравнивание это 4 для нашего юинта32), т.е. размер структуры должен быть кратен 4 в нашем случае. итого структура 12 байт
Пожалуйста, авторизуйтесь для просмотра ссылки.
ты скорее всего хотел написать
C++:
struct somestr
{
    uint16_t k_symbolID;
    uint16_t unk0;
    uint32_t unk;
};
вот это уже 8 байт.
кр4 мораль такова что за порядком объявления членов следи внимательнее
если не дружишь с паддингом - можно напрямую оффсеты юзать(Member и тд)
да все получилось

(с д2js напастил немного
Пожалуйста, авторизуйтесь для просмотра ссылки.
)

только вот прикол один есть когда героя удаляешь
Посмотреть вложение 246925(onremoveentity)
панель остается то есть removeanddeletechildren почему-то панель не удаляет, она так и остается в воздухе висеть(понимаю что можно просто setvisibility false сделать, нолучше конечно удалить
индекс не тот мб?
 
Последнее редактирование:
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
Получай, оптимизация ебаная!
я нашел функу в js deleteasync, сигу сделал на нее и работает все(хз че за второй арг там, 0 кидаю туда),индекс на removeanddeletechildren, кстати верный, просто она не ворк и все.
да насчет оптимизации эти панельки капля в море по сравнению с кол-вом панелей например в DashboardForeground


C++:
global::patterns::CPanel2D__DeleteAsync =
    util::get_absolute_address(
    util::find_pattern( "client.dll", "\xE8\xCC\xCC\xCC\xCC\x4C\x89\x7F\x60", "CPanel2D::DeleteAsync", false ),
    1, 5 );
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
я нашел функу в js deleteasync, сигу сделал на нее и работает все(хз че за второй арг там, 0 кидаю туда),индекс на removeanddeletechildren, кстати верный, просто она не ворк и все.
да насчет оптимизации эти панельки капля в море по сравнению с кол-вом панелей например в DashboardForeground


C++:
global::patterns::CPanel2D__DeleteAsync =
    util::get_absolute_address(
    util::find_pattern( "client.dll", "\xE8\xCC\xCC\xCC\xCC\x4C\x89\x7F\x60", "CPanel2D::DeleteAsync", false ),
    1, 5 );
RemoveAndDeleteChildren я так понял с панели снимает детей(из списка детей убирает) и потом их еще и удаляет, а саму панель не трогает.
юзай DeleteAsync, она первым параметром CPanel2D принимает, а вторым задержку после которой панель удалит(0.0 можешь ставить задержку)
C++:
reinterpret_cast<void(*)(CPanel2D*, float)>(0x7FFF2EBA2F30)//DeleteAsync
                    ((CPanel2D*)0x1bf3ded08c0, 5.0f);
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
А почему у CTextEntry PchGetText и PchwGetText возвращают либо -1 либо какую-то хуйню, а не строку, причем CTextEntry::SetText работает нормально
я его нашел по .text из панорама js
1684565103231.png
то есть вот сверху сет снизу гет, на панорама жс работает и то и то а вот на с++ не работает gettext
1684565144296.png
вот он внутри, то есть как я и сказал 7 индекс (7*8=56)
1684565291404.png
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
А почему у CTextEntry PchGetText и PchwGetText возвращают либо -1 либо какую-то хуйню, а не строку, причем CTextEntry::SetText работает нормально
я его нашел по .text из панорама js
Посмотреть вложение 248341
то есть вот сверху сет снизу гет, на панорама жс работает и то и то а вот на с++ не работает gettext
Посмотреть вложение 248342
вот он внутри, то есть как я и сказал 7 индекс (7*8=56)
Посмотреть вложение 248343
кароч ExistedDim4 выяснил оно кодируется в char32_t(нахуя??)

C++:
void clicked( ) {
    CTextEntry* entry = cheat_data.ui_hud->find_child_traverse( "JSText" )->panel2d_as<CTextEntry*>( );
    auto p = entry->wdisplaytext( );

    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cv;
    std::cout << cv.to_bytes( p ) << std::endl;
}
 
Сверху Снизу