Как поймать внутриигровое событие в SAMPFUNCS?

Ya Zaregalsya

Известный
Автор темы
371
131
1) Да, объяснил ниже.
2) Ты не так разбил по папкам. Надо иначе, ниже объяснил.

Проект с гитхаба тебе нужно просто распаковать в любую другою папку. Но не в проект! И уж тем более не в SDK. SDK - это софт для разработки. Грубо говоря зависимости. Эта папка для зависимостей. А уже в ней есть папки MinHook и в ней Libs и includes. Ты должен собрать либу, которая у тебя должна быть абсолютно в другой папке. После чего ты получаешь файл либы и ищешь в папке github проекта хидер файлы .h. Их ты раскидываешь УЖЕ В СВОЙ проект в папку зависимостей - в нашем случае SDK/MinHook/Libs (для .lib), а SDK/MinHook/includes (для .h).

Почему в build2.0 не появилось файла sln? Перепроверьте то, как вы указали пути в Cmake. Там где source - там должен быть путь до папки github проекта. Там где папка для сбилженых бинарников - там указываешь тот же путь, но создаешь новую папку (но она вроде и сама должна создаться). Например build2.0.
Далее конфигурируешь через кнопку configure, там выбираешь версию vs которая у тебя стоит. После конфигурации нажимаешь Generate. Смотришь в лог снизу, чтобы было всё окей. Далее идешь в папку и там ищешь sln. Всё, дальше всё в гайде.
И на будущее. Обязательно ли проводить все эти манипуляции с CMake если есть готовые .sln и .lib файлы из проекта другого разработчика, как в данном случае?
 

legendabrn

Известный
Проверенный
122
172
Код:
urmem::hook urmemHookAimingCoords;
void __fastcall UpdateAimingCoors(void* _this, void* edx, CVector const* AimingTargetCoors)
{
    SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors");
    SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors. posX: %f; posY: %f; posZ: %f",
        AimingTargetCoors->fX,
        AimingTargetCoors->fY,
        AimingTargetCoors->fZ);
    urmemHookAimingCoords.call<urmem::calling_convention::thiscall, void>(_this, AimingTargetCoors);
}

urmem::hook urmemHookDoBulletImpact;
void __fastcall DoBulletImpact(void* _this, void* edx, CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint,CColPoint* colPoint, int arg5)
{
    SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact");
    SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact. posX: %f; posY: %f; posZ: %f",
        endPoint->fX,
        endPoint->fY,
        endPoint->fZ);
    urmemHookDoBulletImpact.call<urmem::calling_convention::thiscall, void>(_this, owner, victim, startPoint, endPoint, colPoint, arg5);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
    case DLL_PROCESS_ATTACH:
        SF->initPlugin(mainloop, hModule);
        urmemHookAimingCoords.install(0x50CB10, urmem::get_func_addr(&UpdateAimingCoors));
        urmemHookDoBulletImpact.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        urmemHookAimingCoords.disable();
        urmemHookDoBulletImpact.disable();
        break;
    }
    return TRUE;
}
так же посмотри какой там пролог, по стандарту должен быть 5
 
  • Нравится
Реакции: Ya Zaregalsya

Ya Zaregalsya

Известный
Автор темы
371
131
Код:
urmem::hook urmemHookAimingCoords;
void __fastcall UpdateAimingCoors(void* _this, void* edx, CVector const* AimingTargetCoors)
{
    SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors");
    SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors. posX: %f; posY: %f; posZ: %f",
        AimingTargetCoors->fX,
        AimingTargetCoors->fY,
        AimingTargetCoors->fZ);
    urmemHookAimingCoords.call<urmem::calling_convention::thiscall, void>(_this, AimingTargetCoors);
}

urmem::hook urmemHookDoBulletImpact;
void __fastcall DoBulletImpact(void* _this, void* edx, CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint,CColPoint* colPoint, int arg5)
{
    SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact");
    SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact. posX: %f; posY: %f; posZ: %f",
        endPoint->fX,
        endPoint->fY,
        endPoint->fZ);
    urmemHookDoBulletImpact.call<urmem::calling_convention::thiscall, void>(_this, owner, victim, startPoint, endPoint, colPoint, arg5);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
    case DLL_PROCESS_ATTACH:
        SF->initPlugin(mainloop, hModule);
        urmemHookAimingCoords.install(0x50CB10, urmem::get_func_addr(&UpdateAimingCoors));
        urmemHookDoBulletImpact.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        urmemHookAimingCoords.disable();
        urmemHookDoBulletImpact.disable();
        break;
    }
    return TRUE;
}
так же посмотри какой там пролог, по стандарту должен быть 5
Пролог?
 

Musaigen

abobusnik
Проверенный
1,582
1,301
С Redirect хуками мы разобрались, теперь расскажу о Trampoline.
Trampoline от Redirect кардинально отличается. Если Redirect просто подменяет релативный адрес команды вызова или прыжка, то Trampoline взаимодействует с прологом функции.
Что такое пролог функции? Пролог функции - первые несколько байт функции, которые подготавливают стек, пушат регистры.
У пролога есть свой эпилог. Эпилог отличается тем, что он располагается в конце функции, и восстанавливает стек и регистры до того состояния, которое было до вызова.
Расскажу на примере функции void __cdecl CTimer__Update(void):

1596368331558.png


Логика трамплин хука заключается в том, чтобы этот самый пролог сохранить в отдельную функцию, занопить весь пролог, поставить там прыжок на нашу функцию, в нашей функции вызвать ту, в которой мы сохранили пролог, и вдобавок приписать туда прыжок обратно.
Получается так: вместо пролога, jmp -> наша_функция -> jmp трамплин -> jmp обратно (+1, чтобы не было рекурсии).
 
  • Нравится
Реакции: Ya Zaregalsya