-
Постов
1 635 -
Зарегистрирован
-
Посещение
-
Победитель дней
55
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент keng
-
Скорее всего, за это просто отвечает отдельная инструкция. Отладчик в руки - и вперёд!
-
Хз, не хочешь отлаживать - веди логи. Или отлаживать, или ещё как-то, или приводи полностью код всех процедур.
-
Привет! Если очень в кратце, то и код и данные игры (адреса значений, которые ты находишь в СЕ) хранятся в оперативной памяти. Разница тут в том, что код каждый запуск игры своего местоположения не меняет, т.е. находится всегда по одним и тем же адресам, в отличие от данных, которые могут появляться в разных её участках. Такое поведение вызвано технологией DMA - Dynamic Memory Allocation - динамическим распределением памяти. Борются с этой заразой двумя основными техниками: 1. Поиском указателей. Указатель - по факту, адрес, который хранит адрес какого-то значения игры. Ему пофиг на DMA, т.е. он _всегда_ будет знать, какой адрес будет иметь то или иное значение игры при каждом её запуске. Работать с указателями можно так же, как и с обычными адресами - изменять из значение, замораживать и так далее. 2. Инъекция кода. Суть - изменение кода игры. Код игры, в свою очередь, работает с адресами памяти, т.е. со значениями. Представь себе гипотетическую ситуацию: Адрес патронов: 0х123456. Адрес этот находится в оперативной памяти. Скажем, у нас 10 патронов. Как только стреляем - у нас за каждый выстрел отнимается по одному патрону. Отнимает их, скажем, вот такая функция: sub [0x123456],1 Ассемблерная команда "sub a,b", вычитает b из a, в данном случае - единицу из количества патронов. Допустим, что этот код находится по адресу 0x654321.Напомню, что и код и данные (адрес патронов в частности) находятся в оперативной памяти. А теперь мы берём и перезагружаем игру. Адрес патронов меняется: 0x11223344 А вот адрес инструкции, которая срабатывает при выстреле и отнимает у нас патроны, нет: 0x654321: sub [0x11223344],1 В чём же суть инъекции кода? Так как код никогда не меняет своего местоположения, то мы можем изменить саму инструкцию. К примеру, вычитать из количества патронов (инструкция всегда знает нужный адрес, так что указатель нам не нужен) не единицу, как было, а ноль. Или вообще поменять sub на add, и тогда единица будет прибавляться. Инъекция кода - это изменение кода игры, работающего с определёнными адресами памяти (жизней, здоровья, патронов, денег и так далее). Главная штука тут в том, что код всегда лежит в памяти по одним и тем же адресам, а трейнер и СЕ сам по себе могут с лёгкостью менять как данные, так и код, ибо в представлении компьютера и то и другое является просто цифрами. PS: У меня в подписи видеоблог, представляющий собой мои попытки научить взлому игр с нуля. Инъекция кода в это тоже входит, так что посмотри где-то первые пять уроков - там всё довольно-таки понятно (как мне кажется) и на примерах.
-
Привет! Предлагаю ознакомиться с отладчиком [OllyDbg] и встроенным отладчиком в дизассемблер IDA фирмы Hex-Rays. В первом возможности в принципе пошире, чем в СЕ, плюс можно писать плагины, во втором есть встроенная поддержка языка Python, так что тоже можно реализовать твою задумку. Думаю, что можно и на СЕ, т.к. там есть поддержка Lua, но есть шанс что в оле или иде такая функция будет доступна "из коробки".
-
Интересная тема, хотелось бы поковырять. Единственное - никогда не писал ничего серьёзное под *NIX-архитектуру - может кто посоветует, с чего начать? Касательно Андроида в частности - помню, что есть NDK, позволяющий писать софт на С.
-
№68, по поводу 2кб - он прав, ибо VirtualAlloc \ VirtualAllocEx резервирует память постранично, а у страницы памяти есть минимальный размер. Я при этом в любом случае люблю выделать память побайтно (но это во мне минимализм играет). А что до телепорта - алгоритм изначально не мой, но я к нему пришёл самостоятельно, плюс - он не идеальный, в плане кода его наверняка можно оптимизировать. Но штука универсальная, это да.
-
№8, dll - это по сути точно такой же exe, но с единственным крупным отличием - он не умеет запускаться самостоятельно. В адресном пространстве игры выделяется место под dll, туда копируется её код и затем создаётся новый поток, который и начинает выполнение dll. Плюсы здесь заключаются в том, что у dll и игры получается единое адресное пространство - так что не нужно ни хэндл игры искать, ни WriteProcessMemory - можно читать и писать байты напрямую.
-
Ну раз так - значит определённо стоит!
-
В чём лично для тебя недостатки\преимущества?
-
А в трейнми сказано, что патчить его нельзя, надо именно трейнер сделать (аля "get 999999 timmys"). Так или иначе, я никогда и ни в одной игре не встречал подобных выкрутасов, так что это скорее крякми, чем трейнми - больно уж уши в трубочку от такого сворачиваются.
-
По поводу чего именно? Если по поводу денег: 1. Видишь, что у тебя, к примеру, 160 золота. 2. Идёшь в СЕ и ищешь целое 4 байта, 1600 (160*10). 3. Тратишь что-нибудь, у тебя остаётся 75 золота. 4. Идёшь в СЕ и отсеиваешь целое 4 байта, 750 (75*10). 5. Повторяешь процедуру, пока не найдёшь несколько адресов, их уже и меняешь. Если по поводу умений, представь себе икноку с растением: ----- === === === ----- Полностью заряженная. Идёшь в СЕ и ищешь float, единицу. Начинаешь что-то строить, иконка обнуляется: ----- ----- Тут же ставишь игру на паузу, идёшь в СЕ и отсеиваешь "Уменьшилось". Так как пока ты ставил игру на паузу, то на какое-то маленькое значение иконка восполниться уже успела (не чисто было 1 - стало 0, а успело стать 0.05, к примеру). Снимаешь игру с паузы, ждёшь какое-то время: ----- === ----- Иконка чуток заполнилась, ставишь игру на паузу, идёшь в СЕ и опять отсеиваешь увеличилось. Потом идёшь в игру и ждёшь, допустим, пока иконка полностью не заполнится: ----- === === === ----- Идёшь в СЕ и отсеиваешь точное значение, float, 1. Снова строишь что-то, ищёшь уменьшилось, и так далее.
-
Так держать! Если в скобках нет цифр, то смещение можно смело считать нулём.
-
У меня находит как целое 4 байта, но на всякий случай попробуй снять в главном окне СЕ галочку "Fast Scan" ("Быстрое сканирование") и попробуй найти адрес ещё раз.
-
А что конкретно не понимаешь? Принцип - "инъекция кода", или ассемблерные команды?
-
Горячо рекомендую пройти туториал СЕ, ну и может пару видеоуроков посмотреть (например, моих). =) Основы в туториале отлично объясняются, я думаю.
-
Если ты хочешь это вручную сделать, то поищи на сайте в разделе статей статью MasterGH о flyhack'е. Если же программно, то утилит полно - d3d windower, 3d analyzer и так далее.
-
Так смотри, там достаточно простой алгоритм поиска. Допустим, вот твоя полоска на экране, полностью заполненная: [==========] Идёшь в СЕ, начинаешь новый поиск неизвестного значения. Тип, для начала - float. Нажимаешь First Scan. Идёшь в игру, заставляешь значение полоски измениться. Было: [==========] Стало [======= ] Возвращаешься в СЕ, говоришь "Уменьшилось", отсеиваешь. Возвращаешься в игру и, к примеру, кушаешь аптечку: Было: [======= ] Стало: [======== ] Опять в СЕ - "Увеличилось". Отсеиваешь. Т.е. отсеивание неизвестного числа (увеличилось или уменьшилось) нужно делать относительно последнего сканирования. Идёшь в игру, ранишь себя опять: Было: [======== ] Стало: [====== ] Опять "Уменьшилось". Ещё ранишь: Было: [====== ] Стало: [==== ] И так далее, пока не найдётся нужный адрес. При поиске неизвестного значения адресов часто находится много и в конце они не отсеиваются - их остаётся штук 10-20 и всё. В этом случае надо их все добавить в таблицу и по очереди замораживать, проверяя в игре - заморозилось ли на самом деле. Если же не получается найти - пробуешь другие типы данных, можно и сразу All (все) типы искать, но это займёт больше времени. PS: Блин, глупый парсер все проблемы сожрал - надеюсь, что понятно состояние полосок.