Перейти к содержанию

keng

Ветераны
  • Постов

    1 635
  • Зарегистрирован

  • Посещение

  • Победитель дней

    55

Весь контент keng

  1. В этом весь и прикол нейронок. Ты просто скармливаешь ей входные данные (доступные хитбоксы, хп и проч.) и просишь стрелять таким образом, чтобы убивать максимально быстро, тратить меньше всего патронов и тому подобное. Дальше уже нейронка думает, или ты ее предварительно обучаешь на входных данных вида "если у противника 15хп - то стреляй хоть в пятку из любого оружия". PS: Была тут новость недавно, что валве свой античит теперь нейронкой обучают.
  2. Блин, приоритет - это круто. Можно для начала сделать тупо - ты же знаешь, что у тебя видно, а что нет, вот и сделай так, что в первую очередь приоритет выставляется тем хитбоксам, которые видны в момент проверки. Далее, если их несколько (которые видны), то можно отрандомить и не париться. Можно умнее - сделать коэффициент, типа у головы 100%, у тушки - 80%, у пяток - 20%, бла-бла-бла. Самое смешное, что нейронка тут прям отлично должна зайти, как инструмент решения, но надо над этим подумать.
  3. Предположу, что тебе нужно сделать самый сложный вариант - выбрать бит, который ты меняешь. Заводишь под него флаг. Находишь инструкцию, которая читает значение, что тебе нужно изменить. Делаешь инъекцию. В инъекции еще один флаг (как в телепорте) - нужно ли делать замену бита. Дальше механизм такой. Нужное значение кладешь в регистр, номер бита (из второго флага) - в другой регистр. И делаешь XOR, типа XOR EAX,EBX. После этого, если в EAX лежало нужное тебе значение, бит под номером EBX поменяется на противоположный. Кладешь новое значение из EAX обратно туда, где оно было при инъекции. Сбрасываешь нужные флаги. Все.
  4. Побитовым сдвигом в скрипте, как мне кажется. Команды "SHL"/"SHR". Или через Lua, но я его не люблю и не пользуюсь, так что тут не подскажу.
  5. Я обычно делаю банальный таймер, который проверяет, есть ли хэндл нужного процесса. Если нет, то ищет процесс и пытается хэндл достать. Если есть - проверяет, есть ли процесс и сравнивает его идентификатор с запомненным. Не совпадают - значит игру перезапустили и нужно сбросить все опции, а так же получить новый хэндл на процесс.
  6. @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 в прологе функции. Обычно даже в асме все стараются придерживаться сишного соглашения о вызовах.
  7. keng

    FlatOut 2

    @gmz, прокомментируй свой пост. ;]
  8. keng

    FlatOut 2

    Скорее всего, банально открутили детектор коллизий или вообще физическое тело на уровне движка.
  9. Привет! Edit -> Settings -> General Settings -> Override the default font. Но, как я понимаю, это глобальная настройка шрифтов.
  10. Все так. Вот у тебя байт: "00000000", 8 бит, в каждом - ноль. В этом случае cmp 0 скажет ОК, cmp 1 скажет НЕ ОК. То есть когда ноль везде - то это однозначно ноль, а когда есть хоть где-нибудь единица - то уже НЕ ноль. А нас интересует только самый последний бит. Shr при этом не только "двигает" бит, но и все предыдущие заполняет нулями. Вот так: 0001 -> 0010 -> 0100 -> 1000. Shl делает то же самое, но двигает в другую сторону (побитовый сдвиг влево - left / right). ОффтопЪ: В моем посте с примером под спойлером чота все куда-то поехало в теге code. Как-то криво все-таки bb-тэги работают, или просто я не очень умный.
  11. Эта функция вернет ноль в EAX/RAX только если у нее не получится выполнить свою работу. В остальных случаях она вернет результат, состояние "нажато" - "не нажато" которого будет определяться 16-м битом. То есть test или cmp всегда сработают, независимо от положения этого самого шестнадцатого бита. По-хорошему нужно делать именно сдвиг и смотреть на бит. Вот пример. Допустим, что пришел нам результат в EAX:
  12. Ссылка говорит, что она не работает.
  13. GetAsyncKeyState возвращает тип SHORT, у которого последний бит может быть 0 (не нажато с последнего вызова этой функции) и 1 (нажато, соотв). SHORT - это 2 байта, т.е. 2*8 бит, итого 16, проверяется последний бит. Как проверяется? Например, побитовым сдвигом, что и делает shr - в данном случае, пихает 16-й бит (считаем с нуля) в регистр ax. Дальше идет проверка, есть ли там 1. GAKS - не самая надежная функция, хорошо она работает только с одним монитором, без виртуальных рабочих столов и без кучи разных потоков, но для наших нужд вполне сгодится.
  14. Привет! Расскажи, как ты уже пробовал.
  15. keng

    Нарушение

    Привет, мистер твинк! Тема считается закрытой ровно с того момента, как себя исчерпала, или как только на это указал ее автор. То, что темы висят открытыми, не означает что в них можно писать что угодно и когда угодно. Давай так: ты больше подобными вещами не занимаешься, а я снимаю предупреждение.
  16. @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.
  17. Привет! Можно загуглить "hex to float", hex - шестнадцатеричная система счисления, float - с точечкой. Там будет куча всяких онлайн-конвертеров, но в том числе и объяснение алгоритма их работы. Мне гугл предложил вот [такое] решение.
  18. А мне 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 совсем - так было проще.
  19. Если я правильно помню, то в том уроке я использовал довольно популярную игру, которая наверняка часто обновляется, а следовательно что-то в ней на данный момент может уже и не работать. Впрочем, я всегда старался продемонстрировать именно подход и технику в общих чертах, без привязки к какой-то конкретной игре, хотя тренироваться все равно стоит на той же самое игре, что и в уроке.
  20. Привет! Мой метод не является универсальным, то есть от игры к игре могут возникать различные проблемы. Предположу, что автоматический сканер - туповат, так что можно попробовать найти указатель вручную.
  21. Привет! Предлагаю указать название игры, чтобы кто-нибудь еще смог посмотреть, что происходит. Как самый простой вариант.
  22. Суть довольно простая, но лучше всего понимается на практике. Отладчик позволяет приостанавливать выполнение программы и смотреть на то, как она работает, пошагово. А так же - на значения переменных. Вот картинка с примером: Красный кружок слева от кода - это так называемая точка останова (или breakpoint). На эти штуки и ориентируется отладчик, когда работает. Увидит такую - и остановит дальнейшее выполнение программы. Желтая стрелка внутри кружочка - это место, где как раз выполнение программы и остановилось. После остановки можно жать вот на эти вот кнопки: http://www.whatprogramming.com/csharp/wp-content/uploads/2015/08/Debug1.png И выполнять дальше код по шагам. "Step over" - без входа "внутрь" других функций, перепрыгивая их вызовы, "step into" - залезая внутрь каждой встреченной функции или метода. Точки останова ставятся или удаляются просто кликом мыши. Можешь попробовать и проверить, что получится.
  23. Без использования отладчика - в том, что какая-то переменная в коде имела значение null и с ней пытались что-то сделать, думая что там будет не null.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.