Исходник Dota-cheat | База под доту 2

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
от способа инжекта зависит. при некоторых способах инжекта деструктор не будет вызываться у статик инлайн объектов. поэтому и надо аккуратно руками контроллировать их жизнь и смерть(точнее жизнь и смерть оборачивающих объектов, например шема) а не глобалами делать. не все дефолтно инжектят. представь что ты когда-нибудь перейдешь на другой способ инжекта, думая что деструкторы вызываются, а по факту это будет нихуя не так. так что лучше щас пофиксить. глобалы - это иллюзия. ты реально хочешь сказать что твоя mapOffsets это глобальный объект который живёт пока живёт программа? нихуя подобного. он живет пока живёт шема. шема оживает = оживает мапа. шема умирает = умирает мапа. мапа находится В МАСШТАБЕ ШЕМЫ а не В ГЛОБАЛЬНОМ МАСШТАБЕ
МануалМап заставит тебя вручную вызывать деструктор этого класса при анлоаде, поскольку тебе в любом случае придется делать объект этого класса глобальным, чтобы иметь возможность им пользоваться отовсюду. Что мешает тебе так же вручную вызвать деструктор для мапы? Делать этот же объект локальным нету абсолютно смысла, ибо жить он должен во всех потоках игры, где он может использоваться хотя бы гипотетически.

Деструктор std::optional вызывается тогда же, когда и все остальные деструкторы, потому что это обычный объект. Не понимаю, о чем ты говоришь.

Отправлять объект в динамическую память или использовать Singleton - не лучший вариант. В первом случае тебе все еще нужно будет самому контролировать удаление объекта(Даже если он будет внутри std::unique_ptr, поскольку для него деструктор тоже не вызовется), а во втором случае у тебя и вовсе не будет контроля над тем, когда объект удаляется. Палка о двух концах

Так в данном случае я и принимаю критику. То, что я не проследил за инициализацией/выгрузкой имгуя - определенно мой косяк, доберусь до компа - поправлю(либо можете залить Pull Request на гитхаб). Да и сейчас я так же пытаюсь понять, чем в этом случае класс будет лучше пространства имен, но я попросту не вижу логики, так и так получится глобальный объект(максимум - с ограниченной областью видимости), который не будет вызывать свой деструктор во время выгрузке при инжекте через ManualMap
кстати еще возможный интересный вариант решения проблемы(мало ли кому пригодится) - ручной "анлоад" через вызов ентрипоинта(не нашего дллмейна а того который компилятор генерирует) с DLL_PROCESS_DETACH, он и при мануалмапе должен работать(при условии что инжектор нулями заголовок не затирает). хз какие у него могут быть изъяны, только поверхностно тестил
C++:
#include <Windows.h>

struct test
{
    test()
    {
        MessageBoxA(NULL, "CTOR", "test", MB_OK);
    }
    ~test()
    {
        MessageBoxA(NULL, "DTOR", "~test", MB_OK);
    }
};

test global{};

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH && hModule)
    {
        MessageBoxA(NULL, "DllMain", "DLL_PROCESS_ATTACH", MB_OK);
        IMAGE_DOS_HEADER& dos = (IMAGE_DOS_HEADER&)*hModule;
        IMAGE_NT_HEADERS& nt = (IMAGE_NT_HEADERS&)*((char*)hModule + dos.e_lfanew);
        auto entrypoint = (decltype(DllMain)*)
            *((char*)hModule + nt.OptionalHeader.AddressOfEntryPoint);
        entrypoint(hModule, DLL_PROCESS_DETACH, lpReserved);
    }
    return TRUE;
}
 
Сверху Снизу