Вопрос Подгрузка скрипта через iscriptvm

Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
Всем привет, не могу подгрузить свой .lua скрипт в доту через IScriptVM, я взял
Пожалуйста, авторизуйтесь для просмотра ссылки.
код и обновил паттерн, но почему-то не находит IScriptVM. В отладчике искал этот паттерн, всё находило, может быть кто-то знает, в чем проблема?
код:
Пожалуйста, авторизуйтесь для просмотра ссылки.

вывод с консоли:
1655461230195.png
 
Последнее редактирование:
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Во-первых, насколько я помню, VScript нету в меню. Ты должен быть на сервере.
Во-вторых, в ММ его особо не поюзаешь, опять же, насколько я помню, у них есть чек и если ты хочешь в ММ юзать, нужно патчить.

Ну и последнее, это не факт, что рабочие сиги, ибо я их не обновлял месяц, но можешь попробовать:
C++:
        static std::uintptr_t v_script_game_sytem_ptr = g_tools->FindPatternInModule("client.dll",
            "40 53 56 57 48 83 EC 60 48 8B D9 48 8B FA", "Lua_Engine").self_offset(0x40);

        if (v_script_game_sytem_ptr && g_scriptgamesystem == nullptr)
        {
            // The compiler did some weird shit here to morph 2 vtables into one.
            // Just need to decrease thisptr by 0x10 to get to bigger vtable. (IGameSystem + CVScriptGameSystem) instead of just (CVScriptGameSystem).
            void* v_script_system_ptr2 = *reinterpret_cast<CVScriptGameSystem**>(g_tools->GetAbsoluteAddress(
                v_script_game_sytem_ptr));
            const auto v_script_system_ptr3 = reinterpret_cast<char*>(v_script_system_ptr2) - 0x10;

            g_scriptgamesystem = reinterpret_cast<CVScriptGameSystem*>(v_script_system_ptr3);
        }

        static std::uintptr_t v_script_vm = g_tools->FindPatternInModule("client.dll",
                                                                         "41 FF 50 58 48 89 05 ? ? ? ?", "Lua_Engine").self_offset(0x4);

        if (v_script_vm && g_scriptvm == nullptr)
            g_scriptvm = *reinterpret_cast<IScriptVM**>(g_tools->GetAbsoluteAddress(v_script_vm));
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
Что такое self_offset? типо к v_script_game_sytem_ptr 0x4 прибавить?
у них есть чек и если ты хочешь в ММ юзать, нужно патчить.
Можешь рассказать, где нужно патчить, или искать проверки на это?
А ещё почему GetAbsoluteAddress только один аргумент принимает?
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Что такое self_offset? типо к v_script_game_sytem_ptr 0x4 прибавить?

Можешь рассказать, где нужно патчить, или искать проверки на это?
А ещё почему GetAbsoluteAddress только один аргумент принимает?
Все верно, прибавить 0x4.

На счет патча, я не смотрел ибо для моих вещей нужна полноценная луа система, а не обрезок из движка, поэтому отказался от этой идеи. Так что сори.

А как часто ты, что-то другое прописываешь в GetAbsoluteAddress кроме 3, 7 как арг? Поэтому я сделал

C++:
GetAbsoluteAddress(std::uintptr_t addr, std::uintptr_t offset = 3, stdd::uintptr_t size = 7)
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
Все верно, прибавить 0x4.

На счет патча, я не смотрел ибо для моих вещей нужна полноценная луа система, а не обрезок из движка, поэтому отказался от этой идеи. Так что сори.

А как часто ты, что-то другое прописываешь в GetAbsoluteAddress кроме 3, 7 как арг? Поэтому я сделал

C++:
GetAbsoluteAddress(std::uintptr_t addr, std::uintptr_t offset = 3, stdd::uintptr_t size = 7)
Cтранно, я вот так вот сделал, по паттерну находит, а вот IScriptVM нет.
1655477555203.png
В отладчике по этому паттерну вот это:1655477837870.png
А по паттерну инструкции ниже (mov qword ptr:ds[7FFD39BC7268], rax) вот эта ошибка:
1655478173659.png
А scriptSys = 0xcccccccccccccccc
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Cтранно, я вот так вот сделал, по паттерну находит, а вот IScriptVM нет.
Посмотреть вложение 208121
В отладчике по этому паттерну вот это:Посмотреть вложение 208126
А по паттерну инструкции ниже (mov qword ptr:ds[7FFD39BC7268], rax) вот эта ошибка:
Посмотреть вложение 208128
А scriptSys = 0xcccccccccccccccc
в демку зайди протести, будет не ноль. паттерн на инструкцию ниже тебе крашит потому что ты +4 прибавляешь(+4 был для инструкции которая call [r8+58]).
1655495047600.png
здесь на скрине тебе нужен адрес 7FFD363E6FB9. сига1 находит 7FFD363E6FB5, поэтому ты к результату прибавляешь 4(7FFD363E6FB5 + 4 = 7FFD363E6FB9). сига2 находит сразу 7FFD363E6FB9, поэтому ничего прибавлять не надо.

в случае того краша:
ты находишь 0x7FFD1E706FB9(адрес уже другой потому что ты игру перезапустил) по сиге2 и прибавляешь еще 4, получая адрес 0x7FFD1E706FBD. байты которые лежат начиная с этого адреса: 02 7E 03 48 85 C0 75 (как видно на скрине в коробках зеленых)
ты прибавляешь 3 в GetAbsoluteAddress и считываешь int, то есть 4 байта(и переворачиваешь = 0x 75 C0 85 48), прибавляешь это к адресу самой инструкции(0x7FFD1E706FBD) и прибавляешь к этому еще 7. в итоге получаешь 0x7FFD1E706FBD + 0x75C08548 + 7 = 7FFD9430F50C. потом ты считываешь оттуда и получаешь исключение.
1655478173659.png
в стокгольме в лоббаке(как и в пабе) правда эта виртуалка будет ноль(ибо она нахуй не нужна в пабе клиенту - это же для серверов предназначена апи VScript).
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Во-первых, насколько я помню, VScript нету в меню. Ты должен быть на сервере.
Во-вторых, в ММ его особо не поюзаешь, опять же, насколько я помню, у них есть чек и если ты хочешь в ММ юзать, нужно патчить.

Ну и последнее, это не факт, что рабочие сиги, ибо я их не обновлял месяц, но можешь попробовать:
C++:
        static std::uintptr_t v_script_game_sytem_ptr = g_tools->FindPatternInModule("client.dll",
            "40 53 56 57 48 83 EC 60 48 8B D9 48 8B FA", "Lua_Engine").self_offset(0x40);

        if (v_script_game_sytem_ptr && g_scriptgamesystem == nullptr)
        {
            // The compiler did some weird shit here to morph 2 vtables into one.
            // Just need to decrease thisptr by 0x10 to get to bigger vtable. (IGameSystem + CVScriptGameSystem) instead of just (CVScriptGameSystem).
            void* v_script_system_ptr2 = *reinterpret_cast<CVScriptGameSystem**>(g_tools->GetAbsoluteAddress(
                v_script_game_sytem_ptr));
            const auto v_script_system_ptr3 = reinterpret_cast<char*>(v_script_system_ptr2) - 0x10;

            g_scriptgamesystem = reinterpret_cast<CVScriptGameSystem*>(v_script_system_ptr3);
        }

        static std::uintptr_t v_script_vm = g_tools->FindPatternInModule("client.dll",
                                                                         "41 FF 50 58 48 89 05 ? ? ? ?", "Lua_Engine").self_offset(0x4);

        if (v_script_vm && g_scriptvm == nullptr)
            g_scriptvm = *reinterpret_cast<IScriptVM**>(g_tools->GetAbsoluteAddress(v_script_vm));
не знаю ты ли этот коммент писал или ты его скопипастил, но для общего развития(не тебе так другим) пишу
// The compiler did some weird shit here to morph 2 vtables into one.
// Just need to decrease thisptr by 0x10 to get to bigger vtable. (IGameSystem + CVScriptGameSystem) instead of just (CVScriptGameSystem).
это не "weird shit". это называется multiple inheritance. и это не просто "bigger vtable" это совершенно другая втейбла(втейбла IGameSystem. ну и там еще лежат дополнительные новые вфунки которые есть в дочерних классах(CVscriptGameSystem, CDOTAVScriptGameSystem) если таковые имеются). во второй же вмт лежат вфунки IVScriptGameSystem.
первая вмт наследована от первой базы(IGameSystem. и также наследованы ее члены), после этого уже вторая вмт наследована от второй базы(и члены второй базы. я так понимаю их нет судя по названию IVScriptGameSystem ибо I это префикс для интерфейса а интерфейс это тупо вмт и больше ничего как правило).
ну если быть супер точным то ващето наследование вот такое:
CDOTAVScriptGameSystem extends CVScriptGameSystem;
CVScriptGameSystem implements IGameSystem, IVScriptGameSystem;
1655495850300.png
вот твоя сига это как раз указатель на порцию второго родителя, IVScriptGameSystem( = static_cast<IVScriptGameSystem*>(vscript_system)).
-0x10 это уже будет указатель на порцию первого родителя IGameSystem(и заодно на CDOTAVScriptGameSystem т.к. это самый первый родитель а объект начинается с первого родителя.)
также все геймсистемы можно получать чисто по названию(в этом дампе как раз я так и дампил все геймсистемы пачкой https://yougame.biz/threads/139802/page-4#post-2582709) сделав сигу на линкед лист геймсистем(в сурс1 движке то же самое токо там не таблица а массив), голова этого листа называется CBaseGameSystemFactory::sm_pFirst(дилибы в помощь)

вот прога с примером multiple inheritance
1655497654900.png
1655497677300.png
тут в первой вмт(вмт от Base1 + виртуалки от MITest) лежат
Base1::test1(наследована от Base1, без изменений)
MITest::test3(новая вфунка)
во второй вмт(вмт от Base2) лежат
MITest::test2(наследована от Base2 и заоверрайжена)
C++:
#include <iostream>

struct Base1
{
    const char* test = "shit";
    virtual const char* test1() { return "test1"; }
};

struct Base2
{
    virtual const char* test2() { return "test2"; }
};

struct MITest : Base1, Base2 
{
    virtual const char* test3() { return "test3"; }
    const char* test2() override { return "test2 override"; }
};

int main()
{
    MITest test{};
    std::cout << "derived object ptr:" << &test << std::endl;
    std::cout << "base1 object ptr:" << &static_cast<Base1&>(test) << std::endl;
    std::cout << "base2 object ptr:" << &static_cast<Base2&>(test) << std::endl;
    system("pause");
}
derived object ptr:0000004125EFF638
base1 object ptr:0000004125EFF638
base2 object ptr:0000004125EFF648
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
не знаю ты ли этот коммент писал или ты его скопипастил, но для общего развития(не тебе так другим) пишу
// The compiler did some weird shit here to morph 2 vtables into one.
// Just need to decrease thisptr by 0x10 to get to bigger vtable. (IGameSystem + CVScriptGameSystem) instead of just (CVScriptGameSystem).
это не "weird shit". это называется multiple inheritance. и это не просто "bigger vtable" это совершенно другая втейбла(втейбла IGameSystem. ну и там еще лежат дополнительные новые вфунки которые есть в дочерних классах(CVscriptGameSystem, CDOTAVScriptGameSystem) если таковые имеются). во второй же вмт лежат вфунки IVScriptGameSystem.
первая вмт наследована от первой базы(IGameSystem. и также наследованы ее члены), после этого уже вторая вмт наследована от второй базы(и члены второй базы. я так понимаю их нет судя по названию IVScriptGameSystem ибо I это префикс для интерфейса а интерфейс это тупо вмт и больше ничего как правило).
ну если быть супер точным то ващето наследование вот такое:
CDOTAVScriptGameSystem extends CVScriptGameSystem;
CVScriptGameSystem implements IGameSystem, IVScriptGameSystem;
Посмотреть вложение 208172
вот твоя сига это как раз указатель на порцию второго родителя, IVScriptGameSystem( = static_cast<IVScriptGameSystem*>(vscript_system)).
-0x10 это уже будет указатель на порцию первого родителя IGameSystem(и заодно на CDOTAVScriptGameSystem т.к. это самый первый родитель а объект начинается с первого родителя.)
также все геймсистемы можно получать чисто по названию(в этом дампе как раз я так и дампил все геймсистемы пачкой https://yougame.biz/threads/139802/page-4#post-2582709) сделав сигу на линкед лист геймсистем(в сурс1 движке то же самое токо там не таблица а массив), голова этого листа называется CBaseGameSystemFactory::sm_pFirst(дилибы в помощь)

вот прога с примером multiple inheritance
Посмотреть вложение 208185
Посмотреть вложение 208186
тут в первой вмт(вмт от Base1 + виртуалки от MITest) лежат
Base1::test1(наследована от Base1, без изменений)
MITest::test3(новая вфунка)
во второй вмт(вмт от Base2) лежат
MITest::test2(наследована от Base2 и заоверрайжена)
C++:
#include <iostream>

struct Base1
{
    const char* test = "shit";
    virtual const char* test1() { return "test1"; }
};

struct Base2
{
    virtual const char* test2() { return "test2"; }
};

struct MITest : Base1, Base2
{
    virtual const char* test3() { return "test3"; }
    const char* test2() override { return "test2 override"; }
};

int main()
{
    MITest test{};
    std::cout << "derived object ptr:" << &test << std::endl;
    std::cout << "base1 object ptr:" << &static_cast<Base1&>(test) << std::endl;
    std::cout << "base2 object ptr:" << &static_cast<Base2&>(test) << std::endl;
    system("pause");
}
derived object ptr:0000004125EFF638
base1 object ptr:0000004125EFF638
base2 object ptr:0000004125EFF648
Было спащено наглым образом и я не обращал на этот комент так критично, кроме как, что надо минус сделать для фулл таблицы. Я это спастил еще когда только начинал заниматься дотой, не ебу как давно, мб год назад, а то и больше, когда зашла мысля об луа апи. Поставил бы тебе лайкусь за разьеснение для маленьких, да нету пока возможности.

Про IGameSystems - я знаю, у меня тоже в сдк гене оно есть. Вообще, IGameSystem нужен обязательно, если планируешь хейк кодить (я так лично считаю), уж слишком я много интересного цепляю оттуда.
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
Попробовал сделать через CVScriptGameSystem, находит его, но после g_scriptgamesystem->RunScript("test"); появляется вот такое исключение.
1655530330205.png
в x64dbg также:
1655530396303.png
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Попробовал сделать через CVScriptGameSystem, находит его, но после g_scriptgamesystem->RunScript("test"); появляется вот такое исключение.
Посмотреть вложение 208223
в x64dbg также:
Посмотреть вложение 208224
Индекс таблицы верный?

Это ласт сурсы моей таблицы, но она скорее всего не верная, но кто знает.

C++:
class CVScriptGameSystem
{
public:
    virtual void IGameSystem__Init(void) = 0;
    virtual void IGameSystem__PostInit(void) = 0;
    virtual void IGameSystem__Shutdown(void) = 0;
    virtual void CVScriptGameSystem__GameInit(void* EventGameInit_t) = 0;
    virtual void CVScriptGameSystem__GameShutdown(void* EventGameShutdown_t) = 0;
    virtual void sub_27924A0() = 0; // All these functions are empty void functions.
    virtual void sub_27924B0() = 0; // they aren't that great
    virtual void sub_285D370() = 0;
    virtual void sub_27924D0() = 0;
    virtual void sub_27924E0() = 0;
    virtual void sub_27924F0() = 0;
    virtual void sub_2792500() = 0;
    virtual void sub_2792510() = 0;
    virtual void sub_2792520() = 0;
    virtual void sub_2792530() = 0;
    virtual void sub_2792540() = 0;
    virtual void sub_2792550() = 0;
    virtual void sub_2792560() = 0;
    virtual void sub_2792570() = 0;
    virtual void sub_2792580() = 0;
    virtual void sub_2792590() = 0;
    virtual void sub_27925A0() = 0;
    virtual void sub_27925B0() = 0;
    virtual void sub_27925C0() = 0;
    virtual void sub_27925D0() = 0;
    virtual void sub_27925E0() = 0;
    virtual void sub_27925F0() = 0;
    virtual void sub_27925F2() = 0;
    virtual void sub_27925F3() = 0;
    virtual void sub_27925F4() = 0;
    virtual void OnServerGamePostSimulate(void* EventServerGamePostSimulate_t) = 0;
    virtual void OnClientGamePostSimulate(void* EventClientGamePostSimulate_t) = 0;
    virtual void FrameBoundary(void* EventGameFrameBoundary_t) = 0;
    virtual void OutOfGameFrameBoundary(void* EventOutOfGameFrameBoundary_t) = 0;
    virtual void SaveGame(void* EventSaveGame_t) = 0;
    virtual void RestoreGame(void* EventRestoreGame_t) = 0;
    virtual void sub_unkw() = 0;
    virtual const char* GetName(void) = 0;
    virtual void SetGameSystemGlobalPtrs(void* addr) = 0;
    virtual void SetName(const char* name) = 0;
    virtual bool DoesGameSystemReallocate(void) = 0;
    virtual void Destroy1() = 0;
    virtual void Destroy2() = 0;
    virtual void YouForgot_DECLARE_GAME_SYSTEM_InYourClassDefinition() = 0;
    virtual void VScriptInit(void) = 0;
    virtual void VScriptTerm(void) = 0;
    virtual bool IsVScriptInitialized(void) = 0;
    virtual bool IsEntityCreationAllowedInScripts(void) = 0;
    virtual void sub_unkw1() = 0;
    virtual void* GetVM(void) = 0;
    virtual void CompileScript(const char* name, bool unk) = 0;
    virtual void RunScript(const char* name) = 0;
    virtual void RunScript(const char* name, bool unk) = 0;
    virtual void RunScript(const char* name, HSCRIPT scope, bool unk) = 0;
    virtual HSCRIPT FetchCachedScriptScope(const char* name) = 0;
    virtual void ClearCachedScripts(void) = 0;
    virtual void ReloadCachedScripts(void) = 0;
    virtual void RegisterGameEventListenersInScope(HSCRIPT scope) = 0;
    virtual void UnRegisterGameEventListenersInScope(HSCRIPT scope) = 0;
    virtual void ClearScriptGameEventListeners(void) = 0;
    virtual int GetScriptLanguage(void) = 0; // I think lua is #1?
    virtual void InstallScriptBindings(void) = 0;
    // Registers all the available commands the scripting language can use.
    virtual void RemoveScriptBindings(void) = 0; // unregisters all commands. ^^
};
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
Индекс таблицы верный?

Это ласт сурсы моей таблицы, но она скорее всего не верная, но кто знает.

C++:
class CVScriptGameSystem
{
public:
    virtual void IGameSystem__Init(void) = 0;
    virtual void IGameSystem__PostInit(void) = 0;
    virtual void IGameSystem__Shutdown(void) = 0;
    virtual void CVScriptGameSystem__GameInit(void* EventGameInit_t) = 0;
    virtual void CVScriptGameSystem__GameShutdown(void* EventGameShutdown_t) = 0;
    virtual void sub_27924A0() = 0; // All these functions are empty void functions.
    virtual void sub_27924B0() = 0; // they aren't that great
    virtual void sub_285D370() = 0;
    virtual void sub_27924D0() = 0;
    virtual void sub_27924E0() = 0;
    virtual void sub_27924F0() = 0;
    virtual void sub_2792500() = 0;
    virtual void sub_2792510() = 0;
    virtual void sub_2792520() = 0;
    virtual void sub_2792530() = 0;
    virtual void sub_2792540() = 0;
    virtual void sub_2792550() = 0;
    virtual void sub_2792560() = 0;
    virtual void sub_2792570() = 0;
    virtual void sub_2792580() = 0;
    virtual void sub_2792590() = 0;
    virtual void sub_27925A0() = 0;
    virtual void sub_27925B0() = 0;
    virtual void sub_27925C0() = 0;
    virtual void sub_27925D0() = 0;
    virtual void sub_27925E0() = 0;
    virtual void sub_27925F0() = 0;
    virtual void sub_27925F2() = 0;
    virtual void sub_27925F3() = 0;
    virtual void sub_27925F4() = 0;
    virtual void OnServerGamePostSimulate(void* EventServerGamePostSimulate_t) = 0;
    virtual void OnClientGamePostSimulate(void* EventClientGamePostSimulate_t) = 0;
    virtual void FrameBoundary(void* EventGameFrameBoundary_t) = 0;
    virtual void OutOfGameFrameBoundary(void* EventOutOfGameFrameBoundary_t) = 0;
    virtual void SaveGame(void* EventSaveGame_t) = 0;
    virtual void RestoreGame(void* EventRestoreGame_t) = 0;
    virtual void sub_unkw() = 0;
    virtual const char* GetName(void) = 0;
    virtual void SetGameSystemGlobalPtrs(void* addr) = 0;
    virtual void SetName(const char* name) = 0;
    virtual bool DoesGameSystemReallocate(void) = 0;
    virtual void Destroy1() = 0;
    virtual void Destroy2() = 0;
    virtual void YouForgot_DECLARE_GAME_SYSTEM_InYourClassDefinition() = 0;
    virtual void VScriptInit(void) = 0;
    virtual void VScriptTerm(void) = 0;
    virtual bool IsVScriptInitialized(void) = 0;
    virtual bool IsEntityCreationAllowedInScripts(void) = 0;
    virtual void sub_unkw1() = 0;
    virtual void* GetVM(void) = 0;
    virtual void CompileScript(const char* name, bool unk) = 0;
    virtual void RunScript(const char* name) = 0;
    virtual void RunScript(const char* name, bool unk) = 0;
    virtual void RunScript(const char* name, HSCRIPT scope, bool unk) = 0;
    virtual HSCRIPT FetchCachedScriptScope(const char* name) = 0;
    virtual void ClearCachedScripts(void) = 0;
    virtual void ReloadCachedScripts(void) = 0;
    virtual void RegisterGameEventListenersInScope(HSCRIPT scope) = 0;
    virtual void UnRegisterGameEventListenersInScope(HSCRIPT scope) = 0;
    virtual void ClearScriptGameEventListeners(void) = 0;
    virtual int GetScriptLanguage(void) = 0; // I think lua is #1?
    virtual void InstallScriptBindings(void) = 0;
    // Registers all the available commands the scripting language can use.
    virtual void RemoveScriptBindings(void) = 0; // unregisters all commands. ^^
};
Cпасибо, всё заработало)
 
Сверху Снизу