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

Лидеры

  1. keng

    keng

    Ветераны


    • Баллы

      4

    • Постов

      1 635


  2. Akama

    Akama

    Пользователи+


    • Баллы

      1

    • Постов

      176


  3. krocki

    krocki

    Разработчики


    • Баллы

      1

    • Постов

      743


  4. Vlad2

    Vlad2

    Ветераны


    • Баллы

      61

    • Постов

      279


Популярный контент

Показан контент с высокой репутацией 11.01.2015 во всех областях

  1. Когда у меня остается несколько сотен значений и дальше они не отсеиваются, я сначала прикидываю на глазок нужное мне значение (скажем, если ищем экранное разрешение, то оно больше нуля и меньше того, что на мониторе выставлено), а потом рискую - начинаю замораживать адреса пачками по 10 штук, скрестив пальцы и молясь, чтобы игра не вылетела.
    2 балла
  2. Решил написать статью о том, как правильно скрипты писать. Она не призвана научить вас писать скрипты с нуля "шоб работало". Пишу лишь для того, чтоб народ понял как грамотно делать ту или иную функцию, и выглядело это красиво. И так - по порядку: 1. Бессмертие. В большенстве случаев, когда люди пишут скрипты на бессмертие, они отлавливают функцию, которая работает с адресом здоровья (не важно какого она типа), и присваивают значению здоровья какое-то астрономическое число, мотивируя это тем, что "наверняка, чтоб точно не убило", или просто ленятся подумать. Очень любит подобными вещами заниматься Grom-Skynet, из-за чего его функции выглядят слегка "колхозно". mov [eax+смещение]#999999 //а то и больше девяток, сколько смелость позволит ))) Так делать не правильно, т.к. в большенстве случаев из-за таких вот "здоровий" игра по-просту вылетает, игра не может такие цифры воспринять (и это ясно, таким здоровье быть и не может) Грамотнее всего в данном случае либо найти максимум здоровья и присвоить его текущему здоровью (не полиниться и найти есть ли такой), или просто занопить. Поверьте, визуально это будет выглядеть более эстетично. Если есть максимум здоровья, то сделать чит с его помощью проще простого. Предположим, что текущее значение здоровья это еах+04, а максимальное значение еах+08, тогда: push [eax+08] //запоминаем значение максимума pop [eax+04] //восстанавливаем его в текущее здоровье Бывают случаи, когда здоровье типа float. Тогда подгрузить максимум здоровья можно лишь одной опирацией. fst [eax+08] если значения максимума нет, то нопить функции можно таким способом [enable] db 90,90,90,90 //в зависимости от того, сколько байт занимает исходная инструкция [disable] db 45,FA,25,65 // просто оригинальные байты 2. Стрельба без перезарядки В данной ситуации ищется кол-во патронов в обоиме и изменяется, но опять таки не на 999 (и снова Grom-Skynet здесь мастак это делать). От такого кол-ва патронов игра так же начнёт тупить и думать, а можно ли перезарядку делать или нет (обоимы то разные). Такая функция делается следующим образом, предположим, что кол-во патронов это еах+10. Вот так делать НЕ ПРАВИЛЬНО: mov esi,#999 mov [eax+10],esi //родной кусок кода А вот так ПРАВИЛЬНО: inc esi //увеличивает значение esi на 1 mov [eax+10],esi //родной кусок кода ИЛИ add esi,1 //в данном случае нужно указывать на сколько увеличить esi mov [eax+10],esi //родной кусок кода Значение патронов в обоиме будет всегда максимально и гемора будет меньше в будущем. 3. Деньги (или ещё какой-нить шмот) И опять сами-знаете-кто любит присвоить деньгам значение 9999999 (денег же много не бывает). В принципе можно и так делать, но впечатление складыватся, что без "читов" тут дело не обошлось. Если глаз не мозолит, то ничего страшного, пусть будет 999999 денег. Я предпочитаю в данном случае либо морозить значение денег на определённой отметке, чтоб ниже его не опускалось (например денег может быть и 51862, и 56923, но ниже 50000 не опустится), либо просто функцию добавления денег (+1000 золотый например). Если хотите, чтоб значение не опускалось ниже 50000, то нужно отлавливать функцию, которая записывает новое значение в адрес денег. Пусть еах+65 это деньги. mov [eax+65],ebx //именно так эти функции выглядят. то скрипт в данном случае будет выглядеть так: cmp ebx,#50000 jge originalcode mov ebx,#50000 originalcode: mov [eax+65],ebx Т.о. меньше, чем 50000 денег не станет как ни старайтесь... Если хотите добавлять 1000 денег, то нужно отлавливать функцию, которая чаще всех будет получать доступ к деньгам. mov ebx,[eax+65] //функция доступа выглядит примерно так... Далее нужно ввести некую переменную (пусть будет _money), и навесить на неё хоткей чтоб тот присваивал переменной значение 1. Скрипт будет выглядеть так. cmp dword ptr [_money],1 jne originalcode add [eax+65],#1000 mov [_money],0 //чтоб бесконечного цикла не получилось... originalcode: mov ebx,[eax+65] на нажатию хоткея добавится 1000 денег (как резко зависит от того, как часто инструкция получает доступ к деньгам) 4. Прыжки Чем меньше флагов в скрипте - тем лучше, но полностью от них отказаться не возможно. По-этому свидём использование их к минимуму. Тут уже сам Dark Byte зачем-то в стандартном шаблоне навтыкал ненужные флаги - а именно exit и originalcode. Покажу вам наглядно как обойтись без них. Подопытным кроликом я использовал игру The Elder Scrolls 3: Morrowind (не кидайтесь плз фикалиями, знаю что старьё). По-мимо прыжков на флаги можно использовать прыжки через байты. jmp +3 je +3 jne +3 Как видите синтаксис тот же, но изменилось то, что прыгаем через некое колличество байт (указывается в шестнадцатиричной системе счисления) И так, я написал скрипт, который сделает здоровье, ману и выносливость бесконечными. [ENABLE] alloc(newmem,2048) label(returnhere) newmem: fstp dword ptr [ecx+08] push [ecx+04] pop [ecx+08] ret 0010 jmp returnhere "Morrowind.exe"+122F: jmp newmem nop returnhere: [DISABLE] dealloc(newmem) "Morrowind.exe"+122F: fstp dword ptr [ecx+08] ret 0010 //Alt: db D9 59 08 C2 10 00 и знаю, что в ecx+0c хранится идентификатор героя 746464. Но не знаю через сколько байт нужно прыгнуть, чтобы вразу не приписывалось здоровье и тд. Вычисляется кол-во байт следующим образом. в данном случае мне нужно перепрыгнуть push [ecx+04] и pop [ecx+08]. 1. Активируем скрипт каков он есть. 2. смотрим в отладчике что скрипт делает теперь и замечаем байты нужных нам строк. Я обвёл красным те байты, которые мне нужно перепрыгнуть. Судя по картинке их 6 (шесть круглешков) Следовательно мне нужно перептыгнуть 6 байт, и мой скрипт будет выглядеть теперь вот так. [ENABLE] alloc(newmem,2048) label(returnhere) newmem: fstp dword ptr [ecx+08] cmp [ecx+0C],746464 jne +6 // если не равно перепрыгнуть через 6 байт. push [ecx+04] pop [ecx+08] ret 0010 jmp returnhere "Morrowind.exe"+122F: jmp newmem nop returnhere: [DISABLE] dealloc(newmem) "Morrowind.exe"+122F: fstp dword ptr [ecx+08] ret 0010 //Alt: db D9 59 08 C2 10 00 как видите обошёлся двумя флагами (один из которых и флаг и выделение памяти под скрипт).
    1 балл
  3. Всё просто...используй поиск неизвестного значения на предмет "Уменьшилось\Увеличилось.
    1 балл
  4. NullAlex, оно не будет через ReadProcessMemory читать сразу Double, оно будет читать байты. Байты нужно преобразовать в Double после прочтения, а уже Double - в текстовую строку. Автор, что тебе не понятно из комментариев в моем предыдущем посте? Вроде бы понятно написано.
    1 балл
  5. Вот на твоем скриншоте "05:56", то есть 5 часов и 56 минут. Кружочек внизу - скорее всего, секунды. 5:56 утра, а тикать таймер будет до 8:00 утра. Отнимаешь, получаешь 124 минуты, или 7440 секунд (без учета тех, что на скриншоте). Эту цифру и ищешь. PS: Если не получится, то ищи все-таки через неизвестное значение - это долгий, но надежный способ.
    1 балл
  6. Отладчик -> Инструменты -> Автоассемблер. Туда вставляешь это: [ENABLE]{$LUA}writeInteger('[08B60780]+4', 1)[DISABLE]{$LUA}writeInteger('[08B60780]+4', 257)[08B60780]+4 - это указатель. Вместо его вставь свой адрес. Далее, Файл -> Добавить скрипт в таблицу. Потом просто делаешь HotKey на переключения скрипта нужной кнопкой.
    1 балл
  7. Проблема актуальна
    -1 балл
×
×
  • Создать...

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

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