Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Во-первых, насколько я помню, 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));
в демку зайди протести, будет не ноль. паттерн на инструкцию ниже тебе крашит потому что ты +4 прибавляешь(+4 был для инструкции которая call [r8+58]).
здесь на скрине тебе нужен адрес 7FFD363E6FB9. сига1 находит 7FFD363E6FB5, поэтому ты к результату прибавляешь 4(7FFD363E6FB5 + 4 = 7FFD363E6FB9). сига2 находит сразу 7FFD363E6FB9, поэтому ничего прибавлять не надо.
в случае того краша:
ты находишь 0x7FFD1E706FB9(адрес уже другой потому что ты игру перезапустил) по сиге2 и прибавляешь еще 4, получая адрес 0x7FFD1E706FBD. байты которые лежат начиная с этого адреса: 02 7E 034885C0 75 (как видно на скрине в коробках зеленых)
ты прибавляешь 3 в GetAbsoluteAddress и считываешь int, то есть 4 байта(и переворачиваешь = 0x 75C08548), прибавляешь это к адресу самой инструкции(0x7FFD1E706FBD) и прибавляешь к этому еще 7. в итоге получаешь 0x7FFD1E706FBD + 0x75C08548 + 7 = 7FFD9430F50C. потом ты считываешь оттуда и получаешь исключение.
в стокгольме в лоббаке(как и в пабе) правда эта виртуалка будет ноль(ибо она нахуй не нужна в пабе клиенту - это же для серверов предназначена апи VScript).
Во-первых, насколько я помню, 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;
вот твоя сига это как раз указатель на порцию второго родителя, IVScriptGameSystem( = static_cast<IVScriptGameSystem*>(vscript_system)).
-0x10 это уже будет указатель на порцию первого родителя IGameSystem(и заодно на CDOTAVScriptGameSystem т.к. это самый первый родитель а объект начинается с первого родителя.)
также все геймсистемы можно получать чисто по названию(в этом дампе как раз я так и дампил все геймсистемы пачкой https://yougame.biz/threads/139802/page-4#post-2582709) сделав сигу на линкед лист геймсистем(в сурс1 движке то же самое токо там не таблица а массив), голова этого листа называется CBaseGameSystemFactory::sm_pFirst(дилибы в помощь)
вот прога с примером multiple inheritance
тут в первой вмт(вмт от Base1 + виртуалки от MITest) лежат
Base1::test1(наследована от Base1, без изменений)
MITest::test3(новая вфунка)
во второй вмт(вмт от Base2) лежат
MITest::test2(наследована от Base2 и заоверрайжена)
не знаю ты ли этот коммент писал или ты его скопипастил, но для общего развития(не тебе так другим) пишу
// 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 и заоверрайжена)
Было спащено наглым образом и я не обращал на этот комент так критично, кроме как, что надо минус сделать для фулл таблицы. Я это спастил еще когда только начинал заниматься дотой, не ебу как давно, мб год назад, а то и больше, когда зашла мысля об луа апи. Поставил бы тебе лайкусь за разьеснение для маленьких, да нету пока возможности.
Про IGameSystems - я знаю, у меня тоже в сдк гене оно есть. Вообще, IGameSystem нужен обязательно, если планируешь хейк кодить (я так лично считаю), уж слишком я много интересного цепляю оттуда.
Попробовал сделать через CVScriptGameSystem, находит его, но после g_scriptgamesystem->RunScript("test"); появляется вот такое исключение. Посмотреть вложение 208223
в x64dbg также: Посмотреть вложение 208224