Другое С/С++ Вопрос - Ответ

forgit

Новичок
3
1
как вызывать такое окно для перезапуска программы с правами администратора
startadmin.jpg
 

writeline

Новичок
28
9
как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
При загрузке плагина добавь проверку наличия "ключа" в строке запуска сампа, при наличии твоего IP будет выполнятся функция, если же его не будет то самп запустится как обычно.
с++:
BOOL APIENTRY DllEntryPoint(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        TCHAR* cmdline = GetCommandLine();
        if (StrStr(cmdline, "127.0.0.1:7777")) {
        // ТУТ ТВОЙ КОД
        }
    }
    return TRUE;
    LoadLibrary("samp.dll");
}
 

вайега52

Налуашил состояние
Модератор
2,996
3,125
как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
При загрузке плагина добавь проверку наличия "ключа" в строке запуска сампа, при наличии твоего IP будет выполнятся функция, если же его не будет то самп запустится как обычно.
с++:
BOOL APIENTRY DllEntryPoint(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        TCHAR* cmdline = GetCommandLine();
        if (StrStr(cmdline, "127.0.0.1:7777")) {
        // ТУТ ТВОЙ КОД
        }
    }
    return TRUE;
    LoadLibrary("samp.dll");
}
Можно хукнуть метод RakClient, отвечающий за подключение к серверу
C++:
#include "kthook/kthook.hpp"



using RakClientConnect_t = bool(__thiscall*)(void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer);
kthook::kthook_simple<RakClientConnect_t>(RakClientConnectHook);



bool RakClientConnectHooked(const decltype(RakClientConnectHook)& hook, void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer)
{
    if (strcmp(host, "127.0.0.1") == 0))
        std::cout << "Ochko anus rvat ebat" << std::endl;
    else
        std::cout << "Ne chunazes" << std::endl;


    return hook.get_trampoline()(pRakClient, host, serverPort, clientPort, depreciated, threadSleepTimer);
}



auto SAMPHandle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
RakClientConnectHook.set_cb(&RakClientHooked);
RakClientConnectHook.set_dest(SAMPHandle + 0x339F0); // R3
RakClientConnectHook.install();

Еще к примеру можно хукать какую-нибудь функцию из winsock (получать адрес экпортируемой функции из Ws2_32.dll), но тогда есть вероятность. то функция вызвана не из samp.dll, а например из какого-то плагина
 
Последнее редактирование:
  • Нравится
Реакции: writeline и 0x73616D

vmprotect

Известный
395
272
Можно хукнуть метод RakClient, отвечающий за подключение к серверу
C++:
#include "kthook/kthook.hpp"



using RakClientConnect_t = bool(__thiscall*)(void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer);
kthook::kthook_simple<RakClientConnect_t>(RakClientConnectHook);



bool RakClientConnectHooked(const decltype(RakClientConnectHook)& hook, void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer)
{
    if (strcmp(host, "127.0.0.1") == 0))
        std::cout << "Ochko anus rvat ebat" << std::endl;
    else
        std::cout << "Ne chunazes" << std::endl;


    return hook.get_trampoline()(pRakClient, host, serverPort, clientPort, depreciated, threadSleepTimer);
}



auto SAMPHandle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
RakClientConnectHook.set_cb(&RakClientHooked);
RakClientConnectHook.set_dest(SAMPHandle + 0x339F0); // R3
RakClientConnectHook.install();

Еще к примеру можно хукать какую-нибудь функцию из winsock (получать адрес экпортируемой функции из Ws2_32.dll), но тогда есть вероятность. то функция вызвана не из samp.dll, а например из какого-то плагина
а через rakclient можно создать коннект на другой айпи ?
 

вайега52

Налуашил состояние
Модератор
2,996
3,125
а через rakclient можно создать коннект на другой айпи ?
Если я правильно понимаю, ты хочешь изменить айпи при подключении в сампе?
Тогда ты можешь делать что-то типа такого
1714287161019.png
C++:
using NetGameConnect_t = int(__thiscall*)(std::uintptr_t* netgame);
kthook::kthook_simple<NetGameConnect_t> NetGameConnectHook;



// r3
NetGameConnectHook.set_dest(reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll")) + 0x85D0);
NetGameConnectHook.set_cb([](const decltype(NetGameConnectHook)& hook, std::uintptr_t* netgame)
{
    char* host = reinterpret_cast<char*>(*netgame + 0x30);
    strcpy(host, "127.0.0.1");

    *reinterpret_cast<int*>(*netgame + 0x235) = 7777;


    return hook.get_trampoline()(netgame);
});
NetGameConnectHook.install();
 

vmprotect

Известный
395
272
Если я правильно понимаю, ты хочешь изменить айпи при подключении в сампе?
Тогда ты можешь делать что-то типа такого
C++:
using NetGameConnect_t = int(__thiscall*)(std::uintptr_t* netgame);
kthook::kthook_simple<NetGameConnect_t> NetGameConnectHook;



// r3
NetGameConnectHook.set_dest(reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll")) + 0x85D0);
NetGameConnectHook.set_cb([](const decltype(NetGameConnectHook)& hook, std::uintptr_t* netgame)
{
    char* host = reinterpret_cast<char*>(*netgame + 0x30);
    strcpy(host, "127.0.0.1");

    *reinterpret_cast<int*>(*netgame + 0x235) = 7777;


    return hook.get_trampoline()(netgame);
});
NetGameConnectHook.install();
крашит, при попытке подключения
 

yorenov

Участник
64
62
Помогите за нажатием W, asi (псдк + сампапи), альтернатива setGameKeyState ((в луа)).
мои попытки успех не обрели, из под винды тыкать W бяка
 

inexplica

Известный
803
414
C++:
            float distance = bet.Length();
            if (distance >= 10)
            {
                bet.Normalize();
                c.fX += bet.fX * 3;
                c.fY += bet.fY * 3;
                c.fZ += bet.fZ * 3;
                sendVehicle(c);
                AddMessageJumpQ(reinterpret_cast<char*>(distance), 1500, 12, true);
                time = GetTickCount();
            }
выдаёт ошибку: недопустимое преобразование типа.
помогите решить пж
 
  • Клоун
Реакции: F0RQU1N and

F0RQU1N and

Известный
1,294
501
C++:
            float distance = bet.Length();
            if (distance >= 10)
            {
                bet.Normalize();
                c.fX += bet.fX * 3;
                c.fY += bet.fY * 3;
                c.fZ += bet.fZ * 3;
                sendVehicle(c);
                AddMessageJumpQ(reinterpret_cast<char*>(distance), 1500, 12, true);
                time = GetTickCount();
            }
выдаёт ошибку: недопустимое преобразование типа.
помогите решить пж
std::to_string{distance}.c_str()
 
  • Bug
Реакции: inexplica

Smeruxa

smeruxa.ru
Проверенный
1,431
789
Как перевести ImGuiKey в обычную клавишу int?
C++:
if (utils->isKeyPressed(static_cast<int>(gConfig->data["button"].get<ImGuiKey>()), 20))
Я уже по разному пробовал, как и метод GetKeyIndex имгуишный и т д, не знаю что делать