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

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

че то странная тема какая-то, почему SetProperty крашит при вызове?

C++:
Expand Collapse Copy
    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 код. ты не бекграунд колор выставляй, а стайл в котором прописан бекграунд колор
 
setAttribute("style", "background-color: red;") попробуй. атрибут style содержит css код. ты не бекграунд колор выставляй, а стайл в котором прописан бекграунд колор
так тоже нельзя
1683062489966.png
 
ничего не поменялось вообще там
с другими аттрибутами перепроверь, text на Lable'е например и чекни в панорама дебагере меняется или нет
и чекни что ты на той панели меняешь
индекс перепроверь, бпшку поставь посмотри как дота вызывает и тд
 
с другими аттрибутами перепроверь, text на Lable'е например и чекни в панорама дебагере меняется или нет
и чекни что ты на той панели меняешь
индекс перепроверь, бпшку поставь посмотри как дота вызывает и тд
Вот пытался тоже реверсить следуя дилибам и макдоте. Вот что вышло. Проблема оказывается лежит еще с поиском нужной функции.

8QC90cI.png
 
Пытался отреверсить параметр RDX внутри CUIPanel::BSetProperty(CUIPanel*, somestr* )
C++:
Expand Collapse Copy
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( пробовал смотреть по возврату но там нереально)
 
Пытался отреверсить параметр RDX внутри CUIPanel::BSetProperty(CUIPanel*, somestr* )
C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
    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
 
ну ты близко был
C++:
Expand Collapse Copy
    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. Перемудрили они, кончено
 
  • Мне нравится
Реакции: mj12
Ура!! Спасибо. Та я почему-то не подумал что это const char* а пад то я так вставил для прикола.
Я увидел типа что какой-то набор значений true;true;false;false;false;....50% и растерялся немного.

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


Если вдруг кому-то сложно то можна вручную вызывать функцию из CPanelStyle( нужно поискать где-то на начале, там есть SetBackground и т.д. credits go to @Morphling )
 
ну ты близко был
C++:
Expand Collapse Copy
    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
да все получилось
image.png

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

только вот прикол один есть когда героя удаляешь
1683346213914.png
(onremoveentity)
панель остается то есть removeanddeletechildren почему-то панель не удаляет, она так и остается в воздухе висеть(понимаю что можно просто setvisibility false сделать, нолучше конечно удалить
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
да все получилось
image.png

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

только вот прикол один есть когда героя удаляешь
Посмотреть вложение 246925(onremoveentity)
панель остается то есть removeanddeletechildren почему-то панель не удаляет, она так и остается в воздухе висеть(понимаю что можно просто setvisibility false сделать, нолучше конечно удалить

На кой ляд ты вообще это на панораме делаешь? Ты че, поехавший?
 
Ура!! Спасибо. Та я почему-то не подумал что это const char* а пад то я так вставил для прикола.
Я увидел типа что какой-то набор значений true;true;false;false;false;....50% и растерялся немного.

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


Если вдруг кому-то сложно то можна вручную вызывать функцию из CPanelStyle( нужно поискать где-то на начале, там есть SetBackground и т.д. credits go to @Morphling )
ну так то да сетпроперти по факту но я просто по аналогии с DOM апи имя выбрал для себя
Пожалуйста, авторизуйтесь для просмотра ссылки.
и твой "паддинг" абсолютно неправильный(убрал последний void* для упрощения)
C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
struct somestr
{
    uint16_t k_symbolID;
    uint16_t unk0;
    uint32_t unk;
};
вот это уже 8 байт.
кр4 мораль такова что за порядком объявления членов следи внимательнее
если не дружишь с паддингом - можно напрямую оффсеты юзать(Member и тд)
да все получилось
image.png

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

только вот прикол один есть когда героя удаляешь
Посмотреть вложение 246925(onremoveentity)
панель остается то есть removeanddeletechildren почему-то панель не удаляет, она так и остается в воздухе висеть(понимаю что можно просто setvisibility false сделать, нолучше конечно удалить
индекс не тот мб?
 
Последнее редактирование:
Получай, оптимизация ебаная!
я нашел функу в js deleteasync, сигу сделал на нее и работает все(хз че за второй арг там, 0 кидаю туда),индекс на removeanddeletechildren, кстати верный, просто она не ворк и все.
да насчет оптимизации эти панельки капля в море по сравнению с кол-вом панелей например в DashboardForeground


C++:
Expand Collapse Copy
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 );
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
я нашел функу в js deleteasync, сигу сделал на нее и работает все(хз че за второй арг там, 0 кидаю туда),индекс на removeanddeletechildren, кстати верный, просто она не ворк и все.
да насчет оптимизации эти панельки капля в море по сравнению с кол-вом панелей например в DashboardForeground


C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
reinterpret_cast<void(*)(CPanel2D*, float)>(0x7FFF2EBA2F30)//DeleteAsync
                    ((CPanel2D*)0x1bf3ded08c0, 5.0f);
 
А почему у CTextEntry PchGetText и PchwGetText возвращают либо -1 либо какую-то хуйню, а не строку, причем CTextEntry::SetText работает нормально
я его нашел по .text из панорама js
1684565103231.png

то есть вот сверху сет снизу гет, на панорама жс работает и то и то а вот на с++ не работает gettext
1684565144296.png

вот он внутри, то есть как я и сказал 7 индекс (7*8=56)
1684565291404.png
 
Последнее редактирование:
А почему у CTextEntry PchGetText и PchwGetText возвращают либо -1 либо какую-то хуйню, а не строку, причем CTextEntry::SetText работает нормально
я его нашел по .text из панорама js
Посмотреть вложение 248341
то есть вот сверху сет снизу гет, на панорама жс работает и то и то а вот на с++ не работает gettext
Посмотреть вложение 248342
вот он внутри, то есть как я и сказал 7 индекс (7*8=56)
Посмотреть вложение 248343
кароч @ExistedDim4 выяснил оно кодируется в char32_t(нахуя??)

C++:
Expand Collapse Copy
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;
}
 
Назад
Сверху Снизу