Скрипты для AMAZING ONLINE

ZemAmazing

Новичок
Автор темы
11
1
Как вообще делаются читы на C++ для AMAZING ONLINE
Как сделать чит, который бегал бы от одной координаты к другой?
 
  • Эм
Реакции: aldaramin, Adofe и vuyy
Решение
Как сделать чит, который бегал бы от одной координаты к другой?
Два клоуна сверху не смогли тебе нормально ответить, надеюсь я помогу.
Для AMAZING ONLINE подходят .asi (по сути, .dll) плагины.
Поэтому тебе просто надо сделать .asi файл. Вот как его делать - интересный вопрос.
Мне кажется, что самый подходящий гайд - вот этот (там их 5 штук). Еще есть заброшенный цикл уроков от Пикселя.
Можно использовать Plugin SDK (в нём уже есть все адреса функций и констант, чтобы не искать всё с нуля). Сам я особо с ним не разбирался, если честно.
Чтобы самому понять как искать нужные тебе значения (в твоём случае - координаты) и как искать функцию, которая заставит твоего игрока бегать и...

Vintik

Мечтатель
Проверенный
1,467
916
Как сделать чит, который бегал бы от одной координаты к другой?
Два клоуна сверху не смогли тебе нормально ответить, надеюсь я помогу.
Для AMAZING ONLINE подходят .asi (по сути, .dll) плагины.
Поэтому тебе просто надо сделать .asi файл. Вот как его делать - интересный вопрос.
Мне кажется, что самый подходящий гайд - вот этот (там их 5 штук). Еще есть заброшенный цикл уроков от Пикселя.
Можно использовать Plugin SDK (в нём уже есть все адреса функций и констант, чтобы не искать всё с нуля). Сам я особо с ним не разбирался, если честно.
Чтобы самому понять как искать нужные тебе значения (в твоём случае - координаты) и как искать функцию, которая заставит твоего игрока бегать и поворачиваться куда нужно, можно глянуть видосы:
И плейлист геймхаклаба.
Но в целом для гта (она же - крмп) уже есть готовые адреса.
Если что-то непонятно конкретно - пиши, но изначально настоятельно рекомендую посмотреть всё, что скинул выше (цикл геймхаклаба очень длинный, его, конечно, можно весь не смотреть сразу). Твой вопрос достаточно широкий, и за день люди не учатся писать читы.
 

ZemAmazing

Новичок
Автор темы
11
1
Два клоуна сверху не смогли тебе нормально ответить, надеюсь я помогу.
Для AMAZING ONLINE подходят .asi (по сути, .dll) плагины.
Поэтому тебе просто надо сделать .asi файл. Вот как его делать - интересный вопрос.
Мне кажется, что самый подходящий гайд - вот этот (там их 5 штук). Еще есть заброшенный цикл уроков от Пикселя.
Можно использовать Plugin SDK (в нём уже есть все адреса функций и констант, чтобы не искать всё с нуля). Сам я особо с ним не разбирался, если честно.
Чтобы самому понять как искать нужные тебе значения (в твоём случае - координаты) и как искать функцию, которая заставит твоего игрока бегать и поворачиваться куда нужно, можно глянуть видосы:
И плейлист геймхаклаба.
Но в целом для гта (она же - крмп) уже есть готовые адреса.
Если что-то непонятно конкретно - пиши, но изначально настоятельно рекомендую посмотреть всё, что скинул выше (цикл геймхаклаба очень длинный, его, конечно, можно весь не смотреть сразу). Твой вопрос достаточно широкий, и за день люди не учатся писать читы.
Попытался сделать, что бы при нажатии Numpad1 персонаж начинал бежать пока не нажмёшь Numpad2, а тут данная ошибка

23123123.PNG



Бег:
#include "pch.h"


DWORD WINAPI InitializeAndLoad(LPVOID) {
    int* CPed;
    CPed = (int*)0xB6F5F0;
    while (*reinterpret_cast<unsigned char*>(0xC8D4C0) != 9) {
        Sleep(100);
    }
    while (true)
    {
        if (GetAsyncKeyState(VK_NUMPAD1))
        {
            CPed + 0x15C = 154;
        }

        if (GetAsyncKeyState(VK_NUMPAD2))
        {
            break;
        }
    }

    return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        CreateThread(0, 0, &InitializeAndLoad, 0, 0, 0);
        break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 
  • Эм
  • Bug
Реакции: Adofe и aldaramin

Vintik

Мечтатель
Проверенный
1,467
916
Попытался сделать, что бы при нажатии Numpad1 персонаж начинал бежать пока не нажмёшь Numpad2, а тут данная ошибка

Посмотреть вложение 233807


Бег:
#include "pch.h"


DWORD WINAPI InitializeAndLoad(LPVOID) {
    int* CPed;
    CPed = (int*)0xB6F5F0;
    while (*reinterpret_cast<unsigned char*>(0xC8D4C0) != 9) {
        Sleep(100);
    }
    while (true)
    {
        if (GetAsyncKeyState(VK_NUMPAD1))
        {
            CPed + 0x15C = 154;
        }

        if (GetAsyncKeyState(VK_NUMPAD2))
        {
            break;
        }
    }

    return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        CreateThread(0, 0, &InitializeAndLoad, 0, 0, 0);
        break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Надо было всё таки пересмотреть все уроки, которые я тебе скинул.
1. Вот это вот неправильно:
C++:
int* CPed;
CPed = (int*)0xB6F5F0;
Подробнее надо смотреть об указателях в С++.
0xB6F5F0 - это ни что иное как адрес памяти, в котором хранится значение нужного тебе CPed. Для его получения тебе надо прочитать значение по данному адресу:
C++:
int* CPedPtr; // ptr (pointer) - указатель на переменную (т.е. он хранит адрес памяти этой переменной)
CPedPtr = (int*)0xB6F5F0; // записываем в него адрес нашей перменной (CPed)
int CPed = *CPedPtr; // и разыменовываем (т.е. получаем значение этой самой переменной)
Либо, что проще и чаще используется:
C++:
int CPed = *(int*)0xB6F5F0; // просто в одну строку
2. И это тоже неправильно:
C++:
CPed + 0x15C = 154;
А как надо?
CPed (само значение) - тоже является указателем. Я согласен, для новичка это путаница, но всё же. Простая иллюстрация:
Без имени.png
На этой иллюстрации красным указан адрес памяти (номер ячейки в памяти), а серым - значение.
По адресу 0xB6F5F0 у нас значение CPed (это указатель, т.е. тоже адрес).
По адресу CPed у нас непонятно что происходит. На самом деле у нас структура, например (НА САМОМ ДЕЛЕ ОНА НЕ ТАКАЯ!), что-то такого плана:
Здоровье
Бронежилет
Позиция по X
Позиция по Y
Позиция по Z
ID скина
...
Все эти данные хранятся по порядку в памяти. Так вот CPed указывает на начало структуры (на данном примере - это здоровье), а если нам нужно что-то другое (например, позиция по X) - нам нужно к этому адресу начала структуры добавить сколько-то байт (как у тебя: CPed + 0x15C).
На С++ это будет выглядеть так:
C++:
int CPed = *(int*)0xB6F5F0; // читаем значение CPed по адресу 0xB6F5F0
CPed += 0x15C; // прибавляем к этому значению смещение (англ. offset) 0x15C
*(int*)CPed = 154; // меняем значение по адресу CPed + 0x15C
Третья строка спорная. Не уверен, что там именно тип int, возможно 1 байт (unsigned char). На самом деле, это не сильно важно в нашем случае, потому что у нас порядок байтов "little-endian". Поэтому число 0x11223344 запишется в памяти по байтам в обратном порядке: { 0x44, 0x33, 0x22, 0x11 }. В нашем случае если мы читаем как 1 байт, то будет какое-то двузначное число в шестнадцатеричной системе (например, 154 = 0x9A). Поэтому в памяти это запишется как { 0x9A, не изменится, не изменится, не изменится }. Если же там число (int, т.е. 4 байта), то оно будет формата 154 = 0x0000009A запишется как { 0x9A, 0x00, 0x00, 0x00 }.
Поэтому в обоих случаях:
C++:
*(int*)CPed = 154; // записываем как 4 байта (int)
*(unsigned char*)CPed = 154; // записываем как 1 байт (unsigned char)
Первый байт будет 0x9A. Не знаю как она там себе считывают это - как число или как символ. Если как символ - то пофиг как записывать. Если как число - то лучше записать как число, потому что если мы запишем как символ - мы не будем знать что там в 3х последних байтах.
3. Это тоже неверно:
C++:
if (GetAsyncKeyState(VK_NUMPAD2))
{
    break;
}
Типа break выйдет из цикла и что у нас дальше в коде, после цикла? return 0. Программа тупо завершит работу, получается у тебя одноразовая штука. Правильно сделаем так: введём переменную "бежим ли мы сейчас", при нумпад1 - её значение делаем true, при нумпад2 - false.
Весь цикл while будет выглядеть вот так:
bool run = false;
while (true)
{
    if (GetAsyncKeyState(VK_NUMPAD1))
        run = true;
    if (GetAsyncKeyState(VK_NUMPAD2))
        run = false;
    if (run)
    {
        int CPed = *(int*)0xB6F5F0;
        CPed += 0x15C;
        *(int*)CPed = 154;
    }
}

C++:
DWORD WINAPI InitializeAndLoad(LPVOID)
{
    int CPed = *(int*)0xB6F5F0;
    CPed += 0x15C;
    while (*(unsigned char*)0xC8D4C0 != 9)
        Sleep(100);
    bool run = false;
    while (true)
    {
        if (GetAsyncKeyState(VK_NUMPAD1))
            run = true;
        if (GetAsyncKeyState(VK_NUMPAD2))
            run = false;
        if (run)
            *(int*)CPed = 154;
    }
    return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
        CreateThread(0, 0, &InitializeAndLoad, 0, 0, 0);
    return TRUE;
}
И то это всё немного неправильно, потому что:
а) У тебя будет срабатывать ВСЁ ВРЕМЯ, пока кнопка нажата. То есть за краткое нажатие в переменную run может записаться хоть 10 раз значение true. В данном случае не страшно, но вообще стоит сделать проверку на НАЖАТИЕ кнопки. Если кнопка нажата, а в некой переменной указано, что отпущена - значит только что нажал. Потом в эту переменную записываешь "нажато", и если отпущена - значит только что отпустил. Такая логика.
б) У тебя ВСЁ ВРЕМЯ, много раз в секунду, будет записываться значение 154. Если тебе нужно, чтобы оно записывалось 1 раз при нажатии - его надо добавить ВМЕСТО run = true;.
И я не уверен, что это работать будет, если честно. Но попробовать можно.

И да, отключи "Предварительно откомпилированные заголовки (pch.h)". Это делается в Проект -> Настройки проекта (снизу пункт), там поищи... В первом гайде от Кинчстата написано где найти этот пункт.