-
Постов
319 -
Зарегистрирован
-
Посещение
-
Победитель дней
43
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные imaginary
-
-
7 часов назад, Senpai сказал:
ну, если я хочу для gta san andreas
Конечно есть! Если коротко - берёшь объект - узнаёшь его размер. После - делаешь "луч" как его можно назвать - От объекта двигаешься координатами к игроку по прямому вектору, проверяешь не стоит ли там чего - если стоит (стена например) проверяешь левый угол объекта, потом правый, верх низ, все дела. (Это всё жрёт кучу времени и памяти) и так ты узнаешь только видимость центра объекта и его сторон, (делать больше лучшей это убиться веником). Так же тебе надо проверить находится ли объект в видимости камеры. Если все условия удовлетворены - объект видим, если нет - не видим (или за какой нибудь стеклом и тд). Можно пойти другим путём. Узнать каждые координаты тайлов вокруг персонажа, стены, пол и тд. Их размер и геометрию. После = исходя из этого, опять же по всяким сложным формулам вычисляешь находится ли часть объекта в зоне видимости, лучше проверять по периметру, это тоже будет жрать кучу ресурсов. А и не забывай что у тебя не 1 объект (вероятно) а куча, так что с такими проверками игра станет слайд шоу =).
-
6 минут назад, Garik66 сказал:
ещё как запишется
Оно может и запишется, но не в байт, а 4 займёт, если большое число то в любом случае в байт не влезет ведь.
а ещё, в 64 даже инструкции в 4 байта внедряются с пропусками занятыми нопами, куча места тратится зря -
16 часов назад, Garik66 сказал:
весело наблюдать как ты пытаешься найти ошибки при объявлении переменных
Мне казалось там dd а не db, с кем не бывает? ? Конечно в db float не запишется...
-
22 минуты назад, Garik66 сказал:
Пример
В статье нет примеров и видео, поскольку мне кажется тут не о чем больше рассказывать, (в отличии от FPU) ?
-
В данном руководстве описано как использовать xmm регистры, а так же некоторые команды.
Список некоторых команд (напоминалка):
СпойлерРегистры
xmm0
xmm1
xmm...
xmm15
Выполняют те же функции что и обычные регистры, но могут хранить в разы больше. Могут быть приёмником и источником для команд MMX.Команды записи
movd *,* - записывает 4 байта из переменной в приёмник.
movq *,* - записывает 8 байт.
movss *,* - записываем float (4 байта) из переменной в приёмник
movsd *,* - записывает doble (8 байт) их переменной в приёмник
Массивные
movups *,* - записывает 4 элемента массива в том порядке в котором они идут в приёмник
movaps *,* - записывает выравненные 4 элемента массива
movhlps *,* - записываем 2 левых элемента из источника в 2 правых приёмника
movlhps *,* - записываем 2 правых элемента из источника в 2 левых приёмника
movhps *,* - записывает 2 левых элемента из источника в 2 левых приёмника.
movlps *,* - то же что и выше но 2 правых элемента.Арифметические команды. Любые действия выполняются в следующем порядке - приёмник на источник, запись в приёмник. (приёмник это первая *, источник - вторая *)
addsd *,* - сложение двух чисел с плавающей запятой, типа doble (8 байт).
subsd *,* - то же что выше но вычитание.
mulsd *,* - Умножение.
divsd *,* - Деление.
sqrtsd *,* - Корень из doble
addss *,* - Сложение двух float (4 байта)
subss *,* - Вычитание float
mulss *,* - Умножение float
divss *,* - Деление float
sqrtss *,* - Корень из float
Массивные
addps *,* - складывает 2 массива
subps *,* - вычитает массив из массива
divps *,* - делит массив на массив.
mulps *,* - умножает массив на массив.
sqrtps *,* - корни из массиваКоманды сравнения
comiss - сравнение двух float
comisd - сравнение dobleКоманды преобразования
cvtsi2ss - преобразовать целое в float
cvtsi2sd - преобразовать целое в doble
cvttss2si - преобразовать вещественное в целое с округлением.
О регистрах:
Регистры в этих дополнениях сопроцессора очень похожи на основные, но в отличии от них могут содержать целых четыре элемента, и даже работать сразу со всеми четырьмя!
Арифметические операции с регистрами:
Все функции сложения, вычитания, и другие могут быть совершены только с регистрами.
Такая инструкция сработает:addss xmm0,[MyLabel]
А такая - нет.
addss [MyLabel],xmm0
Потому следует все операции производить после записи регистров.
Например, если необходимо прибавить что нибудь к переменной можно использовать такой код:movss xmm0,[MyLabel] //Записываем в xmm0 наше число addss xmm0,[MyAddValue] //Добавляем к нему другое movss [MyLabel],xmm0 //Записываем из xmm0 назад в число.
Так же нужно помнить что регистры это не стек, и потому значения свои сохраняют после записи.
Как уже было сказано выше, эти регистры могут содержать целых 4 элемента - работа с массивами:
Массив должен состоять из четырёх элементов, например такой:MyMassiv: dd (float)2 dd (float)7 dd (float)29324.126 dd (float)8261.3
Что бы записать этот массив в xmm мы можем использовать следующий код:
movups xmm0,[MyMassiv]
После чего получим в xmm0 все четыре числа по порядку.
Теперь мы можем сделать что нибудь с этим массивом, например умножить его на другой массив. К примеру вот такой:MyMassivMul: dd (float)1 dd (float)2 dd (float)0.5 dd (float)2
Умножаем:
movups xmm0,[MyMassiv] //Загружаем наш массив movups xmm1,[MyMassivMul] //Загружаем массив на который умножим mulps xmm0,xmm1 //Умножаем movups [MyMassiv],xmm0 //Возвращаем в наш массив.
После выполнения этого кода, массив примет такой вид:
2; 14; 14662,063; 16522,6.
Так же можно вычитать, делить, находить корень, складывать, и многое другое.- 1
- 2
-
29 минут назад, Redear сказал:
Что то не работает,
Всё не работает, например ты пустой адрес записываешь в ebx, после в [00000000](ebx) записываешь edx, и соответственно вылет.
AOB - когда выбираешь как сделать инъекцию кода, есть выбор AOB. Это инъекция с поиском байт - CE ищет байты и после туда внедряет код.
Лучше всего тебе пойти посмотреть самые начальные уроки.
Какое название у игры? -
47 минут назад, Redear сказал:
они становятся недействительны
Для этого и существуют скрипты, берёшь какую нибудь инструкцию которая работает с твоим игроком, например с его здоровьем, типа такой
Пример:mov [eax+123],ecx
На неё делаешь скрипт, в скрипте создаёшь метку, вроде такого:
Спойлер[ENABLE] //В этом разделе метку label(MyPlayer) //Метку делаем registersymbol(MyPlayer) //Регистрируем её //Всякий код --- //Твой код mov [MyPlayer],eax //Предположим что ты сделал на mov [eax+123]. //Записываем в метку наш адрес игрока. //Тут после кода и возвратного прыжка пишем: MyPlayer: dd 0 //Выделяем памяти под метку, что бы хватило на адрес игрока, обычно 4 байта, если 64 бит то может быть 8. [DISABLE] //Прямо сразу после unregistersymbol(MyPlayer) //Снимаем регистрацию с метки.
Теперь, добавляешь в таблицу MyPlayer (в строку адреса вписываешь).
В итоге получаешь при активации адрес своего игрока, и наплевать на обновления. (инъекцию AOB делать надо).
Но учти, что инструкция должна работать только с твоим игроком.- 1
-
24 минуты назад, Redear сказал:
пустые адреса памяти, в которые можно записывать
Создай скрипт типа такого:
Спойлер[ENABLE] alloc(newmem,200) //выделяем память под наш код (newmem) registersymbol(newmem) //Регистрируем наш код [DISABLE] dealloc(newmem) //отменяем вылеоение памяти unregistersymbol(newmem) //Снимаем регистрацию
Всё, теперь ты можешь писать в newmem всё что хочешь, в пределах выделенного места. То есть например:Спойлер//Пишем в наше место что нибудь mov [newmem],1 mov [newmem+4],5 mov byte ptr [newmem+8],1 mov byte ptr [newmem+9],1
А на счёт твоего кода, как бы там ни было, мне кажется ты записываешь в адрес переход по которому ничего не даст, то есть ведёт в никуда, попробуй сделать отладку. Мне не совсем понятно что ты пытаешься сделать, но если хочешь записать в тот адрес что то своё, то просто сделай:mov [ebp-10],edx //В место edx что то своё
- 1
-
26 минут назад, Redear сказал:
через veh, игра просто закрывается. в виндовс отладчике такого не было
Возможность смены отладчика как раз и позволяет например обойти защиту игры от отладки. Если хорошо работал windows отладчик, то незачем менять на другой.
-
1 час назад, inturist сказал:
Тратим стамину и.... ничего
Ты слишком банально себе это всё представляешь, тк ты искал адрес который (ключевое слово) храниться в другом, совсем не обязательно что там инструкции будут руководствоваться той же логикой что и предыдущие. Попробуй сделать скрипт и уже дальше смотри, если прямо проблема то повесь опять же скрипт на одну из первых инструкций и получай оттуда адрес игрока.
-
20 минут назад, inturist сказал:
все сводится к тому самому ebx, [ebx]
Так может и не мучиться а написать скрипт который будет в метку записывать адрес игрока, а повесить его на эту инструкцию. Или же сделать запись того адреса в метку перед тем как он запишет сам себя. Вроде такого:
your_code: mov [labelw],ebx code: mov ebx,[ebx]
-
38 минут назад, inturist сказал:
обращается к нему независимо от того, делаю ли я в игре хоть что либо.
Всё правильно, там же есть элементы здоровья и тд? Игре же надо знать сколько и по какому адресу, что бы показать тебе на экран. Так что это то как раз не удивительно. На счёт отладчика, попробуй изменить тип в настройках.
-
17 часов назад, inturist сказал:
вида mov ebx,[ebx]. От моих действий не меняется абсолютно ничего
Заметь, дебагер показывает только конечный адрес, то есть после выполнения mov ebx,[ebx] он покажет тебе не нужное смещение, а твой же адрес.
Потому перейди в отладчик - поставь бряк на этот адрес, и как только бряк поймает поток посмотри вправо - там появятся все регистры. Скопируй оттуда ebx, в нём должен быть правильный адрес. Это смещение +0. После можешь убрать бряк и запустить выполнение. Все нужные функции найдёшь в Debug. -
FreeCam - свободная камера, подразумевает возможность полёта камеры отдельно от объекта/персонажа и тому подобного, используется в самых разных целях, для обнаружения противников, для создания красивых снимков, для нахождения секретов и тому подобного.
Принцип создания:
Всё зависит от типа игры. Если реализован поворот камеры мышью - то данную функцию делать не нужно. Для перемещения камеры можно использовать самые разные функции, но я склоняюсь к полёту в ту сторону куда смотрит игрок. Для этого необходимо вычислить синус и косинус для поворота по горизонтальной, и синус для поворота по вертикальной оси. После их надо умножить на радиус, мы получим точку на сфере - это и будет вектор ускорения для камеры. Его следует добавлять к уже существующим координатам камеры, изменяя радиус мы можем изменять скорость.
Для того что бы камера была "свободная", нужно записывать свои значения в координаты, а функцию которая записывает их в игре по стандарту - отключить.
Более детально всё показано в следующем видео
Создание свободной камеры на примере игры "WarThunder":
Спойлер
Видео где показан принцип работы формул: тык- 6
- 1
-
4 минуты назад, mumut сказал:
А как понять что сигнатура уникальная ?
Ставишь тип поиска Array of byte (Массив байт) ставишь "без разницы" в Writable и CopyOnWrite (синие квадратики вместо галочки), ставишь галочку hex у строки поиска, вставляешь массив и ищешь.
Дам тебе ещё совет как там можно очень просто реализовать бесконечные патроны. Замени в своём скриптеja Borderlands2.exe+A189C2
На
jb Borderlands2.exe+A189C2
Только это еще сделает врагов бессмертными, и тебя ?
-
Только что, mumut сказал:
То есть я могу попробовать сделать так
Да , вижу у тебя не пересекаются jmp. А так ты можешь сделать, только смотри что бы сигнатура осталась уникальной.
-
8 минут назад, mumut сказал:
А можешь показать пример
Например у тебя в коде есть какая нибудь сигнатура допустим (случайные числа) 23 7B 26 22, CE ищет эту сигнатуру. У тебя есть ещё один скрипт, он при поиске
использует её же. Первый скрипт изменяет сигнатуру своим jmp *название метки*. Например он меняет первые 2 байта. (23 7B). Тебе надо найти вторые 2 байта и туда поставить скрипт, но первые байты изменены. Вместо этих байтов ставишь ** ** 26 22. Но так сигнатура может потерять свою уникальность, потому смотришь что есть выше в отладчике - например A5. Добавляешь A5 ** ** 26 22. Проверяешь поиском - уникально - используешь. Но вообще не стоит делать 2 скрипта которые работают в одном месте, сделай всё в одном скрипте. И к тому же, у тебя один скрипт может перезаписывать кусок jmp от другого, скорее всего будет просто вылет программы. -
Найти сигнатуру для поиска вручную, байты которые изменяются можешь обозначить ? или *, тогда CE будет принимать любые байты там, но при этом ты должен
сохранить уникальность сигнатуры. -
5 часов назад, ScalesAir сказал:
Компилятор ругается на строки типа
Если так, то перефразируй строки в такой вариант:
mov eax,[*adress*] mov eax,[eax]
-
50 минут назад, Garik66 сказал:
Не правильно
А какая разница, значение целое, находятся рядом, что так что эдак выходит одно и то же ведь ?
-
В видео показано как сделать моментальную башню у танка, а так же что еще можно сделать моментальным.
Скрипт на башню (64 бит):Спойлер[ENABLE] aobscanmodule(BashnyaForcer,aces.exe,F3 0F 10 43 38 E8) alloc(newmem,$124,"aces.exe"+175FFE) label(code) label(return) newmem: cmp [rbx+38],0 je code push eax mov eax,[rbx+60] mov [rbx+38],eax mov eax,[rbx+64] mov [rbx+3C],eax pop eax code: movss xmm0,[rbx+38] jmp return BashnyaForcer: jmp newmem return: registersymbol(BashnyaForcer) [DISABLE] BashnyaForcer: db F3 0F 10 43 38 unregistersymbol(BashnyaForcer) dealloc(newmem)
Советую написать свой скрипт на функции которая записывает в поворот, так будут намного качественней движения башни.
Видео:
Спойлер- 3
-
Не будет, второе cmp перезапишет флаги первого, будет работать только второе.
Лучше напиши:cmp [esi+A4],4 jg code cmp [esi+A4],3 jl code
-
В этом руководстве показан принцип работы стека FPU и обращение с ним, рассмотрены команды загрузки, записи, проверки, и другие.
Первая часть:
Спойлер
Вторая часть:
Спойлер- 1
- 3
-
*Длинное видео к тому же содержит кучу моих ошибок, советую посмотреть полностью, (если будете сразу что то делать) , возможно такой опыт вам пригодится ?
В этом видео показано как сделать сбор предметов с области (на сервере тоже) область регулируется (квадрат).
Скрипт (поиск персонажа):Спойлер[ENABLE] alloc(newmem,100) label(returnhere) label(originalcode) label(exit) label(PlayerAddr) registersymbol(PlayerAddr) newmem: mov [PlayerAddr],edx originalcode: fild dword ptr [edx+00000340] exit: jmp returnhere PlayerAddr: db 0 Terraria.Main::DrawInterface_Resources_Life+510: jmp newmem nop returnhere: [DISABLE] unregistersymbol(PlayerAddr) dealloc(newmem) Terraria.Main::DrawInterface_Resources_Life+510: fild dword ptr [edx+00000340]
Скрипт (сбор) с пояснениями:
Спойлер[ENABLE] alloc(newmem,600) label(returnhere) label(originalcode) label(exit) label(GrabSize) registersymbol(GrabSize) label(Control) registersymbol(Control) newmem: cmp byte ptr [Control],1 //Если не включено не делать ничего jne originalcode //Тут сделаем сразу преобразование координат fld dword [eax] //Берем координаты предмета. fistp dword [GrabSize+8] push ecx //Теперь нужно push ebx mov ecx,[PlayerAddr] //Адрес игрока в ecx, нам нужны его координаты! =) fld dword [ecx+20] fistp dword [GrabSize+C] //переводим в 4 байта mov ebx,[GrabSize+C] add ebx,[GrabSize] //Размер зоны поиска(проверяем в право) cmp [GrabSize+8],ebx jg noGrab //Если больше чем зона которую мы задаем вправо, то не собирать. mov ebx,[GrabSize+C] sub ebx,[GrabSize] //Размер зоны поиска проверяем влево. cmp [GrabSize+8],ebx //Если меньше зоны то не собирать. jl noGrab fld dword [ecx+20] //Заносим в стек Х координаты игрока fstp dword [eax] //Записываем в координаты предмета. fld dword [eax+4] //Берем координаты предмета Y. fistp dword [GrabSize+8] fld dword [ecx+24] //Берем координаты игрока по Y fistp dword [GrabSize+C] //переводим в 4 байта mov ebx,[GrabSize+C] add ebx [GrabSize+4] //Это вниз, чем ниже тем больше число cmp [GrabSize+8],ebx //Ниже чем зона то не трогать. jg noGrab mov ebx,[GrabSize+C] sub ebx [GrabSize+4] //Это вверх. cmp [GrabSize+8],ebx //Выше чем зона то не трогать. jl noGrab fld dword [ecx+24] //Заносим в стек Y координаты игрока fstp dword [eax+4] //Записываем в координаты предмета. mov byte ptr [eax+101],1 noGrab: pop ebx pop ecx originalcode: fld dword ptr [eax] mov eax,[ebp-000004E4] exit: jmp returnhere Control: db 0 GrabSize: db 0 0 0 0 //Это будет промежуточное значение Terraria.Main::DrawItem+50: jmp newmem nop nop nop returnhere: [DISABLE] unregistersymbol(Control) unregistersymbol(GrabSize) dealloc(newmem) Terraria.Main::DrawItem+50: fld dword ptr [eax] mov eax,[ebp-000004E4]
Видео (2 часа):
Спойлер- 1
- 1
Принцип создания свободной камеры в играх.
in Статьи для продвинутых
Опубликовано · Изменено пользователем inaginary
То - как работают разные формулы и как это выглядит на сфере.
Формула:
X = Rad*cos(AngV) * cos(AngG)
Y = Rad*sin(AngG)*cos(AngV)
Z = Rad*sin(AngV)