HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 04.03.2024, 16:17
Gmazov
Новичок
Регистрация: 04.12.2021
Сообщений: 11
С нами: 2338391

Репутация: 8
По умолчанию

Как вообще делаются читы на C++ для AMAZING ONLINE

Как сделать чит, который бегал бы от одной координаты к другой?
 
Ответить с цитированием

  #2  
Старый 05.03.2024, 16:01
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

Цитата:
Сообщение от ZemAmazing  

Как сделать чит, который бегал бы от одной координаты к другой?
Два клоунасверху не смогли тебе нормально ответить, надеюсь я помогу.

Для AMAZING ONLINE подходят .asi (по сути, .dll) плагины.

Поэтому тебе просто надо сделать .asi файл. Вот как его делать - интересный вопрос.

Мне кажется, что самый подходящий гайд - вот этот (там их 5 штук). Еще есть заброшенный цикл уроков от Пикселя.

Можно использовать Plugin SDK (в нём уже есть все адреса функций и констант, чтобы не искать всё с нуля). Сам я особо с ним не разбирался, если честно.

Чтобы самому понятькак искатьнужные тебе значения (в твоём случае - координаты) икак искатьфункцию, которая заставит твоего игрока бегать и поворачиваться куда нужно, можно глянуть видосы:

Иплейлист геймхаклаба.

Но в целом для гта (она же - крмп) уже есть готовые адреса.

Если что-то непонятно конкретно - пиши, но изначально настоятельно рекомендую посмотреть всё, что скинул выше (цикл геймхаклаба очень длинный, его, конечно, можно весь не смотреть сразу). Твой вопрос достаточно широкий, и за день люди не учатся писать читы.
 
Ответить с цитированием

  #3  
Старый 06.03.2024, 17:16
Gmazov
Новичок
Регистрация: 04.12.2021
Сообщений: 11
С нами: 2338391

Репутация: 8
По умолчанию

Цитата:
Сообщение от Vintik  

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

Иплейлист геймхаклаба.
Но в целом для гта (она же - крмп) уже есть готовые адреса.
Если что-то непонятно конкретно - пиши, но изначально настоятельно рекомендую посмотреть всё, что скинул выше (цикл геймхаклаба очень длинный, его, конечно, можно весь не смотреть сразу). Твой вопрос достаточно широкий, и за день люди не учатся писать читы.
Попытался сделать, что бы при нажатии Numpad1 персонаж начинал бежать пока не нажмёшь Numpad2, а тут данная ошибка

23123123.PNGGmazov · 6 Мар 2024 в 16:16' data-fancybox="lb-post-1465372" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/233807/" style="cursor: pointer;" title="23123123.PNG">


Бег:





Код:
#include "pch.h"
DWORD WINAPI
InitializeAndLoad
(
LPVOID
)
{
int
*
CPed
;
CPed
=
(
int
*
)
0xB6F5F0
;
while
(
*
reinterpret_cast

(
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
;
}
 
Ответить с цитированием

  #4  
Старый 07.03.2024, 03:17
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

Цитата:
Сообщение от ZemAmazing  

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

Бег:





Код:
#include "pch.h"
DWORD WINAPI
InitializeAndLoad
(
LPVOID
)
{
int
*
CPed
;
CPed
=
(
int
*
)
0xB6F5F0
;
while
(
*
reinterpret_cast

(
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 (само значение) - тоже является указателем. Я согласен, для новичка это путаница, но всё же. Простая иллюстрация:

Цитата:
Сообщение от Спойлер  

Без имени.pngVintik · 7 Мар 2024 в 02:17' data-fancybox="lb-post-1465597" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/233811/" style="cursor: pointer;" title="Без имени.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)". Это делается в Проект -> Настройки проекта (снизу пункт), там поищи... В первом гайде от Кинчстата написано где найти этот пункт.
 
Ответить с цитированием

  #5  
Старый 15.06.2024, 05:12
TokyoQq
Новичок
Регистрация: 14.01.2024
Сообщений: 20
С нами: 1228197

Репутация: 3
По умолчанию

поч не работает

C++:





Код:
#include "pch.h"

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_DELETE))
            run = true;
        if (GetAsyncKeyState(VK_INSERT))
            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;
}
 
Ответить с цитированием

  #6  
Старый 15.06.2024, 12:40
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

Цитата:
Сообщение от TokyoQq  

поч не работает

C++:





Код:
#include "pch.h"

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_DELETE))
            run = true;
        if (GetAsyncKeyState(VK_INSERT))
            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;
}

что должно делать?
 
Ответить с цитированием

  #7  
Старый 15.06.2024, 12:42
Gmazov
Новичок
Регистрация: 04.12.2021
Сообщений: 11
С нами: 2338391

Репутация: 8
По умолчанию

Цитата:
Сообщение от Vintik  

что должно делать?
Скорее всего заставлять бегать персонажа
 
Ответить с цитированием

  #8  
Старый 15.06.2024, 13:20
fuflexxxx
Познающий
Регистрация: 10.06.2020
Сообщений: 37
С нами: 3119285

Репутация: 63
По умолчанию

Я не гений в написании ботов, но мне просто интересно, какой эффект вы ожидаете увидеть записав в поле float m_fSoundDistUpAsRead класса CCamera?
 
Ответить с цитированием

  #9  
Старый 15.06.2024, 18:02
TokyoQq
Новичок
Регистрация: 14.01.2024
Сообщений: 20
С нами: 1228197

Репутация: 3
По умолчанию

ну так почему не работает?
 
Ответить с цитированием

  #10  
Старый 15.06.2024, 19:28
fuflexxxx
Познающий
Регистрация: 10.06.2020
Сообщений: 37
С нами: 3119285

Репутация: 63
По умолчанию

Цитата:
Сообщение от ZemAmazing  

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

Бег:





Код:
#include "pch.h"
DWORD WINAPI
InitializeAndLoad
(
LPVOID
)
{
int
*
CPed
;
CPed
=
(
int
*
)
0xB6F5F0
;
while
(
*
reinterpret_cast

(
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
;
}

C++:





Код:
CPed
+
0x15C
=
154
;


По этой строчке можно понять, что тебе стоит начать с изучения C++. Тут речь не про работу с памятью, а про то, что ты буквально говоришь компилятору приравнять одно число к другому.

Про код в целом, если всё-таки найти локального игрока через статичный адрес/указатели/функцию FindPlayerPed, то простое изменение анимации не заставит твоего персонажа бежать куда-то. Твой код в теории должен просто анимацию изменить (Тут ещё надо уточнить, что игра может эту анимацию вернуть потом на исходное значение), надо найти функцию в плагин сдк/самому найти (Это не так сложно на самом деле)/ написать свою и уже тогда передавать туда координаты точки, куда твой персонаж должен пойти. Я бы на твоём месте бы создал консоль при инжекте, ну или, хотя бы, MessageBox вызвал, чтобы узнать, нормально ли длл заинжектилась.
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.