Razi Опубликовано 3 февраля, 2016 Автор Поделиться Опубликовано 3 февраля, 2016 (изменено) AntonVitalievich, Под спойлером в сообщении номер 34 этой темы, готовый скрипт со всеми четырьмя цифрами 72, 8, 104 и 40. Изменено 3 февраля, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 3 февраля, 2016 Поделиться Опубликовано 3 февраля, 2016 (изменено) А что такое @@: в скрипте?Это безымянная метка, на которую делаем прыжок (@f - ввперёд на первую ближайшую метку. @b - назад), можно объявлять без объявления (типа label(flag)), делает только короткий прыжок (переход). Ещё один плюс таких меток - их может быть сколько угодно. ebx - это что ли и есть онидаа [eax+ecx], - это что, адрес 00A444E8? Игры у меня нет поэтому точно ответить не могу, там может быть что угодно, но там обязательно проскакивает адрес 00A444E8.За проверку, там ли этот адрес, у меня в скрипте отвечает вот этот участок: push edx lea edx,[eax+ecx] cmp edx,00A444E8 pop edx jne code Изменено 3 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 4 февраля, 2016 Поделиться Опубликовано 4 февраля, 2016 (изменено) Razi В свете обсуждения этого моего сообщения решил всё-таки снять видео, чтобы показать ограничение наших скриптов. Изменено 4 февраля, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 4 февраля, 2016 Поделиться Опубликовано 4 февраля, 2016 (изменено) При написании видео, сделал более компактную и удобную запись того скрипта: Скрытый текст { Game : ePSXe ENG.exe Version: Date : 2016-02-02 Author : User This script does blah blah blah } [ENABLE] aobscan(INJECT,88 1C 08 81 E2 FC FF 1F 00) // should be unique alloc(newmem,$1000) label(code) label(code1) label(key) label(key1) label(key2) label(Keystroke) label(return) label(flagUp) registersymbol(INJECT) newmem: cmp [00A47010],1 jne code1 cmp [flagUp],0 jne code1 push [key1] pop [key] call Keystroke mov [flagUp],1 jmp code code1: cmp [00A47010],0 jne code cmp [flagUp],1 jne code push [key2] pop [key] call Keystroke mov [flagUp],0 code: mov [eax+ecx],bl and edx,001FFFFC jmp return Keystroke: // Эмуляция нажатия клавиши pushad push 0 push 0 push 0 push [key] call keybd_event push 0 push 2 push 0 push [key] call keybd_event popad ret flagUp: dd 0 key: // Переключатель клавиш dd 0 key1: // ID клавиши Home dd #36 key2: // ID клавиши End dd #35 INJECT: jmp newmem nop nop nop nop return: [DISABLE] INJECT: db 88 1C 08 81 E2 FC FF 1F 00 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: 02C802B4 02C8028B: 81 FA 00 00 80 1F - cmp edx,1F800000 02C80291: 74 62 - je 02C802F5 02C80293: 8B 0D 84 0A 51 00 - mov ecx,["ePSXe ENG.exe"+110A84] 02C80299: F7 C1 00 00 01 00 - test ecx,10000 02C8029F: 75 53 - jne 02C802F4 02C802A1: 8B C8 - mov ecx,eax 02C802A3: 89 C2 - mov edx,eax 02C802A5: C1 E9 10 - shr ecx,10 02C802A8: 25 FF FF 00 00 - and eax,0000FFFF 02C802AD: 8B 0C 8D 40 AF 82 00 - mov ecx,[ecx*4+"ePSXe ENG.exe"+42AF40] // ---------- INJECTING HERE ---------- 02C802B4: 88 1C 08 - mov [eax+ecx],bl 02C802B7: 81 E2 FC FF 1F 00 - and edx,001FFFFC // ---------- DONE INJECTING ---------- 02C802BD: BB 20 00 E9 02 - mov ebx,02E90020 02C802C2: 03 DA - add ebx,edx 02C802C4: 8B 03 - mov eax,[ebx] 02C802C6: 3D 40 00 C8 02 - cmp eax,02C80040 02C802CB: 75 01 - jne 02C802CE 02C802CD: C3 - ret 02C802CE: B8 40 00 C8 02 - mov eax,02C80040 02C802D3: 8B 0C 10 - mov ecx,[eax+edx] 02C802D6: B8 20 00 12 03 - mov eax,03120020 02C802DB: 8B 04 10 - mov eax,[eax+edx] } Как вставить этот скрипт в нужную тебе табличку, писал выше, но повторюсь: 1. СЕ 2. Нужная табличка 3. Запускаем обучение (Туториал) 4. Подключаемся к процессу Туториала. 5. А дальше всё как обычно. Попробуй этот скрипт, он более компактен и в нём тоже удобно переназначать Клавиши и вставлять сколько угодно количество автонажатий. Ниже выложил табличку с двумя скриптами. Изменено 5 февраля, 2016 пользователем Garik66 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 4 февраля, 2016 Автор Поделиться Опубликовано 4 февраля, 2016 То есть, при флаг = 1 разрешено первое событие, а второе запрещено. А при флаг = 0 разрешено второе событие, а первое запрещено. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 4 февраля, 2016 Поделиться Опубликовано 4 февраля, 2016 (изменено) 49 минуты назад, Razi сказал: То есть, при флаг = 1 разрешено первое событие, а второе запрещено. А при флаг = 0 разрешено второе событие, а первое запрещено. На видео несколько флагов и несколько событий (нужно точнее говорить). Если же ты имеешь ввиду под флаг - flagUp, а под событием - авто-нажатие кнопок, то ДА. не понял поэтому выложу записи из блокнота: Скрытый текст Razi, всё-таки решил для тебя снять видео для наглядности. Видео "Ограничение скриптов AntonVitalievich и моего по автонажатию клавиш Home и End" Снимать буду на Tutorial CE, потому что на нём проще всего было сэмулировать условия в твоей игре. Скрипты мой и AntonVitalievich абсолютно идентичны, только написаны на разных ЯП. Поэтому я покажу работу только на примере своего скрипта. И так начнём: Твоя игра - здесь это Tutorial CE. Событие в игре - это "Удар". Урон наносится разный, сразным интервалом времени, производим его вручную нажимая кнопку "Удар". "НР героя" - это собственно НР героя (адрес с указателем). На этот адрес назначены горячие клавиши HOME и END. HOME + 10НР - герой выпивает таблетку END +100НР - герой выпивает супертаблетку "Скрип HOME/END" -это скрипт, в котором написаны и объединены два варианта скриптов, один - тот что у тебя, второй - универсальный, т.е. реагирующий на событие в игре. "версия скрипта" - 1 - что у тебя и 2 - универсальный скрипт. Назначать версию будем вручную в таблице. "00A47010" - это твой адрес (тоже кстати флаг, который указывает, какая из клавиш должна автонажаться: при 1 Home, при 0 End). На него назначены горячие клавиши 1 и 2, с помощью которых буду иметировать, изменение твоего адреса. 1 - значение в адресе 1 2 - значение в адресе 0 "flagUp" - это тот виртуальный (подчеркну неигровой флаг), что он делает я тебе уже описывал в теме, но повторю. При активации скрипта он равен нулю (что позволяет Авто-нажитие клавиши Home, но запрещает Авто-нажитие клавиши End). Когда срабатывает Авто-нажитие клавиши Home (или серии Авто-нажатий, как в твоём скрипте, который ты мне выкладывал в ЛС) flagUp принимает значение 1 (что запрещает Авто-нажитие клавиши Home, но позволяет Авто-нажитие клавиши End). Когда срабатывает Авто-нажитие клавиши End (или серии Авто-нажатий, как в твоём скрипте, который ты мне выкладывал в ЛС) flagUp возвращается в значение 0 (что позволяет Авто-нажитие клавиши Home, но запрещает Авто-нажитие клавиши End). "flagUp" можно было сюда не вытаскивать, вытащил для наглядности. "flagUp" в универсальном варианте скрипта не участвует, поэтому всегда будет равен 0. Теперь условия игры: 1.[00A47010] при 1 сигнализирует нам, что ударяет только один враг и нужно принять одну таблетку нажав Home, при 0 сигнализирует нам, что бьёт Бос и нужно принять супер-таблетку. Задача игры нужно выжить - НР не должно опутститься ниже 10 % от базового. Базовое здоровье 100 НР. Сперва смотрим как работает скрипт "Скрип HOME/END" версия скрипта 1. Как происходит у тебя в игре, у тебя поочерёдно бьёт, то враг, то Бос. Т.е. всё работает, всё тебя устраивает. А теперь рассмотрим вариант, что Бос устал и лёг спать например :). Смотрим как работает скрипт "Скрип HOME/END" версия скрипта 2. Условия теже самые. А теперь враг устал и бьёт только Бос. УРРРРРРРЯЯЯЯЯ!!!!! МЫ ПОБЕДИЛИ!!!!! Изменено 4 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 4 февраля, 2016 Автор Поделиться Опубликовано 4 февраля, 2016 (изменено) 1 час назад, Garik66 сказал: Если же ты имеешь ввиду под флаг - flagUp, а под событием - авто-нажатие кнопок, то ДА. Я просто просмотрев видео сказал по памяти. То есть, при флаг = 0 разрешено первое событие, а второе запрещено. А при флаг = 1 разрешено второе событие, а первое запрещено. А имел ввиду вот это: Точнее, при флаг(flagUp) = 0 разрешено первое событие (т.е.кнопка Home), а второе запрещено (т.е.кнопка End). А при флаг = 1 разрешено второе событие (т.е. кнопка End), а первое запрещено (т.е. кнопка Home). В данном случае, кнопки прикручены, каждая к своему определенному флагу. Дополнение: Скрипт проверил, уже работает нормально. Изменено 4 февраля, 2016 пользователем Razi 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 9 часов назад, Razi сказал: В данном случае, кнопки прикручены, каждая к своему определенному флагу. Не верно. Флаг (переключатель) один и тот же - flagUp. Меняется только значение flagUp и соответственно меняется клавиша, которая авто-нажмётся. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 (изменено) Не много про флаги, для лучшего понимания: Читая топики, статьи на форуме ты будешь часто встречать - флаг, ID, переключатель и чаще всего фильтр. Всё это одно и тоже - это адреса памяти. Т.е. это какие-то значения по этим адресам, которое имеет два свойства (уникальность для твоего события и повторяемость, т.е. после перезагрузок игры (любой программы) значения будут такими-же). Благодаря операндам CMP/JMP(JE, JNE и т.д.) или на других ЯП, например LUA операндам IF/THEN мы с помощью этих флагов (фильтров, переключателей и т.д.) блокируем или разрешаем доступ к определённым участкам в коде игры (программы), тем самым управляем выполнением этой программы по нашему сценарию. (Скрипт - сценарий кстати). Изменено 5 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 И ещё проще по теме флагов. Возьми свой выключатель света. Так вот сам выключатель - это и есть флаг (адрес), в котором есть положения (значения), вкл (1) и выкл (0) -> в результате получаем событие - либо включили свет, либо выключили. Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 5 февраля, 2016 Автор Поделиться Опубликовано 5 февраля, 2016 (изменено) 2 часа назад, Garik66 сказал: Меняется только значение flagUp и соответственно меняется клавиша, которая авто-нажмётся. Это и имел ввиду, просто сказал флаги во множественном числе. А имел ввиду значения 0 и 1. Кнопки прикручены, каждая к своему определенному значению в флаге. А раньше говорил событие, потому что, это может быть не однократное нажатие кнопки home, а двукратное или трехкратное нажатие кнопки home прикручено к одному значению в флаге. Изменено 5 февраля, 2016 пользователем Razi 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 Только что, Razi сказал: Кнопки прикручены, каждая к своему определенному значению в флаге. Теперь всё точно и правильно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 Razi, 1. по добавлению авто-нажатий в скрипт: просто добавь строчку call Keystroke столько, сколько нужно нажатий сделать. 2. по изменению клавиши: меняем ID клавиши здесь: key1: // ID клавиши Home dd #36 key2: // ID клавиши End dd #35 Где посмотреть ID, погугли или например они есть в этом сообщении, только нужно открыть все спойлеры (из-за нового движка): Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 PS: Забыл тебе дописать 3. по добавлению клавиши (ну как у тебя было по-моему DEL) в скрипт: 3.1. Добавить метку label(key3) 3.2. Добавить сам вызов этой клавиши в нужные тебе места: push [key3] pop [key] call Keystroke 3.3. Прописать ID нужной тебе клавиши: key3: // ID клавиши dd Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 Написал тебе скрипт (сразу оптимизированный) на авто-нажатие комбинаций клавиш, но нигде не тестировал, писал на коленке. Проверь и отпишись. Хорошо? Мне самому интересно - как сработает. Комбинации клавиш взял, как у AntonVitalievich в его скрипте - LCtrl+I и LCtrl+U. Сам скрипт: Скрытый текст { Game : ePSXe ENG.exe Version: Date : 2016-02-02 Author : User This script does blah blah blah } [ENABLE] aobscan(INJECT,88 1C 08 81 E2 FC FF 1F 00) // should be unique alloc(newmem,$1000) label(code) label(code1) label(key) label(key1) label(key2) label(key3) label(keydown) label(keyup) label(return) label(flagUp) registersymbol(INJECT) newmem: cmp [00A47010],1 jne code1 cmp [flagUp],0 jne code1 push [key1] pop [key] call keydown push [key2] pop [key] call keydown push [key2] pop [key] call keyup push [key1] pop [key] call keyup mov [flagUp],1 jmp code code1: cmp [00A47010],0 jne code cmp [flagUp],1 jne code push [key1] pop [key] call keydown push [key3] pop [key] call keydown push [key3] pop [key] call keyup push [key1] pop [key] call keyup mov [flagUp],0 code: mov [eax+ecx],bl and edx,001FFFFC jmp return keydown: // Нажать клавишу pushad push 0 push 0 push 0 push [key] call keybd_event popad ret keyup: // Отпустить клавишу pushad push 0 push 2 push 0 push [key] call keybd_event popad ret flagUp: dd 0 key: // Переключатель клавиш dd 0 key1: // ID клавиши LCtrl dd #162 key2: // ID клавиши I dd #73 key3: // ID клавиши U dd #85 INJECT: jmp newmem nop nop nop nop return: [DISABLE] INJECT: db 88 1C 08 81 E2 FC FF 1F 00 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: 02C802B4 02C8028B: 81 FA 00 00 80 1F - cmp edx,1F800000 02C80291: 74 62 - je 02C802F5 02C80293: 8B 0D 84 0A 51 00 - mov ecx,["ePSXe ENG.exe"+110A84] 02C80299: F7 C1 00 00 01 00 - test ecx,10000 02C8029F: 75 53 - jne 02C802F4 02C802A1: 8B C8 - mov ecx,eax 02C802A3: 89 C2 - mov edx,eax 02C802A5: C1 E9 10 - shr ecx,10 02C802A8: 25 FF FF 00 00 - and eax,0000FFFF 02C802AD: 8B 0C 8D 40 AF 82 00 - mov ecx,[ecx*4+"ePSXe ENG.exe"+42AF40] // ---------- INJECTING HERE ---------- 02C802B4: 88 1C 08 - mov [eax+ecx],bl 02C802B7: 81 E2 FC FF 1F 00 - and edx,001FFFFC // ---------- DONE INJECTING ---------- 02C802BD: BB 20 00 E9 02 - mov ebx,02E90020 02C802C2: 03 DA - add ebx,edx 02C802C4: 8B 03 - mov eax,[ebx] 02C802C6: 3D 40 00 C8 02 - cmp eax,02C80040 02C802CB: 75 01 - jne 02C802CE 02C802CD: C3 - ret 02C802CE: B8 40 00 C8 02 - mov eax,02C80040 02C802D3: 8B 0C 10 - mov ecx,[eax+edx] 02C802D6: B8 20 00 12 03 - mov eax,03120020 02C802DB: 8B 04 10 - mov eax,[eax+edx] } Табличку закачаю номер таблички тот же, так что верхнюю удалю. ForRazi4.CT 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 5 февраля, 2016 Автор Поделиться Опубликовано 5 февраля, 2016 Проверил табличку. Работает нормально. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 февраля, 2016 Поделиться Опубликовано 5 февраля, 2016 Отлично!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 6 февраля, 2016 Поделиться Опубликовано 6 февраля, 2016 12 часа назад, Garik66 сказал: Написал тебе скрипт (сразу оптимизированный) на авто-нажатие комбинаций клавиш, но нигде не тестировал, писал на коленке. Писать в АА скрипте чем хорошо, что не нужно создавать таймеры, а значит не будет лишний раз нагружаться компьютер. Вот скрипт для 4-х значений, можнт быть будет работать. Скрытый текст [ENABLE] globalalloc(savevalues, 4) alloc(placeforfreezer,$1000) aobscan(scanforfreezer,89 1C 08 81 E2 FC FF 1F 00) registersymbol(scanforfreezer) label(original) label(exitfromfreezer) label(firststep) label(firstjump) label(secondstep) label(secondjump) label(thirdstep) label(thirdjump) label(fourstep) label(fourjump) label(nowfreeze) placeforfreezer: push edx lea edx,[eax+ecx] cmp edx,00A444E8 pop edx jne original cmp byte ptr [00A3F3E5],2 jne original cmp ebx,72 je firststep jne firstjump firststep: mov [savevalues],72 jmp nowfreeze firstjump: cmp ebx,8 je secondstep jne secondjump secondstep: mov [savevalues],8 jmp nowfreeze secondjump: cmp ebx,104 je thirdstep jne thirdjump thirdstep: mov [savevalues],104 jmp nowfreeze thirdjump: cmp ebx,40 je fourstep jne fourjump fourstep: mov [savevalues],40 jmp nowfreeze fourjump: cmp [savevalues],0 jne nowfreeze mov [savevalues],72 jmp nowfreeze nowfreeze: mov ebx,[savevalues] mov [eax+ecx],ebx and edx,001FFFFC jmp exitfromfreezer original: mov [eax+ecx],ebx and edx,001FFFFC jmp exitfromfreezer scanforfreezer: jmp placeforfreezer nop nop nop nop exitfromfreezer: [DISABLE] scanforfreezer: db 89 1C 08 81 E2 FC FF 1F 00 unregistersymbol(scanforfreezer) dealloc(placeforfreezer) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 февраля, 2016 Поделиться Опубликовано 6 февраля, 2016 2 минуты назад, AntonVitalievich сказал: Вот скрипт для 4-х значений, можнт быть будет работать. Так такой скрипт на ассемблере СЕ я ему уже давал (рабочий, Вам же давали ссылку на него), он думал, что вы сделаете на LUA. Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 6 февраля, 2016 Автор Поделиться Опубликовано 6 февраля, 2016 (изменено) AntonVitalievich пояснил подробнее в личных сообщениях, если еще нужно какие детали узнать, то скажите если какие-то нюансы непонятны. Потому что, наши обьяснения немного разбросаны по теме. Цитата не будет лишний раз нагружаться компьютер А о каких нагрузках идет речь? То есть если таймеры есть на Lua, то нагрузка будет в килобайтах или мегабайтах? Изменено 6 февраля, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 6 февраля, 2016 Поделиться Опубликовано 6 февраля, 2016 Razi Я не знаю к сожалению как сделать на Lua. Нагрузка есть, но очень не значительная. Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 6 февраля, 2016 Автор Поделиться Опубликовано 6 февраля, 2016 (изменено) Но в любом случае вы и так сделали заморозку на Lua скриптах, просто нужно б было добавить в этот же скрипт, разрешение для изменения значения на четыре разных значения, может есть такая команда, а может и нет. У меня есть еще 2 маленьких вопроса. Первый вопрос незначительный. В вашем Lua скрипте HOME-END2 есть такой флаг как forkeys на 4 байта. Его нужно выставить на 1 байт? или это совсем ни на что не влияет? Второй вопрос: например есть адрес 00A9D874 и если значение в нем будет = 927C0 hex (или в десятичной системе 600000), то нужно изменить(но не заморозить) знчение в этом же адресе 00A9D874 на = 2710 hex (или в десятичной системе 10000). Вопрос в том как будет выглядеть такой скрипт в Lua? Мы как раз пытались в этой теме сделать перед этим нечто подобное на Lua, но не получилось. Изменено 6 февраля, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 февраля, 2016 Поделиться Опубликовано 6 февраля, 2016 (изменено) 1 час назад, Razi сказал: Мы как раз пытались в этой теме сделать перед этим нечто подобное на Lua, но не получилось. Чёй-то не помню, что мы такое решали. Это же просто и на LUA и на ассемблер. Или ты с кем-нибудь другим решал? Изменено 6 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 февраля, 2016 Поделиться Опубликовано 6 февраля, 2016 На ассемблер: cmp [00A9D874],#600000 jne code mov [00A9D874],#10000 code: Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 февраля, 2016 Поделиться Опубликовано 6 февраля, 2016 (изменено) Razi, попробуй скрипт: Скрытый текст [ENABLE] {$LUA} PlaySound(findTableFile([[Activate]])) timer = createTimer(true) timer:setInterval(5) timer.OnTimer = function() value = readInteger('00A9D874') if (value == 600000) then writeInteger('00A9D874',10000) end end {$ASM} [DISABLE] {$LUA} PlaySound(findTableFile([[Deactivate]])) timer:setEnabled(false) ForRazi5.CT Изменено 6 февраля, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения