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

dekname

Участник
44
2
Без static'a же тоже можно сделать callback. Получить адрес через union и дописать this на текущий класс (thunk). Например так:

C++:
// union
union UnionCallbackCommand
{
    using ptr_t = void(SomeClass::*)(const char*);
    ptr_t ptr;
    uint64_t addr_as_uint64;
};

// получение адреса

m_union_cmd_callback.ptr = &SomeClass::Command;

// в private:

UnionCallbackCommand m_union_cmd_callback;

// регистрация команды:

m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_union_cmd_callback.addr_as_uint64);

// сам callback

void SomeClass::Command(const char* cmd)
{

}

Но так я получаю зависание игры, как можно пофиксить?
 

memir

🇷🇺
Всефорумный модератор
339
611
Без static'a же тоже можно сделать callback. Получить адрес через union и дописать this на текущий класс (thunk). Например так:

C++:
// union
union UnionCallbackCommand
{
    using ptr_t = void(SomeClass::*)(const char*);
    ptr_t ptr;
    uint64_t addr_as_uint64;
};

// получение адреса

m_union_cmd_callback.ptr = &SomeClass::Command;

// в private:

UnionCallbackCommand m_union_cmd_callback;

// регистрация команды:

m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_union_cmd_callback.addr_as_uint64);

// сам callback

void SomeClass::Command(const char* cmd)
{

}

Но так я получаю зависание игры, как можно пофиксить?
Действительно, делай static
Ебани __cdecl метод, дальше в тханке пушь указатель на свой объект, делай call на обработчик, затем вытаскивай запушеные четыре байта, ретайся (первым аргументом в обработчике придется сделать адрес возврата).
 
  • Нравится
Реакции: dekname

san0

Известный
Друг
411
268
кого опускает? кто он такой чтобы опускать? какое у него право?
Прямое право он имеет) https://en.wikipedia.org/wiki/As-if_rule https://en.cppreference.com/w/cpp/language/as_if
Как простой пример - https://godbolt.org/z/o9vsGr
memset растворился даже при минимальной оптимизации (-O(1))

Именно по этой причине в языке c++ существует такое большое количество неопределенных (иногда unspecified, или implementation-defined) поведений по типу порядка вычисления аргументов и множества других, а также есть ключевое слово volatile.

Плюс еще, для таких задач, как, например, эта с memset, есть специальные функции под платформы:
Win - SecureZeroMemory, BSD - explicit_bzero, Linux Kernel - memzero_explicit, OpenSSL - OPENSSL_cleanse и т.д.
Специальная версия функции в стандарте С11 memset_s - https://en.cppreference.com/w/c/string/byte/memset
И еще и флаги компиляторов по типу -fno-builtin-memset, или #pragma optimize("", off)
Ну и volatile

Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
Посмотрите еще этот ответ, вопрос был похожий - https://www.blast.hk/threads/781/page-294#post-439421
 

CleanLegend

Известный
Всефорумный модератор
477
935
Как проверить, запущен ли определенный процесс в диспетчере задач?
сканить все процессы через: Process32First и Process32Next.
если нужно именно работать с диспетчером, то инжектишь туда dll и уже хукаешь эти функции в нём.
 
  • Нравится
Реакции: Smeruxa

dekname

Участник
44
2
Действительно, делай static
Ебани __cdecl метод, дальше в тханке пушь указатель на свой объект, делай call на обработчик, затем вытаскивай запушеные четыре байта, ретайся (первым аргументом в обработчике придется сделать адрес возврата).
допустим callback я сделал для команды, но теперь мне нужен обработчик всех команд (detour по адресу base + 0x65A70). Т.е:

C++:
CMDPROC CInput::GetCommandHandler(const char* pName) {
    return ((CMDPROC(__thiscall*)(CInput*, const char*))GetAddress(0x65A70))(this, pName);
}

Сделал я так (для регистрации команд):

C++:
std::memcpy(&m_thunk[12], "\x55\x89\xe5\xff\x75\x08\xb9????\xb8????\xff\xd0\xc9\xc3", 20);
*(uintptr_t*)&m_thunk[19] = (uintptr_t)this;
*(uintptr_t*)&m_thunk[24] = m_union_cmd_callback.addr_as_uint64;

m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_thunk[12]);
 

Artem90

Новичок
11
0
1.Ваш вопрос : Как можно после загрузки игры отключить raknet или сделать так чтоб не подключался к серверу необходимое количество времени
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
1.Ваш вопрос : Как можно после загрузки игры отключить raknet или сделать так чтоб не подключался к серверу необходимое количество времени
Можно попробовать хукнуть функцию отправки через сокет(sendto или send), и отклонять отправку, пока не прошло необходимое кол-во времени.
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
315
666
После инициализации имгуи, вечно рисуется курсор (курсор винды)
C++:
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 16, NULL, ImGui::GetIO().Fonts->GetGlyphRangesCyrillic());
(void)io;
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(pDevice);
пробовать отключать через
C++:
ImGui::GetIO().MouseDrawCursor = 0;
не помогло
 
Последнее редактирование:

Romelo

dev.
Проверенный
540
626
После инициализации имгуи, вечно рисуется курсор (курсор винды)
C++:
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 16, NULL, ImGui::GetIO().Fonts->GetGlyphRangesCyrillic());
(void)io;
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(pDevice);
пробовать отключать через
C++:
ImGui::GetIO().MouseDrawCursor = 0;
не помогло
C++:
io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
 
  • Нравится
Реакции: sc6ut и AdCKuY_DpO4uLa

manukhov

Известный
125
131
Вот если в процессе два .dll модуля с одинаковым названием, как можно получить оба? По хэндлу все время только 1
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
315
666
у меня есть структура PlayerPool для R1
C++:
struct stPlayerPool
{
    uint32_t                MaxPlayerID;//???? not tested
    uint16_t                sLocalPlayerID;
    void                    *pVTBL_txtHandler;
    union
    {
        char    szLocalPlayerName[16];
        char    *pszLocalPlayerName;
    };
    int                        iLocalPlayerNameLen;
    int                        iLocalPlayerNameAllocated;
    struct stLocalPlayer    *pLocalPlayer;
    int                        iLocalPlayerPing;
    int                        iLocalPlayerScore;
    struct stRemotePlayer    *pRemotePlayer[SAMP_MAX_PLAYERS];
    int                        iIsListed[SAMP_MAX_PLAYERS];
    uint32_t                ulUnk1[SAMP_MAX_PLAYERS];
}
можете дать такую же структуру, но для R3?
 

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,948
3,211
у меня есть структура PlayerPool для R1
C++:
struct stPlayerPool
{
    uint32_t                MaxPlayerID;//???? not tested
    uint16_t                sLocalPlayerID;
    void                    *pVTBL_txtHandler;
    union
    {
        char    szLocalPlayerName[16];
        char    *pszLocalPlayerName;
    };
    int                        iLocalPlayerNameLen;
    int                        iLocalPlayerNameAllocated;
    struct stLocalPlayer    *pLocalPlayer;
    int                        iLocalPlayerPing;
    int                        iLocalPlayerScore;
    struct stRemotePlayer    *pRemotePlayer[SAMP_MAX_PLAYERS];
    int                        iIsListed[SAMP_MAX_PLAYERS];
    uint32_t                ulUnk1[SAMP_MAX_PLAYERS];
}
можете дать такую же структуру, но для R3?
C++:
enum { MAX_PLAYERS = 1004 };

int          m_nLargestId;
CPlayerInfo* m_pObject[MAX_PLAYERS];
BOOL         m_bNotEmpty[MAX_PLAYERS];
BOOL         m_bPrevCollisionFlag[MAX_PLAYERS];

struct SAMPAPI_EXPORT {
        int m_nPing;
        int m_nScore;
        ID  m_nId;
        std::string   m_szName;
        CLocalPlayer* m_pObject;
} m_localInfo;
 
  • Нравится
Реакции: AdCKuY_DpO4uLa