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

Byte

Потрачен
115
32
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Кто-нибудь ставил нейкид хуки на линухе х86? Посоветуйте пожалуйста библиотеку, чтобы можно было вытаскивать регистры (можно даже не через саму либу, а через инлайн асм в нейкид функах)
 
  • Нравится
Реакции: вайега52

вайега52

Налуашил состояние
Модератор
2,995
3,124
А не подскажешь, как правильно изменить значение в eax (результат вызова функи) так, чтобы асм листинг не ломался (трамплинчик вроде называется)
1744654334791.png
 
Последнее редактирование:

Byte

Потрачен
115
32
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А не подскажешь, как правильно изменить значение в eax (результат вызова функи) так, чтобы асм листинг не ломался (трамплинчик вроде называется)
Посмотреть вложение 267822
C++:
#include <subhook.h>

subhook_t original_function_hook;
typedef int (*original_func_t)(/* параметры */);

int my_hook_function(/* параметры */) {
    // Получаем трамплин и вызываем оригинальную функцию
    int result = ((original_func_t)subhook_get_trampoline(original_function_hook))(/* параметры */);
    
    // Модифицируем результат (значение в eax)
    result = /* твоя модификация например result * 2 */;
    
    return result;
}

void setup_hook() {
    original_function_hook = subhook_new((void*)original_function, (void*)my_hook_function);
    subhook_install(original_function_hook);
}
 

вайега52

Налуашил состояние
Модератор
2,995
3,124
C++:
#include <subhook.h>

subhook_t original_function_hook;
typedef int (*original_func_t)(/* параметры */);

int my_hook_function(/* параметры */) {
    // Получаем трамплин и вызываем оригинальную функцию
    int result = ((original_func_t)subhook_get_trampoline(original_function_hook))(/* параметры */);
   
    // Модифицируем результат (значение в eax)
    result = /* твоя модификация например result * 2 */;
   
    return result;
}

void setup_hook() {
    original_function_hook = subhook_new((void*)original_function, (void*)my_hook_function);
    subhook_install(original_function_hook);
}
Если ставить хук на call, то оно крашит, ибо там 6 байт, я так понимаю, на инструкцию, а хукер меняет только 5, а если ставить позже, оно разве не должно работать с нейкид функой?
 

Byte

Потрачен
115
32
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Если ставить хук на call, то оно крашит, ибо там 6 байт, я так понимаю, на инструкцию, а хукер меняет только 5, а если ставить позже, оно разве не должно работать с нейкид функой?
а если хукнуть не сам call, а начало функции, на которую он указывает?
 

вайега52

Налуашил состояние
Модератор
2,995
3,124
а если хукнуть не сам call, а начало функции, на которую он указывает?
А мне надо хукать функцию только в одном месте вызова (она вызывается и в других участках кода, но нужен именно этот)
 

moreveal

Известный
988
719
А мне надо хукать функцию только в одном месте вызова (она вызывается и в других участках кода, но нужен именно этот)
хукни всю, и глянь адрес в конце стека, чтобы она соответствовала возврату на некст инструкцию после нужного тебе места хахахах, ну просто в сабхуке видимо иначе не сделать, если не дает размер указать

еще конкретно в твоем случае это vtable вроде, ничо не мешает прочесть поинтер что там лежал (в ECX+E8), взяв это за адрес оригинальной функи, и записать туда самого себя

можно кнш еще хук на байт позже ставить, но трамплин придется ручками чинить, что не круто
 
Последнее редактирование:
  • Нравится
Реакции: вайега52

вайега52

Налуашил состояние
Модератор
2,995
3,124
еще конкретно в твоем случае это vtable вроде, ничо не мешает прочесть поинтер что там лежал (в ECX+E8), взяв это за адрес оригинальной функи, и записать туда самого себ
тогда попробую стильный, молодежный ктхук (я, кстати. это вроде делал через проверку адреса возврата, но получалось криво), у него вроде проблема только с нейкид хуками
 
  • Нравится
Реакции: Byte и moreveal

vmprotect

Известный
395
272
пытаюсь поставить хук на UpdateNetwork, но когда отправляю ракнет пакеты ничего не работает
zalupa code:
void CNetGame__UpdateNetwork__HOOK(const decltype(CNetGame__UpdateNetwork_Hook) & hook, void * _this) {
  Packet * packet = nullptr;
  uint8_t * localdata = nullptr;
  uint8_t state {};

  for (packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive(); packet; packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive()) {
    localdata = packet -> data;

    switch (state) {
    localdata = packet->data;
    
    if(*localdata == 40) state = localdata[5];
    case 223: {
      RakNet::BitStream bs((unsigned char * ) packet -> data, packet -> length, false);

      uint8_t packetID;
      uint32_t rpcID;
      bs.Read(packetID);
      bs.Read(rpcID);

      if (rpcID == 15) {
        sampapi::v037r3::RefChat() -> AddChatMessage("я тормоз", 0xFFFFFFFF, "я тормоз");
        return;
      }
      break;
    }
    default:
      break;
    }
  }

  return hook.call_trampoline(_this);
}


void hooks::install_tormoz_updatenetwork_hook() {
    CNetGame__UpdateNetwork_Hook.set_dest(0xAF20);
    CNetGame__UpdateNetwork_Hook.set_cb(&CNetGame__UpdateNetwork__HOOK);
    CNetGame__UpdateNetwork_Hook.install();
}
 

vmprotect

Известный
395
272
оффсет от самп.длл должен идти
написал фулл функцию но коннект не происходит на сервер

C++:
using CNetGame__UpdateNetwork = void(__thiscall *)(void* _this);
kthook::kthook_simple<CNetGame__UpdateNetwork>CNetGame__UpdateNetwork_Hook;

void CNetGame__UpdateNetwork__HOOK(const decltype(CNetGame__UpdateNetwork_Hook)& hook, void* _this) {
    Packet* packet = nullptr;
    uint8_t* localdata = nullptr;
    uint8_t state{};

    for (packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive();
         packet && packet->data;
         packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive())
    {
        localdata = packet->data;

        if (*localdata == 40)
            state = localdata[5];

        switch (state) {
        case 12: {
            sampapi::v037r3::RefNetGame()->Packet_AuthKey(packet);
            break;
        }
        case 29: {
            sampapi::v037r3::RefChat()->AddMessage(0xFFFFFFFF, "Сервер не отвечает. Повторяем подключение");
            sampapi::v037r3::RefNetGame()->m_nGameState = 1;
            break;
        }
        case 31: {
            sampapi::v037r3::RefChat()->AddMessage(0xFFFFFFFF, "Сервер не отвечает. Повторяем подключение");
            break;
        }
        case 32: {
            sampapi::v037r3::RefNetGame()->Packet_DisconnectionNotification(packet);
            break;
        }
        case 33: {
            sampapi::v037r3::RefNetGame()->Packet_ConnectionLost(packet);
            break;
        }
        case 34: {
            sampapi::v037r3::RefNetGame()->Packet_ConnectionSucceeded(packet);
            break;
        }
        case 35: {
            sampapi::v037r3::RefChat()->AddMessage(0xFFFFFFFF, "Не удалось инициализировать шифрование.");
            break;
        }
        case 36: {
            sampapi::v037r3::RefChat()->AddMessage(0xFFFFFFFF, "Вы забанены на этом сервере.");
            break;
        }
        case 37: {
            sampapi::v037r3::RefChat()->AddMessage(0xFFFFFFFF, "Неправильный пароль.");
            sampapi::v037r3::RefNetGame()->m_pRakClient->Disconnect(0, 0);
            break;
        }
        case 200: {
            sampapi::v037r3::RefNetGame()->Packet_VehicleSync(packet);
            break;
        }
        case 203: {
            sampapi::v037r3::RefNetGame()->Packet_AimSync(packet);
            break;
        }
        case 206: {
            sampapi::v037r3::RefNetGame()->Packet_BulletSync(packet);
            break;
        }
        case 207: {
            sampapi::v037r3::RefNetGame()->Packet_PlayerSync(packet);
            break;
        }
        case 208: {
            sampapi::v037r3::RefNetGame()->Packet_MarkersSync(packet);
            break;
        }
        case 209: {
            sampapi::v037r3::RefNetGame()->Packet_UnoccupiedSync(packet);
            break;
        }
        case 210: {
            sampapi::v037r3::RefNetGame()->Packet_TrailerSync(packet);
            break;
        }
        case 211: {
            sampapi::v037r3::RefNetGame()->Packet_PassengerSync(packet);
            break;
        }
        
        default:
            break;
        }

        sampapi::v037r3::RefNetGame()->m_pRakClient->DeallocatePacket(packet);
    }

    return hook.call_trampoline(_this);
}


void hooks::install_tormoz_updatenetwork_hook() {
    CNetGame__UpdateNetwork_Hook.set_dest(SampBase + 0xAF20);
    CNetGame__UpdateNetwork_Hook.set_cb(&CNetGame__UpdateNetwork__HOOK);
    CNetGame__UpdateNetwork_Hook.install();
}
 

Byte

Потрачен
115
32
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
пытаюсь поставить хук на UpdateNetwork, но когда отправляю ракнет пакеты ничего не работает
zalupa code:
void CNetGame__UpdateNetwork__HOOK(const decltype(CNetGame__UpdateNetwork_Hook) & hook, void * _this) {
  Packet * packet = nullptr;
  uint8_t * localdata = nullptr;
  uint8_t state {};

  for (packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive(); packet; packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive()) {
    localdata = packet -> data;

    switch (state) {
    localdata = packet->data;
   
    if(*localdata == 40) state = localdata[5];
    case 223: {
      RakNet::BitStream bs((unsigned char * ) packet -> data, packet -> length, false);

      uint8_t packetID;
      uint32_t rpcID;
      bs.Read(packetID);
      bs.Read(rpcID);

      if (rpcID == 15) {
        sampapi::v037r3::RefChat() -> AddChatMessage("я тормоз", 0xFFFFFFFF, "я тормоз");
        return;
      }
      break;
    }
    default:
      break;
    }
  }

  return hook.call_trampoline(_this);
}


void hooks::install_tormoz_updatenetwork_hook() {
    CNetGame__UpdateNetwork_Hook.set_dest(0xAF20);
    CNetGame__UpdateNetwork_Hook.set_cb(&CNetGame__UpdateNetwork__HOOK);
    CNetGame__UpdateNetwork_Hook.install();
}
C++:
void CNetGame__UpdateNetwork__HOOK(const decltype(CNetGame__UpdateNetwork_Hook) & hook, void * _this) {
  Packet * packet = nullptr;

  for (packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive(); packet; packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive()) {
    uint8_t packetID = packet->data[0];
    
    if (packetID == 40) {
      RakNet::BitStream bs((unsigned char*)packet->data, packet->length, false);
      bs.Read(packetID);
      
      uint16_t rpcID;
      bs.Read(rpcID);
      
      if (rpcID == 15) {
        sampapi::v037r3::RefChat()->AddChatMessage("RPC 15 получен", 0xFFFFFFFF, "Отладка");
      }
    }
    
    else if (packetID == 223) {
      sampapi::v037r3::RefChat()->AddChatMessage("Пакет 223 получен", 0xFFFFFFFF, "Отладка");
    }
  }

  return hook.call_trampoline(_this);
}

void hooks::install_tormoz_updatenetwork_hook() {
    CNetGame__UpdateNetwork_Hook.set_dest(0xAF20);
    CNetGame__UpdateNetwork_Hook.set_cb(&CNetGame__UpdateNetwork__HOOK);
    CNetGame__UpdateNetwork_Hook.install();
}

state не устанавливается перед switch, а внутри первого case
 
  • Влюблен
Реакции: vmprotect

tanksoftik

Участник
17
5
Как вообще работают лимиты самп на машины? И как их можно снять? Просто смотрел idb самп на скины лимит 20к и его видно, а на машины так и не нашел где стоит лимит и что надо патчить
 

вайега52

Налуашил состояние
Модератор
2,995
3,124
Как вообще работают лимиты самп на машины? И как их можно снять? Просто смотрел idb самп на скины лимит 20к и его видно, а на машины так и не нашел где стоит лимит и что надо патчить
1745248803518.png
 
  • Вау
  • Нравится
Реакции: tanksoftik и vmprotect

writeline

Новичок
28
9
Подскажите адрес координат игрока пожалуйста.

с++:
HRESULT APIENTRY hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
    if (!bInit)
        InitializeD3D(pDevice);

    if (bInit && pDevice)
    {
        stCoordinates coords = GetPlayerCoordinates();
        char buffer[128];
        sprintf_s(buffer, "X: %.2f, Y: %.2f, Z: %.2f", coords.fX, coords.fY, coords.fZ);
        DrawText(buffer, 10, 10, D3DCOLOR_ARGB(255, 255, 255, 255));
    }

    return oEndScene ? oEndScene(pDevice) : D3D_OK;
}

DWORD WINAPI HookThread(LPVOID lpParam)
{
    //D3D
    while (!pDevice)
    {
        pDevice = *(LPDIRECT3DDEVICE9*)0xC97C28;
        Sleep(100);
    }

    DWORD* pVTable = *(DWORD**)pDevice;

    DWORD oldProtect;
    VirtualProtect(&pVTable[42], sizeof(DWORD), PAGE_EXECUTE_READWRITE, &oldProtect);
    oEndScene = (HRESULT(APIENTRY*)(LPDIRECT3DDEVICE9))pVTable[42];
    pVTable[42] = (DWORD)hkEndScene;
    VirtualProtect(&pVTable[42], sizeof(DWORD), oldProtect, &oldProtect);

    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
    if (reason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);

        // pCoordinates = (stCoordinates*) ТУТ АДРЕС;

        CreateThread(NULL, 0, HookThread, NULL, 0, NULL);
    }
    return TRUE;
}