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

keng

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

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

  • Посещение

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

    55

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

  1. №5, предположу, что скрипту, который управляет маршерованием солдатиков по карте согласно сценарию миссии, не нравятся запредельные цифры в координатах - может, сравнивает с чем-нибудь, чтобы изменить маршрут и выплёвывает исключение.
  2. Скорее всего, за это просто отвечает отдельная инструкция. Отладчик в руки - и вперёд!
  3. Хз, не хочешь отлаживать - веди логи. Или отлаживать, или ещё как-то, или приводи полностью код всех процедур.
  4. Привет! Если очень в кратце, то и код и данные игры (адреса значений, которые ты находишь в СЕ) хранятся в оперативной памяти. Разница тут в том, что код каждый запуск игры своего местоположения не меняет, т.е. находится всегда по одним и тем же адресам, в отличие от данных, которые могут появляться в разных её участках. Такое поведение вызвано технологией 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: У меня в подписи видеоблог, представляющий собой мои попытки научить взлому игр с нуля. Инъекция кода в это тоже входит, так что посмотри где-то первые пять уроков - там всё довольно-таки понятно (как мне кажется) и на примерах.
  5. Привет! Предлагаю ознакомиться с отладчиком [OllyDbg] и встроенным отладчиком в дизассемблер IDA фирмы Hex-Rays. В первом возможности в принципе пошире, чем в СЕ, плюс можно писать плагины, во втором есть встроенная поддержка языка Python, так что тоже можно реализовать твою задумку. Думаю, что можно и на СЕ, т.к. там есть поддержка Lua, но есть шанс что в оле или иде такая функция будет доступна "из коробки".
  6. Интересная тема, хотелось бы поковырять. Единственное - никогда не писал ничего серьёзное под *NIX-архитектуру - может кто посоветует, с чего начать? Касательно Андроида в частности - помню, что есть NDK, позволяющий писать софт на С.
  7. №68, по поводу 2кб - он прав, ибо VirtualAlloc \ VirtualAllocEx резервирует память постранично, а у страницы памяти есть минимальный размер. Я при этом в любом случае люблю выделать память побайтно (но это во мне минимализм играет). А что до телепорта - алгоритм изначально не мой, но я к нему пришёл самостоятельно, плюс - он не идеальный, в плане кода его наверняка можно оптимизировать. Но штука универсальная, это да.
  8. №8, dll - это по сути точно такой же exe, но с единственным крупным отличием - он не умеет запускаться самостоятельно. В адресном пространстве игры выделяется место под dll, туда копируется её код и затем создаётся новый поток, который и начинает выполнение dll. Плюсы здесь заключаются в том, что у dll и игры получается единое адресное пространство - так что не нужно ни хэндл игры искать, ни WriteProcessMemory - можно читать и писать байты напрямую.
  9. Вообще, GetModuleHandle("kernel32.dll"), затем GetProcAddresss("FindWindowA"), а затем просто: push offset "Lalala" push 0 call eax Я где-то на форуме оставлял статью на тему вызова WinAPI из AA-скриптов - поищи.
  10. Ну раз так - значит определённо стоит!
  11. В чём лично для тебя недостатки\преимущества?
  12. Так я во втором посте написал. После выполнения функции в переменной hwnd будет содержаться хэндл окна, если оно будет найдено.
  13. Привет! Судя по гуглу: hwnd = FindWindow("lalala") Где "lalala" - заголовок окна. Сразу предупрежу, что и заголовок и имя процесса могут меняться, так что это не самый надёжный вариант.
  14. keng

    Timmy Trainme

    А в трейнми сказано, что патчить его нельзя, надо именно трейнер сделать (аля "get 999999 timmys"). Так или иначе, я никогда и ни в одной игре не встречал подобных выкрутасов, так что это скорее крякми, чем трейнми - больно уж уши в трубочку от такого сворачиваются.
  15. По поводу чего именно? Если по поводу денег: 1. Видишь, что у тебя, к примеру, 160 золота. 2. Идёшь в СЕ и ищешь целое 4 байта, 1600 (160*10). 3. Тратишь что-нибудь, у тебя остаётся 75 золота. 4. Идёшь в СЕ и отсеиваешь целое 4 байта, 750 (75*10). 5. Повторяешь процедуру, пока не найдёшь несколько адресов, их уже и меняешь. Если по поводу умений, представь себе икноку с растением: ----- === === === ----- Полностью заряженная. Идёшь в СЕ и ищешь float, единицу. Начинаешь что-то строить, иконка обнуляется: ----- ----- Тут же ставишь игру на паузу, идёшь в СЕ и отсеиваешь "Уменьшилось". Так как пока ты ставил игру на паузу, то на какое-то маленькое значение иконка восполниться уже успела (не чисто было 1 - стало 0, а успело стать 0.05, к примеру). Снимаешь игру с паузы, ждёшь какое-то время: ----- === ----- Иконка чуток заполнилась, ставишь игру на паузу, идёшь в СЕ и опять отсеиваешь увеличилось. Потом идёшь в игру и ждёшь, допустим, пока иконка полностью не заполнится: ----- === === === ----- Идёшь в СЕ и отсеиваешь точное значение, float, 1. Снова строишь что-то, ищёшь уменьшилось, и так далее.
  16. Деньги там хранятся что-то вроде на экране 100 золота, а в памяти 1000. Т.е. домножай на 10 и только это число ищи. По поводу перезарядки - насколько я помню, это float от 0 до 1. Построил - стало 0 и начало увеличиваться. Стало 1 - можно строить опять.
  17. Так держать! Если в скобках нет цифр, то смещение можно смело считать нулём.
  18. У меня находит как целое 4 байта, но на всякий случай попробуй снять в главном окне СЕ галочку "Fast Scan" ("Быстрое сканирование") и попробуй найти адрес ещё раз.
  19. А что конкретно не понимаешь? Принцип - "инъекция кода", или ассемблерные команды?
  20. Горячо рекомендую пройти туториал СЕ, ну и может пару видеоуроков посмотреть (например, моих). =) Основы в туториале отлично объясняются, я думаю.
  21. Если ты хочешь это вручную сделать, то поищи на сайте в разделе статей статью MasterGH о flyhack'е. Если же программно, то утилит полно - d3d windower, 3d analyzer и так далее.
  22. Экспериментально. Можно на глазок прикинуть и попробовать поискать, но чаще всего - так, как я описал.
  23. Так смотри, там достаточно простой алгоритм поиска. Допустим, вот твоя полоска на экране, полностью заполненная: [==========] Идёшь в СЕ, начинаешь новый поиск неизвестного значения. Тип, для начала - float. Нажимаешь First Scan. Идёшь в игру, заставляешь значение полоски измениться. Было: [==========] Стало [======= ] Возвращаешься в СЕ, говоришь "Уменьшилось", отсеиваешь. Возвращаешься в игру и, к примеру, кушаешь аптечку: Было: [======= ] Стало: [======== ] Опять в СЕ - "Увеличилось". Отсеиваешь. Т.е. отсеивание неизвестного числа (увеличилось или уменьшилось) нужно делать относительно последнего сканирования. Идёшь в игру, ранишь себя опять: Было: [======== ] Стало: [====== ] Опять "Уменьшилось". Ещё ранишь: Было: [====== ] Стало: [==== ] И так далее, пока не найдётся нужный адрес. При поиске неизвестного значения адресов часто находится много и в конце они не отсеиваются - их остаётся штук 10-20 и всё. В этом случае надо их все добавить в таблицу и по очереди замораживать, проверяя в игре - заморозилось ли на самом деле. Если же не получается найти - пробуешь другие типы данных, можно и сразу All (все) типы искать, но это займёт больше времени. PS: Блин, глупый парсер все проблемы сожрал - надеюсь, что понятно состояние полосок.
  24. LogDog, а что конкретно у тебя не получается? Адрес нужный найти или скрипт написать?
×
×
  • Создать...

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

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