-
Постов
1 635 -
Зарегистрирован
-
Посещение
-
Победитель дней
55
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент keng
-
В этом весь и прикол нейронок. Ты просто скармливаешь ей входные данные (доступные хитбоксы, хп и проч.) и просишь стрелять таким образом, чтобы убивать максимально быстро, тратить меньше всего патронов и тому подобное. Дальше уже нейронка думает, или ты ее предварительно обучаешь на входных данных вида "если у противника 15хп - то стреляй хоть в пятку из любого оружия". PS: Была тут новость недавно, что валве свой античит теперь нейронкой обучают.
-
Блин, приоритет - это круто. Можно для начала сделать тупо - ты же знаешь, что у тебя видно, а что нет, вот и сделай так, что в первую очередь приоритет выставляется тем хитбоксам, которые видны в момент проверки. Далее, если их несколько (которые видны), то можно отрандомить и не париться. Можно умнее - сделать коэффициент, типа у головы 100%, у тушки - 80%, у пяток - 20%, бла-бла-бла. Самое смешное, что нейронка тут прям отлично должна зайти, как инструмент решения, но надо над этим подумать.
-
Предположу, что тебе нужно сделать самый сложный вариант - выбрать бит, который ты меняешь. Заводишь под него флаг. Находишь инструкцию, которая читает значение, что тебе нужно изменить. Делаешь инъекцию. В инъекции еще один флаг (как в телепорте) - нужно ли делать замену бита. Дальше механизм такой. Нужное значение кладешь в регистр, номер бита (из второго флага) - в другой регистр. И делаешь XOR, типа XOR EAX,EBX. После этого, если в EAX лежало нужное тебе значение, бит под номером EBX поменяется на противоположный. Кладешь новое значение из EAX обратно туда, где оно было при инъекции. Сбрасываешь нужные флаги. Все.
-
Побитовым сдвигом в скрипте, как мне кажется. Команды "SHL"/"SHR". Или через Lua, но я его не люблю и не пользуюсь, так что тут не подскажу.
-
Я обычно делаю банальный таймер, который проверяет, есть ли хэндл нужного процесса. Если нет, то ищет процесс и пытается хэндл достать. Если есть - проверяет, есть ли процесс и сравнивает его идентификатор с запомненным. Не совпадают - значит игру перезапустили и нужно сбросить все опции, а так же получить новый хэндл на процесс.
-
@krocki, если вдруг интересно, то регистр ESP - это вершинка стека. А штуковины вида "MOV EAX, [ESP+4]" - это чтение аргументов функции. Попробую примерно объяснить суть. Вызываешь ты функцию: invoke Foo,1,2 Эквивалент: PUSH 2 PUSH 1 CALL [Foo] Как при этом работает PUSH? Допустим, что оба параметра у тебя - 32-битные. Стек изначально выглядит как-то так: 0000 0000 0000 Когда ты делаешь PUSH, стек сдвигается: PUSH 2 0002 0000 0000 0000 А после вызова функции через стек передается адрес возврата, вместе с параметрами: 0x1234 0001 0002 0000 0000 0000 И вот ESP при этом будет указывать на 0x1234, [ESP+4] - 1, [ESP+8] - 2, типа того. Сама по себе команда push делает вот так: PUSH arg - это: SUB ESP,4 MOV [ESP], arg Т.е. "отрезается" 4 байта на стеке и в них записывается аргумент, который на стек нужно положить. PS: Я чуток дополню. Копирование ESP в EBP нужно для того, чтобы всегда знать, где изначально лежали параметры. Процедура, которую вызывают, обращается к аргументам на стеке через EBP, в который предварительно сохраняет ESP в прологе функции. Обычно даже в асме все стараются придерживаться сишного соглашения о вызовах.
-
Скорее всего, банально открутили детектор коллизий или вообще физическое тело на уровне движка.
-
Привет! Edit -> Settings -> General Settings -> Override the default font. Но, как я понимаю, это глобальная настройка шрифтов.
-
Все так. Вот у тебя байт: "00000000", 8 бит, в каждом - ноль. В этом случае cmp 0 скажет ОК, cmp 1 скажет НЕ ОК. То есть когда ноль везде - то это однозначно ноль, а когда есть хоть где-нибудь единица - то уже НЕ ноль. А нас интересует только самый последний бит. Shr при этом не только "двигает" бит, но и все предыдущие заполняет нулями. Вот так: 0001 -> 0010 -> 0100 -> 1000. Shl делает то же самое, но двигает в другую сторону (побитовый сдвиг влево - left / right). ОффтопЪ: В моем посте с примером под спойлером чота все куда-то поехало в теге code. Как-то криво все-таки bb-тэги работают, или просто я не очень умный.
-
Эта функция вернет ноль в EAX/RAX только если у нее не получится выполнить свою работу. В остальных случаях она вернет результат, состояние "нажато" - "не нажато" которого будет определяться 16-м битом. То есть test или cmp всегда сработают, независимо от положения этого самого шестнадцатого бита. По-хорошему нужно делать именно сдвиг и смотреть на бит. Вот пример. Допустим, что пришел нам результат в EAX:
-
Ссылка говорит, что она не работает.
-
GetAsyncKeyState возвращает тип SHORT, у которого последний бит может быть 0 (не нажато с последнего вызова этой функции) и 1 (нажато, соотв). SHORT - это 2 байта, т.е. 2*8 бит, итого 16, проверяется последний бит. Как проверяется? Например, побитовым сдвигом, что и делает shr - в данном случае, пихает 16-й бит (считаем с нуля) в регистр ax. Дальше идет проверка, есть ли там 1. GAKS - не самая надежная функция, хорошо она работает только с одним монитором, без виртуальных рабочих столов и без кучи разных потоков, но для наших нужд вполне сгодится.
-
Привет! Расскажи, как ты уже пробовал.
-
Привет, мистер твинк! Тема считается закрытой ровно с того момента, как себя исчерпала, или как только на это указал ее автор. То, что темы висят открытыми, не означает что в них можно писать что угодно и когда угодно. Давай так: ты больше подобными вещами не занимаешься, а я снимаю предупреждение.
-
Закрываю.
-
@Garik66 скромничает, ассемблер он уже явно вполне знает. ;] Не надо вставлять никуда тот код, который ты не понимаешь. Лучше выпиши незнакомые слова и найди, что они обозначают. В примере объявляется переменная: var D Double С типом double, который то же самое, что и float, только другой точности (нулей после точки больше). И еще одна, но с типом Int64: var I64 Int64 Далее D конвертируется и записывается в I64: I64 := PInt64(@D)^; После чего выводится на экран (%.16X', [I64]), причем конструкция 16Х заставляет выводить не просто цифры, а в формате HEX. Дальше происходит обратная конвертация: D2 := PDouble(@I64)^; Итого чтобы перевести из HEX в Double тебе понадобится прочитать нужное значение в переменную с типом Int, а затем сделать вот эту вот последнюю строчку и получить double. Результат уже можно будет запихивать в EditBox.
-
Привет! Можно загуглить "hex to float", hex - шестнадцатеричная система счисления, float - с точечкой. Там будет куча всяких онлайн-конвертеров, но в том числе и объяснение алгоритма их работы. Мне гугл предложил вот [такое] решение.
-
А мне TSearch всегда очень нравился, хотя сам я начинал с Cheat-o-Matic и MTC. Автор, ты подумай как следует над поставленной задачей. ESP - это довольно обширное понятие. Попробуй начать с того, что тебе вдруг понадобилось над каждым персонажем в игре нарисовать, допустим, точку. Что для этого нужно? Нужно две вещи - научиться рисовать в окне игры и понять, где именно рисовать. Для первого можно использовать графийческий API самой Windows (GDI), рисуя прям поверх окна. Или Direct3D/OpenGL, которые используются 99% всех современных игр для вывода графики, потому что тут можно видеокарту задействовать и это чуток производительнее. Для второго тебе нужно хотя бы в общих чертах представлять, как игра работает. Вся суть триде графики заключается в том, чтобы реалистично отрисовывать трехмерную сцену в двумерном пространстве, то есть на мониторе. Тут перед глазами начинает мелькать 7-й класс средней школы и в мозгу яркой лампочкой вспыхивает слово "геометрия", а затем - "проекция". Игра умеет проецировать 3D объекты на 2D экран монитора. Очевидно, что там есть какая-то система координат, причем не одна. Одна - у монитора (0.0 - 1920.1080, например), вторая - в 3D-пространстве игры. Чтобы нарисовать точку, нужно найти координаты нужного объекта в игре в 3D, а затем спроецировать их на 2D монитор и уже по этим координатам нарисовать точку. С этим разобрались. Осталось последнее - найти координаты в 3D-пространстве. Тут логично будет предположить, что координаты являются "частью" игрового объекта так же, как и все остальные его характеристики, и хранятся они где-то рядом в одной кучке, чтобы игре не нужно было сильно напрягаться и далеко ходить. Типа вот так: Персонаж { Здоровье Патроны Координаты } Можно попробовать найти, где в памяти лежит какая-то из быстронаходимых характеристик (здоровье или патроны, т.к. их банально видно на экране), а затем посмотреть, что лежит в памяти вокруг. Если повезло - значит повезло и координаты нашлись. Правда, тут сразу возникает еще одна проблема - допустим, нашел я координаты своего персонажа, а дальше-то что? Мне всех нужно найти. Получается, что игра в любом случае каким-то образом знает, где лежат все игроки. Я попробовал взять координаты и отладчиком посмотреть, какие инструкции обращаются к ним на чтение - очевидно, что чтобы нарисовать объект, нужно прочитать его координаты. Дальше я долго-долго возился с каждой инструкцией и выяснял, что еще та или иная инструкция рисует, и относятся ли очередные координаты к игроку (моему или нет). В результате я нашел инструкцию, которая читает только игроков. Игроки, как выяснилось, лежат в массиве. На него я нашел указатель и таким образом получил доступ к координатам всех игроков. Вуаля.Это уже потом я нашел более простой способ через поиск двойного указателя на своего игрока, но кто ж знал. Итого - у меня есть координаты, я могу их читать, круто. Дальше я почитал, как можно проецировать координаты из игровых (3D) в монитор (2D), бегал в цикле по массиву координат, читал их, делал проекцию и рисовал на мониторе точку. Вроде и все, но фантазия тут может очень сильно разгуляться. Из инструментов мне понадобились CE, OllyDbg, fasm, исходники Quake и дофига времени. PS: Изначально я вообще тренировался на игре Crimsonland, которая и не 3D совсем - так было проще.
-
На эту тему урок тоже есть, может даже два.
-
Если я правильно помню, то в том уроке я использовал довольно популярную игру, которая наверняка часто обновляется, а следовательно что-то в ней на данный момент может уже и не работать. Впрочем, я всегда старался продемонстрировать именно подход и технику в общих чертах, без привязки к какой-то конкретной игре, хотя тренироваться все равно стоит на той же самое игре, что и в уроке.
-
Привет! Мой метод не является универсальным, то есть от игры к игре могут возникать различные проблемы. Предположу, что автоматический сканер - туповат, так что можно попробовать найти указатель вручную.
-
Привет! Предлагаю указать название игры, чтобы кто-нибудь еще смог посмотреть, что происходит. Как самый простой вариант.
-
Суть довольно простая, но лучше всего понимается на практике. Отладчик позволяет приостанавливать выполнение программы и смотреть на то, как она работает, пошагово. А так же - на значения переменных. Вот картинка с примером: Красный кружок слева от кода - это так называемая точка останова (или breakpoint). На эти штуки и ориентируется отладчик, когда работает. Увидит такую - и остановит дальнейшее выполнение программы. Желтая стрелка внутри кружочка - это место, где как раз выполнение программы и остановилось. После остановки можно жать вот на эти вот кнопки: http://www.whatprogramming.com/csharp/wp-content/uploads/2015/08/Debug1.png И выполнять дальше код по шагам. "Step over" - без входа "внутрь" других функций, перепрыгивая их вызовы, "step into" - залезая внутрь каждой встреченной функции или метода. Точки останова ставятся или удаляются просто кликом мыши. Можешь попробовать и проверить, что получится.
-
Без использования отладчика - в том, что какая-то переменная в коде имела значение null и с ней пытались что-то сделать, думая что там будет не null.