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

Musaigen

shitposter
Проверенный
1,654
1,471
Да не, не то. Мне надо в функции приема RPC, проверять, включено ли оно. Примерно продумал такой ход: Массив, в нем индекс = ID RPC. массив типа struct RPC, в котором два поля: std::string name и bool enabled. Мне теперь надо придумать как это заполнять
Используй std::map.
Заполнять через for.
 

manukhov

Известный
125
131
Сделай для этого код(Любой, экстернал/интернал) и выложи в тему Полезные Функции С++ю
Код добавил, а в ту тему не вижу смысла кидать, уж очень примитивно. Кому будет нужно, тот увидит. Это теперь и в гугле и в поиске бх есть.
 

Dark_Knight

Me, me and me.
Друг
4,085
2,114
Используй std::map.
Заполнять через for.
Можно спокойной через vector сделать не напрягаясь и юзать std::find_if для поиска любых значений.
map имеет метод find, но позволит искать по первому элементу пары(sld::pair)
 

manukhov

Известный
125
131
Здравствуйте, опять я со своими цыганскими фокусами по трансформации internal->external, на сей раз Nametag. Подскажите, что неправильно, я так и не нашёл проблему, а работать оно не хочет.

P.S.
1. Интернал точно правильный.
2. Получение адреса samp.dll точно работает
3. Виртал протект делал, не помогает.

Internal:
Idefine SAMP_INFO  0x21A0F8
#define SAMP_SETTINGS  0x3D5
DWORD* pInfo;
BYTE* ThroughWalls;
BYTE* ShowNameTags;
float* fDistance;
    
    
    DWORD SampDLL = (DWORD)GetModuleHandleA("samp.dll");
    if (SampDLL) {
        pInfo = (DWORD*)(SampDLL + SAMP_INFO);
        while (*pInfo == 0) Sleep(1000);
        while (*(DWORD*)(*pInfo + SAMP_SETTINGS) == 0) Sleep(1000);
        ShowNameTags = (BYTE*)(*(DWORD*)(*pInfo + SAMP_SETTINGS) + 0x38);
        ThroughWalls = (BYTE*)(*(DWORD*)(*pInfo + SAMP_SETTINGS) + 0x2F);
        fDistance = (float*)((DWORD*)(*(DWORD*)(*pInfo + SAMP_SETTINGS) + 0x27));
        for (;;)
        {
            do {
                Sleep(100);
            } while (!KeyPressed(VK_MENU) || !KeyPressed(0x32));
            do {
                Sleep(50);
            } while (KeyPressed(0x32));
            gta_showText("okoboga v2 ~g~Activated", 1000, NULL, NULL);
            *ShowNameTags = 1;
            *ThroughWalls = 0;
            *fDistance = 999.0f;
            do {
                Sleep(100);
            } while (!KeyPressed(VK_MENU) || !KeyPressed(0x32));
            do {
                Sleep(50);
            } while (KeyPressed(0x32));
            gta_showText("okoboga v2 ~r~Deactivated", 1000, NULL, NULL);
            *ShowNameTags = 1;
            *ThroughWalls = 1;
            *fDistance = 0.0f;
        }
    }

External (моё):
#define SAMP_INFO  0x21A0F8
#define SAMP_SETTINGS  0x3D5

if (checkBox5->Checked)
    {
        DWORD pInfo;
        BYTE ShowNameTags = 1;
        BYTE ThroughWalls = 0;
        float fDistance = 999.0f;

        ReadProcessMemory(hProcess, (LPVOID)(moduleBase + SAMP_INFO), &pInfo, sizeof(pInfo), nullptr);
        WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x38), &ShowNameTags, sizeof(ShowNameTags), nullptr);
        WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x2F), &ThroughWalls, sizeof(ThroughWalls), nullptr);
        WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x27), &fDistance, sizeof(fDistance), nullptr);
    }
    else
    {
        DWORD pInfo;
        BYTE ShowNameTags = 1;
        BYTE ThroughWalls = 1;
        float fDistance = 0.0f;

        ReadProcessMemory(hProcess, (LPVOID)(moduleBase + SAMP_INFO), &pInfo, sizeof(pInfo), nullptr);
        WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x38), &ShowNameTags, sizeof(ShowNameTags), nullptr);
        WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x2F), &ThroughWalls, sizeof(ThroughWalls), nullptr);
        WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x27), &fDistance, sizeof(fDistance), nullptr);
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,748
4,849
Здравствуйте, опять я со своими цыганскими фокусами по трансформации internal->external, на сей раз Nametag. Подскажите, что неправильно, я так и не нашёл проблему, а работать оно не хочет.
Если я все правильно понял, то (DWORD*)(*pInfo + SAMP_SETTINGS)
Преобразует *pInfo+SAMP_SETTINGS в DWORD*, после идет +0x27, а из-за арифметики указателей, это получается 0x27 * 4, и потом идет разыменование.
Возможно ты еще с преобразованиями накосячил, пока с телефонам, не совсем удобно смотреть :D
Также возможно у тебя DWORD задейфанен в 8 байт, а не в 4. Я однажды из-за этого час искал где приколы возникли :D

нашел где ошибка. Вместо
C++:
ReadProcessMemory(hProcess, (LPVOID)(moduleBase + SAMP_INFO), &pInfo, sizeof(pInfo), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x38), &ShowNameTags, sizeof(ShowNameTags), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x2F), &ThroughWalls, sizeof(ThroughWalls), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x27), &fDistance, sizeof(fDistance), nullptr);
Должно быть что-то типа такого:
C++:
ReadProcessMemory(hProcess, (LPVOID)(moduleBase + SAMP_INFO), &pInfo, sizeof(pInfo), nullptr);
DWORD pSettings;
ReadProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS), &pSettings, sizeof(pSettings), NULL);
WriteProcessMemory(hProcess, (LPVOID)(pSettings + 0x38), &ShowNameTags, sizeof(ShowNameTags), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pSettings + 0x2F), &ThroughWalls, sizeof(ThroughWalls), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pSettings + 0x27), &fDistance, sizeof(fDistance), nullptr);
 
Последнее редактирование:

manukhov

Известный
125
131
Если я все правильно понял, то (DWORD*)(*pInfo + SAMP_SETTINGS)
Преобразует *pInfo+SAMP_SETTINGS в DWORD*, после идет +0x27, а из-за арифметики указателей, это получается 0x27 * 4, и потом идет разыменование.
Возможно ты еще с преобразованиями накосячил, пока с телефонам, не совсем удобно смотреть :D
Также возможно у тебя DWORD задейфанен в 8 байт, а не в 4. Я однажды из-за этого час искал где приколы возникли :D

нашел где ошибка. Вместо
C++:
ReadProcessMemory(hProcess, (LPVOID)(moduleBase + SAMP_INFO), &pInfo, sizeof(pInfo), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x38), &ShowNameTags, sizeof(ShowNameTags), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x2F), &ThroughWalls, sizeof(ThroughWalls), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS + 0x27), &fDistance, sizeof(fDistance), nullptr);
Должно быть что-то типа такого:
C++:
ReadProcessMemory(hProcess, (LPVOID)(moduleBase + SAMP_INFO), &pInfo, sizeof(pInfo), nullptr);
DWORD pSettings;
ReadProcessMemory(hProcess, (LPVOID)(pInfo + SAMP_SETTINGS), &pSettings, sizeof(pSettings), NULL);
WriteProcessMemory(hProcess, (LPVOID)(pSettings + 0x38), &ShowNameTags, sizeof(ShowNameTags), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pSettings + 0x2F), &ThroughWalls, sizeof(ThroughWalls), nullptr);
WriteProcessMemory(hProcess, (LPVOID)(pSettings + 0x27), &fDistance, sizeof(fDistance), nullptr);
Спасибо, вижу, я не обратил внимания. Но не заработало(
Также возможно у тебя DWORD задейфанен в 8 байт, а не в 4. Я однажды из-за этого час искал где приколы возникли :D
Это как? Я размерность нигде не указывал
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,748
4,849
Обэма взломал комп и задефайнил пока тебя не было
Только что проверил. Вот такой код у меня работает, на монсере как минимум.

C++:
unsigned char ShowNameTags = 1;
unsigned char ThroughWalls = 0;
float fDistance = 999.0f;
ReadProcessMemory(processHandle, (LPVOID)(sampBase + SAMP_INFO), &pInfo, sizeof(pInfo), nullptr);
uint32_t pSettings;
ReadProcessMemory(processHandle, (LPVOID)(pInfo + SAMP_SETTINGS), &pSettings, sizeof(pSettings), NULL);
WriteProcessMemory(processHandle, (LPVOID)(pSettings + 0x38), &ShowNameTags, sizeof(ShowNameTags), nullptr);
WriteProcessMemory(processHandle, (LPVOID)(pSettings + 0x2F), &ThroughWalls, sizeof(ThroughWalls), nullptr);
WriteProcessMemory(processHandle, (LPVOID)(pSettings + 0x27), &fDistance, sizeof(fDistance), nullptr);

Ща посчитал оффсет для R1,вышло 3C5 вместо 3D5. Попробуй(нет возможности на R1 протестить сейчас)
еще можешь попробовать 3C9.
 

manukhov

Известный
125
131
Ща посчитал оффсет для R1,вышло 3C5 вместо 3D5. Попробуй(нет возможности на R1 протестить сейчас)
еще можешь попробовать 3C9.
Спасибо, реально беды с оффсетами, просто 3D5 в интернале у меня работал, я думал всё ок
 

bab0n

Известный
95
10
Можете описать пару способов экспорта и импорта значений переменных?
Вот подобный код на LUA:
Lua:
local defaults = {sets ={arg1 = 113,arg2 = 1,arg3 = 50, notification = true}}

local ini = inicfg.load(defaults, 'Kavo.ini')
local sets = ini.sets

function arg3(arg)
    if type(tonumber(arg)) == 'number' then
        sets.arg3 = arg
        inicfg.save(ini, 'Kavo.ini')
        printString('~y~ updated', 1000)
        addOneOffSound(0, 0, 0, 1150)
    else
        printString('~r~ error', 1000)
        addOneOffSound(0, 0, 0, 1055)
    end
end

-- пример использования
if wasKeyPressed(sets.arg1) then
        work = not work
         if work then
             printString('~p~ON', 1000)
         else
             printString('OFF', 1000)
          end
end

Я не настаиваю на текстовике, может есть какие то ещё варианты? Реестр может, или какие-то ещё файлы/директории
Актуально
 

SKIC

Известный
64
0
Как включить курсор Windows и заморозить управление? Подобно когда заходишь в меню паузы.
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,748
4,849
Как включить курсор Windows и заморозить управление? Подобно когда заходишь в меню паузы.
C++:
// SAMP 0.3.7-R1
#define SAMP_MISC_INFO                    = 0x21A10C

#define SAMP_FUNC_TOGGLECURSOR                = 0x9BD30
#define SAMP_FUNC_CURSORUNLOCKACTORCAM        = 0x9BC10
void ToggleCursor(bool state)
{
    //state - 1 on; 0 off
    if (iInputEnabled) //is Input Active Check
        return;
    void* obj = *(void**)(dwSAMPAddr + SAMP_MISC_INFO);
    ((void(__thiscall*) (void*, int, bool)) (dwSAMPAddr + SAMP_TOGGLECURSOR))(obj, state ? 3 : 0, !state);
    if (!state)
        ((void(__thiscall*) (void*)) (dwSAMPAddr + SAMP_CURSORUNLOCKACTORCAM))(obj);
}
Для блокировки управления в wndProc добавить return
 

SKIC

Известный
64
0
C++:
// SAMP 0.3.7-R1
#define SAMP_MISC_INFO                    = 0x21A10C

#define SAMP_FUNC_TOGGLECURSOR                = 0x9BD30
#define SAMP_FUNC_CURSORUNLOCKACTORCAM        = 0x9BC10
void ToggleCursor(bool state)
{
    //state - 1 on; 0 off
    if (iInputEnabled) //is Input Active Check
        return;
    void* obj = *(void**)(dwSAMPAddr + SAMP_MISC_INFO);
    ((void(__thiscall*) (void*, int, bool)) (dwSAMPAddr + SAMP_TOGGLECURSOR))(obj, state ? 3 : 0, !state);
    if (!state)
        ((void(__thiscall*) (void*)) (dwSAMPAddr + SAMP_CURSORUNLOCKACTORCAM))(obj);
}
Для блокировки управления в wndProc добавить return
Это для SAMP а мне для одиночки.
@FYP, можешь пожалуйста дать код своего showCursor из moonloader. ну пожалуйста.
 
Последнее редактирование:

DarkP1xel

Сила воли наше всё.
BH Team
3,637
5,024
Это для SAMP а мне для одиночки.
@FYP, можешь пожалуйста дать код своего showCursor из moonloader. ну пожалуйста.
Псевдокод функции включения курсора SA-MP'a.:
int __thiscall ToggleCursor(stMiscInfo *this, int cursorMode, int hideCursor?)
{
  int result; // eax
  stMiscInfo *v4; // esi

  result = cursorMode;
  v4 = this;
  switch ( cursorMode )
  {
    case 2:
      UnProtectMemmory((void *)0x541DF5, 5);
      MEMORY[0x541DF5] = 0x90909090;
      MEMORY[0x541DF9] = 0x90u;
      GTA::patch::enableCursor();
      MEMORY[0xB73424] = 0;
      MEMORY[0xB73428] = 0;
      MEMORY[0x541BD0]();
      MEMORY[0x541DD0]();
      UnProtectMemmory((void *)0x6194A0, 1);
      MEMORY[0x6194A0] = 0xC3u;
      result = ((int (__stdcall *)(IDirect3DDevice9 *, signed int))pDevice->vtbl->ShowCursor)(pDevice, 1);
      v4->iCursorMode = 2;
      break;
    case 1:
      if ( this->iCursorMode != 1 )
      {
        UnProtectMemmory((void *)0x541DF5, 5);
        result = 0x90909090;
        MEMORY[0x541DF5] = 0x90909090;
        MEMORY[0x541DF9] = 0x90u;
        v4->iCursorMode = 1;
      }
      break;
    case 3:
      if ( this->iCursorMode != 3 )
      {
        GTA::patch::enableCursor();
        MEMORY[0xB73424] = 0;
        MEMORY[0xB73428] = 0;
        MEMORY[0x541BD0]();
        MEMORY[0x541DD0]();
        UnProtectMemmory((void *)0x6194A0, 1);
        MEMORY[0x6194A0] = 0xC3u;
        result = ((int (__stdcall *)(IDirect3DDevice9 *, signed int))pDevice->vtbl->ShowCursor)(pDevice, 1);
        v4->iCursorMode = 3;
      }
      break;
    case 4:
      if ( this->iCursorMode != 4 )
      {
        sub_1009BB20();
        MEMORY[0xB73424] = 0;
        MEMORY[0xB73428] = 0;
        MEMORY[0x541BD0]();
        MEMORY[0x541DD0]();
        result = UnProtectMemmory((void *)0x6194A0, 1);
        MEMORY[0x6194A0] = 0xC3u;
        v4->iCursorMode = 4;
      }
      break;
    default:
      if ( !cursorMode && this->iCursorMode )
      {
        this->field_59 = hideCursor? != 0 ? 0 : 0xA;
        result = ((int (__stdcall *)(IDirect3DDevice9 *, _DWORD))pDevice->vtbl->ShowCursor)(pDevice, 0);
        v4->iCursorMode = 0;
      }
      break;
  }
  return result;
}