Как сделать AIM для fps игр

Areot

Модератор
Регистрация
6 Ноя 2021
Сообщения
1,163
Реакции
258
ИСТОЧНИК - http://www.mpgh.net/forum/showthread.php?t=191416
>>> Это будет работать во всех шутерах <<<

Тутор по тому как сделать AimBot в FPS играх.

Необходимое:
Программа для поиска нужных адресов (я использую T-Search)
Компилятор C / C (я использую VC)
Игра в FPS-стиле (Это руководство использует Delta Force Xtreme v1 .6.5.0)

Знание этого:
Как хранится память в игре (структуры понимания в игре)
Как искать адреса
Много времени и терпения , и некоторые знания по математике, в том числе триганометрии и здравый смысл
Знание C / C

//////////////////////



Для начало мы узнаём координаторы нас и врага по X, Y и Z (или восток / запад, север / юг и высоты).

Начнём с 3 строк
Код:

PLAYER_DATA GetMyPlayerData (аннулируеться)
PLAYER_DATA GetPlayerData (BYTE PlayerNumber)
void SetCrosshairOnEnemy (BYTE PlayerNumber)



PLAYER_DATA? Да, чтобы сделать вещи аккуратно в моем графике, я хотел бы использовать некоторые структуры и функции. Моя структура PLAYER_DATA содержит ценную информацию о плеере. Такие , как:

Код
typedef struct (_PLAYER_DATA
DWORD baseadd; / адрес / читателя базового тока (reader base current)
DWORD coordEW; / Восток / Запад (X) Co-ord
DWORD coordNS; / Север / Юг (Y) co-ord
DWORD coordUD; / Вверх / Вниз (Z) co-ord
DWORD coordEWa / / Адрес игроков EW co-ord
DWORD coordNSa / / Адрес NS игроков co-ord
DWORD coordUDa / / Адрес игроков UD Co-ord
DWORD lookX / / Когда игрок смотрит по оси X (изменяется при перемещении мыши из стороны в стороны)
DWORD look / / когда игрок смотрит по оси Y (изменяется при перемещении мыши вперёд, назад)
DWORD lookXa / / Адрес вида X
Looky DWORD / / Адрес взгляда Y
name char / / Имя текущего игрока
DWORD NAMEA / / адрес нынешних игроков называют
PLAYER_DATA);




Проще всего начать с именем, используйте ArtMoney
Co-ords:
NS - Двигаясь на север - повышение спроса, движение на юг - снижение спроса
EW - Двигаясь на восток ищите большее значение, движение на запад - снижение спроса
UD - Двигаясь вверх (холм/лестницы) ищите большее значение, перемещаясь вниз - спрос снизился
LookX - Переместив мышь влево / вправо, исследование изменилось. Установить интервал опроса любого другого Адди~d узкого поиска вниз (это значение может отличаться . для DFX в DFX, 0 был на востоке, и увеличеваеться , как они пошли против часовой стрелки до тех пор , пока есть, незадолго до Востока , который был 0xFFFFFFFF)
Посмотрите - Переместить мышь вперед / назад, поиск изменился

вы должны быть в состоянии получить базовый адрес игроков достаточно близко , чтобы любой из них, и указатель , чтобы получить его в игре. Я использую две руки, одна из которых всегда указывает на 0 читателя (или 1, первый игрок из памяти) «s базового адреса, и тот , который всегда указывает на базовый адрес плеера. Теперь мы можем изменить функции и GetMyPlayerData GetPlayerData принести нам эту информацию:

На верхней части C, которая определяет основание:


Вы должны быть в состоянии получить базовый адрес игроков достаточно близко к любому из них, и указателя , чтобы получить его в игра. Я использую две руки, одна из которых всегда указывает на игрока 0 (или 1, то первый игрок из памяти) «s базовый адрес, и тот , который всегда указывает на базовый адрес плеера. Теперь мы можем изменить функции и GetMyPlayerData GetPlayerData принести нам эту информацию:

В верхней части C, которая определяет основания:

Код:
# Определяем MBase 0xBD63D8 / MBase / = мою базу, где есть мой адрес основных игроков
# Определение HBase 0xB0D228 / HBase / = Хост базы, всегда й

/ / /
PLAYER_DATA GetMyPlayerData (аннулируются)
(
PLAYER_DATA Player / / Создать пустой PLAYER_DATA STRUCT
ZeroMemory (& Player, SizeOf (PLAYER_DATA)) / все началось в 0 (Л. Спиро, это решить некоторые проблемы)
Peek ((пустота *) MBase (пустота *) & Player.baseadd, 4); / / Получить наши игроки базовый адрес указателя

Player.coordEWa Player.baseadd = 0x8 / / Получить все Адди за все ... часть 0x8 , 0xC и дерьмо являются зачеты , которые я нашел в DFX
Player.coordNSa Player.baseadd = 0хС;
Player.coordUDa Player.baseadd = 0x10;
Player.lookXa Player.baseadd = 0x14;
Player.lookYa Player.baseadd = 0x18;
Player.namea Player.baseadd = 0xF4;

Peek ((пустота *) Player.coordEWa (пустота *) & Player.coordEW, 4) / / Теперь мы все Адди, прочитать все ин Образование они
Пик ((недействительный *) Player.coordNSa, (недействительный *) & Player.coordNS, 4);
Пик ((недействительный *) Player.coordUDa, (недействительный *) & Player.coordUD, 4);
Пик ((недействительный *) Player.lookXa, (недействительный *) & Player.lookX, 4);
Пик ((недействительный *) Player.lookYa, (недействительный *) & Player.lookY, 4);
Пик ((недействительный *) Player.namea, (недействительный *) & Player.name, 15);

вернуть игрока / / дать нашим PLAYER_DATA плеер, в качестве возвращаемого значения
)
/ / /
PLAYER_DATA GetPlayerData (BYTE PlayerNum) / / Берет номер игрока в качестве стопора
(
игрока PLAYER_DATA;
ZeroMemory (& Player, SizeOf (PLAYER_DATA));
Peek ((пустота *) HBase, (недействительный *) & Player.baseadd, 4);

Player.baseadd Player.baseadd = (PlayerNum * 0x388) / / 0x388 разница между игроками, начиная с игроком

Player.coordEWa игроком. baseadd = 0x8;
Player.coordNSa Player.baseadd = 0xC;
Player.coordUDa Player.baseadd = 0x10;
Player.lookXa Player.baseadd = 0x14;
Player.lookYa Player.baseadd = 0x18;
Player.namea Player.baseadd = 0xF4;

Пик ((пустота *) Player.coordEWa, (недействительный *) & Player.coordEW, 4);
Пик ((недействительный *) Player.coordNSa, (недействительный *) & Player.coordNS, 4);
Пик ((недействительный *) игрок .coordUDa, (недействительный *) & Player.coordUD, 4);
Пик ((недействительный *) Player.lookXa, (недействительный *) & Player.lookX, 4);
Пик ((недействительный *) Player.lookYa, (недействительное * ) & Player.lookY, 4);
Пик ((недействительными *) Player.namea, (недействительными *) & Player.name, 15);
Ли Стен
Read фонетически

вернуть плеер;
)
/ / /
Теперь, когда мы сделали нашу работу , чтобы собрать все данные , необходимые нам, пришло время , чтобы добраться до сердце Aimbot. У меня есть ощущение , что это будет много читать, так что, если бы я тебя , я бы перекусить и выпить или что - то, а затем обратно

// - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - / / - // - // - //

математическое знание требуется , чтобы сделать это! Если вы бесполезны в математике и даже читать, ты бесполезен на английском языке , чтобы не понять требования знания в начале Давайте посмотрим на вершине с X.

Поскольку DFX работает вокруг Ист - Пойнт (лицом к востоку = 0x00000000 / 0xFFFFFFFF), все наши расчеты будут осуществляться за пределами. Чтобы понять этот урок, я буду включать некоторые эффектные маленькие рисунки photoshuppered, Woo

The AIMBOT работает в четырех секторах. Это делает вещи проще , когда вы найдете расстояния. Вот сектора и как определить сектор является врагом:

Сектор 1 = к юго - востоку от нашего положения
сектора 2 = к юго - западу от нашего положения
сектора 3 = северо - западу от нашего положения
сектора 4 = северо - восток от нашей позиции

Итак , давайте добавим эти секторы нашего источника код. Обратите внимание , что мы также должны сказать нашему Aimbot , что делать , если они, например, к востоку от нас, но то же самое на оси NS. Нет необходимости ставить код , если они одинаковы в обоих NS и оси РЭБ, в противном случае вам не нужно будет его установить цель для вас, вы на них


код:
пустота SetCrosshairOnEnemy (BYTE PlayerNumber)
(
PLAYER_DATA GetPlayerData PlayerNumber оп = (); игрок / Противодействие = оп
PLAYER_DATA GetMyPlayerData сП = (); / CP = Текущий игрок (наш игрок) .. извините за плохие имена вара :)

/ * S * 1 /
если (oP.coordEW> сП. coordEW & & <= oP.coordNS cP.coordNS)
(
)

/ S * 2 * /
если (oP.coordEW <= & & cP.coordEW oP.coordNS <cP.coordNS)
(
)

/ S * 3 * /
если ( oP.coordEW <cP.coordEW & &> = oP.coordNS cP.coordNS)
(
)

/ S * 4 * /
если (oP.coordEW> = & & cP.coordEW oP.coordNS> cP.coordNS)
(
)
)

Теперь чтобы получить угол , мы должны посмотреть, что мы должны сделать треугольник между осью РЭБ, мы и игрок. Таким образом , мы должны найти угол , что мы на вершине. Вот притягательный маленькие рисунки:
96db91.jpg


Это вид сверху:
Blue Dot = Наш читатель
Красная точка = враг
Зеленый = треугольник мы
Фиолетовый = угол , мы должны найти
Orange = Разница заключается в том, что мы должны выработать угол

Incase вы забыли Triganometry то для следующих двух, мы можем получить легче, пусть функцию тангенса:
Tan (угол) = противный / смежную

Во всех секторах EW соседней разница, а противоположная разница NS. Итак , давайте добавим код нашей функции:


Код:
недействительный SetCrosshairOnEnemy (BYTE PlayerNumber)
(
PLAYER_DATA GetPlayerData PlayerNumber оп = ();
PLAYER_DATA GetMyPlayerData сП = ();

EWdif двойной / / они должны быть вдвое больше, чем для наших расчетов Тригли работать позже
NSdif дважды;

/ * S * 1 /
если (oP.coordEW> cP.coordEW & & <= oP.coordNS cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
)

/ S * 2 * /
если (oP.coordEW <= & & cP.coordEW oP.coordNS <cP.coordNS)
(
oP.coordEW EWdif cP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
)

/ S * 3 * /
если (oP.coordEW <cP.coordEW & &> = oP.coordNS cP.coordNS)
(
oP.coordEW EWdif cP.coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
)

/ S * 4 * /
если (oP.coordEW> = & & cP.coordEW oP.coordNS> cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
)
)

Пожалуйста , обратите внимание , что в каждый сектор, расчеты не совпадают. Вам нужно взять больше малейшую надежду ... это очевидно. Итак, теперь у нас есть, нам нужно , чтобы получить угол в градусах. Для этого мы должны вернуться к формуле:

Тан (угол) = противному / Прилегающие
Tan (угол) = NSdif / EWdif

Мы должны сделать обратную функцию касательной, так что мы можем получить угол , а не тангенс угла. Функция сделать это Атан (atan2 мог бы использовать , но не знали , что функция в момент программирования). Он принимает двойной параметр и возвращает двойное значение угла в радианах. Но это не хорошо для нас, мы хотим градусов. Ну, чтобы преобразовать радианы в градусы, к умножению 0.29578 '57 «как за пределами tinternet :) Не забудьте включить <math.h> функция Atan

Тогда, из - за нашей X не выглядит максимум 360, который увеличивается до 0xFFFFFFFF (4294967295), мы находим процент , что этот угол равен 360. Это связанно с тем , что мы можем обнаружить значение , что нам нужно использовать, например:
Если угол 90 градусов
90/360 = 0,25 (десятичный процент от угол)
0xFFFFFFFF 3FFFFFFF * 0,25 = (приблизительно), что новое значение , мы должны использовать

Давайте соберем это в коде:

код:
недействительный SetCrosshairOnEnemy (BYTE PlayerNumber)
(
PLAYER_DATA GetPlayerData PlayerNumber оп = ();
PLAYER_DATA GetMyPlayerData сП = () ;

EWdif двойная;
NSdif двойной;
двойной угол / / угол в градусах между врагом на востоке, и мы
угол р дважды / / Десятичный процент от угла

/ * S * 1 /
если (oP.coordEW> cP.coordEW & & <= oP.coordNS cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
угол = Atan (NSdif / EWdif) 57,29578 * / / Помните, 57,29578 является преобразование из радиан в градусы :)
угол р = (angleA / 360);
)

/ S * 2 * /
если (oP.coordEW <= & & cP.coordEW oP.coordNS <cP.coordNS)
(
oP.coordEW EWdif cP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
)

/ S * 3 * /
если (oP.coordEW <cP.coordEW & &> = oP.coordNS cP.coordNS)
(
oP.coordEW EWdif сП .coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
)

/ S * 4 * /
если (oP.coordEW> = & & cP.coordEW oP.coordNS> cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360) ;
)
)
Тогда мы должны знать , что делать с этим кодом на другое время ... дизайн Дуди ub3r-1337!
dmd4df.jpg


Чтобы понять, помните , что 0 в нашем X-Look это ... и значения идут против часовой стрелки. Давайте вернемся к секторам:

Сектор 1 (SE) = 0xFFFFFFFF (восток) - наше новое значение
сектора 2 (SW) = 0xFFFFFFFF / 2 (запад), наше новое значение
Сектор 3 (NW) = 0xFFFFFFFF / 2 (запад) - наш новое значение
Sector 4 (NE) = 0 (восток), наше новое значение

Прежде чем писать их, однако, мы должны преобразовать их обратно в двойные слова, удваивается. Вот новый код:


Код:
недействительный SetCrosshairOnEnemy (BYTE PlayerNumber)
(
PLAYER_DATA GetPlayerData PlayerNumber оп = ();
PLAYER_DATA GetMyPlayerData сП = ();

EWdif двойной;
NSdif двойной,
двойной угол,
угол р двойной,
двойное новое_значение / / Чтобы удержать наше новое значение пара
DWORD newValue2 / / для того, чтобы отворачиваться от двойного типа DWORD готов написать

halfCircle двойного = 0xFFFFFFFF / 2 / / Просто , чтобы сделать код легче читать немного :)

/ * S * 1 /
если (oP.coordEW> сП. coordEW & & <= oP.coordNS cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360 );
новое_значение = - 0xFFFFFFFF (0xFFFFFFFF * угол р) / / Как описано выше :)
newValue2 новое_значение = / / Установите его в DWORD (может получить компилировать предупреждения о потере данных .. поэтому мы делаем это :)
Poke ( (недействительными *) & cP.lookXa newValue2, 4) / / Написать новое значение
)

/ S * 2 * /
если (oP.coordEW <= & & cP.coordEW oP.coordNS <cP.coordNS)
(
oP.coordEW EWdif cP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
Угол = Atan (NSdif / EWdif) * 57,29578;
= угол р (angleA / 360);
halfCircle новое_значение = (0xFFFFFFFF * угол р);
newValue2 = новое_значение;
Poke ((недействительными *) & cP.lookXa newValue2, 4);
)

/ S * 3 * /
если (oP.coordEW <cP.coordEW & &> = oP.coordNS cP.coordNS)
(
oP.coordEW EWdif cP.coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
halfCircle новое_значение = - (* угол р 0xFFFFFFFF);
newValue2 = новое_значение;
Пок ((недействительными *) & cP.lookXa newValue2, 4);
)

/ S * 4 * /
если (oP.coordEW> = & & cP.coordEW oP.coordNS> cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
новое_значение = 0 (* угол р 0xFFFFFFFF);
newValue2 = новое_значение;
Poke ((пустота *) & cP.lookXa newValue2, 4);
)
)
WOOOO мы теперь имеем наши глаза X сопровождающая врага , который вы укажете (или , по крайней мере, если вы скопировали и вставили правильно, вы должны иметь :p)

Если бы вы могли прочитать все это на одном дыхании, назад * хорошо сделано * аплодисменты, этот ублюдок берет меня возрасты , чтобы написать , Оки Док, время закуски снова, то , чтобы установить вид-Y
// - // - // - // - // - // - // - // - // - // - // - / / - // - // - // - // - // - // - // - // - // - // - // - // - // - // - //

Хорошо, для нашего Y-взгляд все еще аккуратный, ровный загар, и мы все еще должны сделать треугольник. На этот раз, представьте себе , у нас уже есть X-замкнутое озираются вокруг них, и они смотрят лицом к лицу прямо .... точку, тот же уровень расстоянии от нас , как это, который находится прямо над / под ним. Это точка, то наш игрок, то игрок противника. Вот еще один рисунок (класс людей, я должен поставить это дерьмо на DeviantArt :p):
Слушайте
Прочитано фонетический На
2ds1i68.jpg


этот раз есть только два «сектор» ... если враг находится ниже нас или над нами.

Расстояние между нами вместе с ним видением уровня получается Пифагором в EWdif и NWdif. Затем мы используем это, и UDdif как противоположность и прилегающие и делать то же самое , как и раньше. На этот раз, однако, мы должны включить немного так , что враг в то же время мы также :)

Вот обновленный код:


Код:
недействительный SetCrosshairOnEnemy (BYTE PlayerNumber)
(
PLAYER_DATA GetPlayerData PlayerNumber оп = ();
PLAYER_DATA GetMyPlayerData сП = ();

EWdif двойной;
NSdif двойной;
UDdif двойной;

двойной угол;
угол р двойной;
angleB двойной;
angleBP двойного;

двойное новое_значение;
DWORD newValue2;

newValueb двойной;
DWORD newValueb2;

halfCircle двойной = 0xFFFFFFFF / 2;

/ * S * 1 /
если (oP.coordEW> cP.coordEW & & <= oP.coordNS cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
новое_значение = - 0xFFFFFFFF (0xFFFFFFFF * угол р);
newValue2 = новое_значение;
Пок ((недействительными *) & cP.lookXa newValue2, 4);
)

/ S * 2 * /
если (ОЦ .coordEW <= & & cP.coordEW oP.coordNS <cP.coordNS)
(
oP.coordEW EWdif cP.coordEW = -;
NSdif = cP.coordNS - oP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
halfCircle newV ALUE = (0xFFFFFFFF * угол р);
newValue2 = новое_значение;
Poke ((недействительными *) & cP.lookXa newValue2, 4);

S * 3 * /
если (oP.coordEW <cP.coordEW & &> = oP.coordNS cP.coordNS)
(
oP.coordEW EWdif cP.coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
угол = Atan ( NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
halfCircle новое_значение = - (* угол р 0xFFFFFFFF);
newValue2 = новое_значение;
Пок ((недействительными *) & cP.lookXa newValue2, 4);
)

/ S * 4 * /
если (oP.coordEW> = & & cP.coordEW oP.coordNS> cP.coordNS)
(
cP.coordEW EWdif oP.coordEW = -;
NSdif = oP.coordNS - cP.coordNS;
угол = Atan (NSdif / EWdif) * 57,29578;
угол р = (angleA / 360);
новое_значение = 0 (* угол р 0xFFFFFFFF);
newValue2 = новое_значение;
Пок ((недействительными *) & cP.lookXa newValue2, 4);
)

/ / Совершено внешний вид-X, в настоящее время глядя на Y-

flatDist двойного = SQRT ((EWdif EWdif *) (* NSdif NSdif)) / / Получает расстояние в уровне между нами и противником, используя Пифагор ,

если (oP.coordUD == cP.coordUD)
(
Zero4 BYTE [4] = (0x00, 0x00, 0x00, 0x00);
Poke ((пустота *) cP.lookYa, Zero4, 4) / / Если мы на той же высоте, чтобы определить наше видение Y-0 (уровень)

) Else если (oP.coordUD> cP.coo rdUD)
(
UDdif = oP.coordUD - cP.coordUD / / Работа нашей UDdif
angleB = Атан (UDdif flatDist /) * 57.29578 / / ту же самую старую вещь , как и раньше
angleBP = (angleB / 360);
newValueb = 0 (* angleBP 0xFFFFFFFF);
newValueb2 = newValueb;
Poke ((недействительными *) & cP.lookYa newValueb2, 4);

) Иначе , если (oP.coordUD <cP.coordUD)
(
UDdif = cP.coordUD - oP.coordUD;
angleB = Atan (UDdif flatDist /) * 57,29578;
angleBP = (angleB / 360);
newValueb = - 0xFFFFFFFF (0xFFFFFFFF angleBP * );
newValueb2 = newValueb;
POKE ((пустота *) & cP.lookYa newValueb2, 4);
)
)
и у нас это есть в начале наброска Aimbot. Теперь кое - что о добавлении некоторых вещей ниже:
Blacklist (цели только для определенных людей ... использовать имя структуры игрока , чтобы увидеть , если они или нет)
задержка счета (свинцовые пули перед людьми для учета отставание в игре (если MP) путешествия пули, е)
счета дайвинг пятна (цель выше игрок , как пули , погружаясь их)
Grenade дуги (где бросить обучение гранатов для них , чтобы перейти от пункта назначения)
Enemy одна задачи (так не направлен на товарищах по команде)
только цель живых (стрельба мертвых не делает много)

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


Коды направиться вниз и выстрел
коды


Антитеррор
0x495A64
0x5B5A5C
0x2D3436
0x40271F
0x262926


Террор
0xDCB9B9
0xD0CCB9
0xDBAC95
0x3F2A20
0xAA8576
 
Фууу ЧИТОООР=))))))))
 
Ого, прикольно)
 
Прикольно
 
Назад
Сверху