Вопрос Помощь с использованием CreateMove

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
19 Янв 2023
Сообщения
11
Реакции
1
Полный новичок в c++ но за 3 дня научился делать мелкие интернал читы, например на ту же замену денег в играх или хп и еще другого, научился ползоваться IDA PRO с CheatEngine и находить оффсеты

КОроче какая то ебень с CreateMove, захукалось все, сигнатура правильная, пытался создать бхоп но чето по пизде пошло все:

C++:
Expand Collapse Copy
CmdUser* cmd = nullptr;

// Принт
void Log(const char* format, ...) {
    char buffer[1024];
    va_list args;
    va_start(args, format);
    vsprintf_s(buffer, format, args);
    va_end(args);

    std::cout << "[TestCheat] " << buffer << std::endl;
}

// CreateMove хук
typedef void(__fastcall* oCreateMoveFn)(CmdUser*, int, char);
inline oCreateMoveFn oCreateMove = nullptr;

void __fastcall CreateMoveHook(CmdUser* cmd, int edx, char a2) {
    static int call_count = 0;
    call_count++;

    Log("CreateMove #%d - edx: 0x%p, cmd: 0x%p", call_count, edx, cmd);

    if (cmd) {
        Log("VALID CMD: cmd_num=%d, tick=%d, yaw=%.1f, buttons=0x%X",
            cmd->command_number, cmd->tick_count, cmd->viewangles[1], cmd->buttons);
        
        if (cmd->buttons & (1 << 1)) { // IN_JUMP
            Log("JUMP PRESSED!");
        }
    }

    oCreateMove(cmd, edx, a2);
}

bool InitializeCreateMoveHook() {
    HMODULE module = GetModuleHandleA("client.dll");
    if (!module) {
        Log("client.dll not found!");
        return false;
    }

    auto createMoveAddr = PatternScan((void*)module, "85 D2 0F 85 ? ? ? ? 48 8B C4 44 88 40");

    if (!createMoveAddr) {
        Log("CreateMove pattern not found!");
        return false;
    }

    Log("CreateMove found at: 0x%p", (void*)createMoveAddr);

    MH_Initialize();
    MH_CreateHook((LPVOID)createMoveAddr, (LPVOID)CreateMoveHook, (LPVOID*)&oCreateMove);
    MH_EnableHook(MH_ALL_HOOKS);

    Log("CreateMove hook installed!");
    return true;
}

// Анлоадикс
void UnloadHooks() {
    MH_DisableHook(MH_ALL_HOOKS);
    MH_RemoveHook(MH_ALL_HOOKS);
    MH_Uninitialize();
    Log("Hooks unloaded");
}

void game_loop(HMODULE inst) {
    Sleep(2000);

    if (!InitializeCreateMoveHook()) {
        Log("Continuing without CreateMove hook");
    }

    Log("Cheat ready! Press END to unload");

    while (!GetAsyncKeyState(VK_END)) {
        Sleep(10);
    }
}

DWORD WINAPI MainThread(HMODULE inst) {
    AllocConsole();
    FILE* f;
    freopen_s(&f, "CONOUT$", "w", stdout);
    SetConsoleTitleA("Cheat Console");

    Log("Cheat loaded!");

    game_loop(inst);

    UnloadHooks();

    if (f) {
        fclose(f);
    }
    FreeConsole();

    FreeLibraryAndExitThread(inst, 0);

    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) {
    if (reason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, nullptr);
    }
    return TRUE;
}

и эта хуйня вроде правильна??
C++:
Expand Collapse Copy
struct CmdUser {
    int command_number;
    int tick_count;
    float viewangles[3];
    float forwardmove;
    float sidemove;
    float upmove;
    int buttons;
    char impulse;
    int weaponselect;
    int weaponsubtype;
    int random_seed;
    short mousedx;
    short mousedy;
    bool hasbeenpredicted;
};

да и в 1 коде строка ->
Log("VALID CMD: cmd_num=%d, tick=%d, yaw=%.1f, buttons=0x%X",
cmd->command_number, cmd->tick_count, cmd->viewangles[1], cmd->buttons);


выводит tick = 13499, yaw = 0 а все остальное правилное, проверял через MemCheck

в чем проблемы я понять не могу, и еще, как выгружать длл чтобы не перезаходить в кс2 для повторного инжекта? вроде консоль щас пропадает с хуками, но когда инжекчу ниче не происходит.

в будущем хочу сделать rage либо movement чит с эджбагами и прочей хуйней
 
Структура у тебя из ксго? Вот правильная
C++:
Expand Collapse Copy
class CUserCmdBase {
public:
  virtual ~CUserCmdBase() = 0;

  virtual const char* GetMoveCRC() = 0;
  virtual void CleanUp() = 0;

  virtual CCSGOUserCmdPB* GetCSGOUserCmd() = 0;
  virtual CBaseUserCmdPB* GetBaseUserCmd() = 0;

  virtual void BuildBaseUserCmd() = 0;
  virtual void SerializeButtonState() = 0;
  virtual void DeserializeButtonState() = 0;

  std::uint32_t nSequenceNumber;
};
template<typename T>
class CUserCmdBaseHost : public CUserCmdBase, public T {
public:
  virtual ~CUserCmdBaseHost() = 0;
};

class CCSGOUserCmd : public CUserCmdBaseHost<CCSGOUserCmdPB> {
public:
};

class CUserCmd : public CCSGOUserCmd {
public:
  virtual ~CUserCmd() = 0;

  CInButtonState InButtonState;
  int nUnknown;
  double dbTimeStamp;
  std::uint32_t nTickCount;
  bool bHasBeenPredicted;
  int nUnknown1;
  int nUnknown2;
};
Протобаффы сам подключай


Ещё я не увидел что юзеркмд у тебя 1 аргументом, хотя крейтмув это виртуальный метод у ксго инпута
Для крейтмува с 21 индексом вот:
void CreateMove(CCSGOInput* pInput, int nSlot, CUserCmd* pUserCmd);
 
Последнее редактирование:
Структура у тебя из ксго? Вот правильная
C++:
Expand Collapse Copy
class CUserCmdBase {
public:
  virtual ~CUserCmdBase() = 0;

  virtual const char* GetMoveCRC() = 0;
  virtual void CleanUp() = 0;

  virtual CCSGOUserCmdPB* GetCSGOUserCmd() = 0;
  virtual CBaseUserCmdPB* GetBaseUserCmd() = 0;

  virtual void BuildBaseUserCmd() = 0;
  virtual void SerializeButtonState() = 0;
  virtual void DeserializeButtonState() = 0;

  std::uint32_t nSequenceNumber;
};
template<typename T>
class CUserCmdBaseHost : public CUserCmdBase, public T {
public:
  virtual ~CUserCmdBaseHost() = 0;
};

class CCSGOUserCmd : public CUserCmdBaseHost<CCSGOUserCmdPB> {
public:
};

class CUserCmd : public CCSGOUserCmd {
public:
  virtual ~CUserCmd() = 0;

  CInButtonState InButtonState;
  int nUnknown;
  double dbTimeStamp;
  std::uint32_t nTickCount;
  bool bHasBeenPredicted;
  int nUnknown1;
  int nUnknown2;
};
Протобаффы сам подключай


Ещё я не увидел что юзеркмд у тебя 1 аргументом, хотя крейтмув это виртуальный метод у ксго инпута
Для крейтмува с 21 индексом вот:
void CreateMove(CCSGOInput* pInput, int nSlot, CUserCmd* pUserCmd);
Что такое "Протобаффы" и что такое виртуальные методы и откуда узнать индекс? +где взять CCSGOInput
 
Что такое "Протобаффы" и что такое виртуальные методы и откуда узнать индекс? +где взять CCSGOInput
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.

How to find ur p2c CCSGOInput::CreateMove:
Open IDA -> open client.dll -> Shift + F12 Ctrl + F -> "cl: %d ===========================\n"
How to find address for CCSGOInput:
Open IDA -> open client.dll -> Shift + F12 Ctrl + F -> "CSGOInput"
UPD: виртуальные методы это и есть индексы
то есть функции которые определены как "virtual" и они имеют свой индекс в классе (счет начинается с нуля)
то есть взять например СCSGOInput начинаем считать 0, 1, 2, 3, 4, 5 -> на 5ом находится CCSGOInput::CreateMove
 
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.

How to find ur p2c CCSGOInput::CreateMove:
Open IDA -> open client.dll -> Shift + F12 Ctrl + F -> "cl: %d ===========================\n"
How to find address for CCSGOInput:
Open IDA -> open client.dll -> Shift + F12 Ctrl + F -> "CSGOInput"
UPD: виртуальные методы это и есть индексы
то есть функции которые определены как "virtual" и они имеют свой индекс в классе (счет начинается с нуля)
то есть взять например СCSGOInput начинаем считать 0, 1, 2, 3, 4, 5 -> на 5ом находится CCSGOInput::CreateMove
спасибо! но лучше же через PatterScan делать а не индексы?
 
причем здесь ртти вообще
А зачем искать указатель ксго инпута через патерн если есть сканирование по ртти
+по ртти ненадо ничего обновлять ведь название остаётся прежним
 
А зачем искать указатель ксго инпута через патерн если есть сканирование по ртти
+по ртти ненадо ничего обновлять ведь название остаётся прежним
ладно, я нашел уже в иде легендарный .?AVCCSGOInput@@
ладно мне похуй на самом деле как вы там будете получать указатель на инпут лол
 
Назад
Сверху Снизу