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

Как в Cheat Engine произвести автоматическое нажатие клавиш?


Razi

Рекомендуемые сообщения

AntonVitalievich, Под спойлером в сообщении номер 34 этой темы, готовый скрипт со всеми четырьмя цифрами 72, 8, 104 и 40.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 109
  • Создана
  • Последний ответ

Топ авторов темы

А что такое @@: в скрипте?

Это безымянная метка, на которую делаем прыжок (@f - ввперёд на первую ближайшую метку. @b - назад), можно объявлять без объявления (типа label(flag)), делает только короткий прыжок (переход). Ещё один плюс таких меток - их может быть сколько угодно.

 

ebx - это что ли и есть они

да

а [eax+ecx], - это что, адрес 00A444E8?

 Игры у меня нет поэтому точно ответить не могу, там может быть что угодно, но там обязательно проскакивает адрес 00A444E8.

За проверку, там ли этот адрес, у меня в скрипте отвечает вот этот участок:

  push edx  lea edx,[eax+ecx]  cmp edx,00A444E8  pop edx  jne code 
Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

Razi

В свете обсуждения этого моего сообщения 

решил всё-таки снять видео, чтобы показать ограничение наших скриптов.

 

 

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

При написании видео, сделал более компактную и удобную запись того скрипта:

Скрытый текст

{ 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. А дальше всё как обычно.

Попробуй этот скрипт, он более компактен и в нём тоже удобно переназначать Клавиши и вставлять сколько угодно количество автонажатий.

Ниже выложил табличку с двумя скриптами.

Изменено пользователем Garik66
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

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.
Условия теже самые.
А теперь враг устал и бьёт только Бос.


                УРРРРРРРЯЯЯЯЯ!!!!!
               МЫ ПОБЕДИЛИ!!!!! :)     

 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Garik66 сказал:

Если же ты имеешь ввиду под флаг - flagUp, а под событием - авто-нажатие кнопок, то ДА.

Я просто просмотрев видео сказал по памяти. То есть, при флаг = 0 разрешено первое событие, а второе запрещено. А при флаг = 1 разрешено второе событие, а первое запрещено. А имел ввиду вот это:

Точнее, при флаг(flagUp) = 0 разрешено первое событие (т.е.кнопка Home), а второе запрещено (т.е.кнопка End). А при флаг = 1 разрешено второе событие (т.е. кнопка End), а первое запрещено (т.е. кнопка Home). В данном случае, кнопки прикручены, каждая к своему определенному флагу.

 

Дополнение: Скрипт проверил, уже работает нормально.

Изменено пользователем Razi
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, Razi сказал:

В данном случае, кнопки прикручены, каждая к своему определенному флагу.

Не верно.

Флаг (переключатель) один и тот же  - flagUp. Меняется только значение flagUp и соответственно меняется клавиша, которая авто-нажмётся. 

Ссылка на комментарий
Поделиться на другие сайты

Не много про флаги, для лучшего понимания:

Читая топики, статьи на форуме ты будешь часто встречать - флаг, ID, переключатель и чаще всего фильтр.

Всё это одно и тоже - это адреса памяти. Т.е. это какие-то значения по этим адресам, которое имеет два свойства (уникальность для твоего события и повторяемость, т.е. после перезагрузок игры (любой программы) значения будут такими-же).

Благодаря операндам CMP/JMP(JE, JNE и т.д.) или на других ЯП, например LUA операндам IF/THEN мы с помощью этих флагов (фильтров, переключателей и т.д.) блокируем или разрешаем доступ к определённым участкам в коде игры (программы), тем самым управляем выполнением этой программы по нашему сценарию. (Скрипт - сценарий кстати). 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

И ещё проще по теме флагов.

Возьми свой выключатель света.

Так вот сам выключатель - это и есть флаг (адрес), в котором есть положения (значения), вкл (1) и выкл (0) -> в результате получаем событие - либо включили свет, либо выключили.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Garik66 сказал:

Меняется только значение flagUp и соответственно меняется клавиша, которая авто-нажмётся.

Это и имел ввиду, просто сказал флаги во множественном числе. А имел ввиду значения 0 и 1. Кнопки прикручены, каждая к своему определенному значению в флаге.

А раньше говорил событие, потому что, это может быть не однократное нажатие кнопки home, а двукратное или трехкратное нажатие кнопки home прикручено к одному значению в флаге.

Изменено пользователем Razi
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Razi,

1. по добавлению авто-нажатий в скрипт:

просто добавь строчку

 call Keystroke

столько, сколько нужно нажатий сделать.

2. по изменению клавиши:

меняем ID клавиши здесь:

key1:      // ID клавиши Home
dd #36
key2:      // ID клавиши End
dd #35

Где посмотреть ID, погугли или например они есть в этом сообщении, только нужно открыть все спойлеры (из-за нового движка):

 

 

Ссылка на комментарий
Поделиться на другие сайты

PS: Забыл тебе дописать

3. по добавлению клавиши (ну как у тебя было по-моему DEL) в скрипт:

3.1. Добавить метку 

label(key3)

3.2. Добавить сам вызов этой клавиши в нужные тебе места:

  push [key3]
  pop [key]
  call Keystroke

3.3. Прописать ID нужной тебе клавиши:

key3:      // ID клавиши 
dd 

 

Ссылка на комментарий
Поделиться на другие сайты

Написал тебе скрипт (сразу оптимизированный) на авто-нажатие комбинаций клавиш, но нигде не тестировал, писал на коленке.

Проверь и отпишись. Хорошо? Мне самому интересно - как сработает.

Комбинации клавиш взял, как у 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
Ссылка на комментарий
Поделиться на другие сайты

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)

 

 

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, AntonVitalievich сказал:

Вот скрипт для 4-х значений, можнт быть будет работать.

Так такой скрипт на ассемблере СЕ я ему уже давал (рабочий, Вам же давали ссылку на него), он думал, что вы сделаете на LUA.

Ссылка на комментарий
Поделиться на другие сайты

AntonVitalievich пояснил подробнее в личных сообщениях, если еще нужно какие детали узнать, то скажите если какие-то нюансы непонятны. Потому что, наши обьяснения немного разбросаны по теме.

Цитата

не будет лишний раз нагружаться компьютер

А о каких нагрузках идет речь? То есть если таймеры есть на Lua, то нагрузка будет в килобайтах или мегабайтах?

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

Но в любом случае вы и так сделали заморозку на Lua скриптах, просто нужно б было добавить в этот же скрипт, разрешение для изменения значения на четыре разных значения, может есть такая команда, а может и нет.

У меня есть еще 2 маленьких вопроса. Первый вопрос незначительный. В вашем Lua скрипте HOME-END2 есть такой флаг как forkeys на 4 байта. Его нужно выставить на 1 байт? или это совсем ни на что не влияет?

Второй вопрос: например есть адрес 00A9D874 и если значение в нем будет = 927C0 hex (или в десятичной системе 600000), то нужно изменить(но не заморозить) знчение в этом же адресе 00A9D874 на = 2710 hex (или в десятичной системе 10000).

Вопрос в том как будет выглядеть такой скрипт в Lua?

Мы как раз пытались в этой теме сделать перед этим нечто подобное на Lua, но не получилось.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Razi сказал:

Мы как раз пытались в этой теме сделать перед этим нечто подобное на Lua, но не получилось.

Чёй-то не помню, что мы такое решали. Это же просто и на LUA и на ассемблер. Или ты с кем-нибудь другим решал?

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

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

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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