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

AdCKuY_DpO4uLa

Известный
287
477
Как поставить хук на входящие RPC? Такой код крашит
C++:
void HandleRPCPacketFunc(unsigned char id, RPCParameters *rpcParams, void(*callback) (RPCParameters *))
{
    if (rpcParams != nullptr && rpcParams->numberOfBitsOfData >= 8)
    {
        switch (id)
        {
            case 93: {
                pSAMP->addMessageToChat(-1, "chat msg");
                break;
            }
        }
    }
    callback(rpcParams);
}

uint8_t _declspec (naked) hook_handle_rpc_packet(void)
{
    static RPCParameters *pRPCParams = nullptr;
    static RPCNode_ *pRPCNode = nullptr;
    static DWORD dwTmp = 0;

    __asm pushad;
    __asm mov pRPCParams, eax;
    __asm mov pRPCNode, edi;

    HandleRPCPacketFunc(pRPCNode->uniqueIdentifier, pRPCParams, pRPCNode->staticFunctionPointer);
    dwTmp = pSAMP->g_SAMPAddr() + 0x37443;

    __asm popad;
    __asm add esp, 4 // overwritten code
    __asm jmp dwTmp;
}


Memory::CreateJump((BYTE*)(pSAMP->g_SAMPAddr() + 0xFF5701), (DWORD)&hook_handle_rpc_packet, 6U);

CreateJump:
C++:
void Memory::CreateJump(BYTE* pAddress, DWORD dwJumpTo, DWORD dwLen)
{
    DWORD dwOldProtect, dwBkup, dwRelAddr;
    VirtualProtect(pAddress, dwLen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
    dwRelAddr = (DWORD)(dwJumpTo - (DWORD)pAddress) - 5;
    *pAddress = 0xE9;
    *((DWORD*)(pAddress + 0x1)) = dwRelAddr;
    for (DWORD x = 0x5; x < dwLen; x++)*(pAddress + x) = 0x90;
    VirtualProtect(pAddress, dwLen, dwOldProtect, &dwBkup);
    return;
}

Уже разобрался. Инициализация такая:
C++:
BYTE *bytes = (BYTE*)"\xFF\x57\x01";
Memory::memcmp_safe((uint8_t *)pSAMP->g_SAMPAddr() + 0x3743D, bytes, 3);
Memory::CreateJump((BYTE*)(pSAMP->g_SAMPAddr() + 0x3743D), (DWORD)&hook_handle_rpc_packet, 6U);
 

waffelo

Новичок
27
7
Добрый вечер, подскажите каким способом можно извлекать из pe файла ресурсы, к примеру dll и дропать её в temp файлы
 

AdCKuY_DpO4uLa

Известный
287
477
хз, мб как-то и связан, CPed же можно по иду получить
C++:
CPed *ped = CPools::GetPed(pSAMP->getPlayers()->pRemotePlayer[playerID]->pPlayerData->pSAMP_Actor->ulGTAEntityHandle);
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,712
хз, мб как-то и связан, CPed же можно по иду получить
C++:
CPed *ped = CPools::GetPed(pSAMP->getPlayers()->pRemotePlayer[playerID]->pPlayerData->pSAMP_Actor->ulGTAEntityHandle);
потому что самп хранит эту информацию
Гта про самп вообще не знает, просто работает в обычном для себя режиме
 
  • Нравится
Реакции: sc6ut

AdCKuY_DpO4uLa

Известный
287
477
Мб кому-то пригодится. Спасибо всем за ответы
C++:
unsigned __int16 stPlayerPool::GetPlayerIDFromCPed(CPed *pPed) {
    if (pPed == FindPlayerPed())
        return pSAMP->getPlayers()->sLocalPlayerID;

    for (unsigned __int16 i = 0; i != SAMP_MAX_PLAYERS; i++) {
        if (!pSAMP->getPlayers()->IsPlayerStreamed(i))
            continue;
        if (pPed == (CPed*)pSAMP->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped)
            return i;
    }
    return 0xFFFF;
}
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
597
819
1617107525639.png

1617107531863.png

Проходит несколько педов и выдаёт access violation на target_position.
 

waffelo

Новичок
27
7
Вопрос: Можно ли задать координаты ImGui::Image, если да то как.
Возможный ответ: Использовать setcursorpos?
 
  • Нравится
Реакции: pasqenss