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

Как переделать АА скрипт, чтоб в нем не использовать инструкцию?


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

Как переделать этот АА скрипт, чтоб в нем не использовать инструкцию? Вот эту инструкцию: aobscan(INJECT,88 1C 08 81 E2 FC FF 1F 00).

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


{ Game   : ePSXe ENG.exe
  Version: 
  Date   : 2016-01-18
  Author : User

  This script does blah blah blah
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

 
 
aobscan(INJECT,88 1C 08 81 E2 FC FF 1F 00) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
cmp byte ptr [00A3F3E5],2
jne code
cmp byte ptr [00A3F3E7],2
jne code
mov byte ptr [00A3F3F5],1
mov byte ptr [00A3F3F9],1
mov byte ptr [00A3F416],1
mov byte ptr [00A3F419],1
mov byte ptr [00A3F427],1
mov byte ptr [00A3F42A],1
mov byte ptr [00A3F42B],1
mov byte ptr [00A3F447],1
mov byte ptr [00A3F448],1
mov byte ptr [00A3F44A],1
mov byte ptr [00A3F44C],1
mov byte ptr [00A3F458],1
mov byte ptr [00A3F459],1
mov byte ptr [00A3F45B],1
mov byte ptr [00A3F45D],1
mov byte ptr [00A3F45E],1
mov byte ptr [00A3F478],1
mov byte ptr [00A3F479],1
mov byte ptr [00A3F47A],1
mov byte ptr [00A3F47C],1
mov byte ptr [00A3F47D],1
mov byte ptr [00A3F47E],1
mov byte ptr [00A3F47F],1
code:
  mov [eax+ecx],bl
  and edx,001FFFFC
  jmp return

INJECT:
  jmp newmem
  nop
  nop
  nop
  nop
return:
registersymbol(INJECT)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
INJECT:
  db 88 1C 08 81 E2 FC FF 1F 00

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 04F102B4

04F1028B: 81 FA 00 00 80 1F     -  cmp edx,1F800000
04F10291: 74 62                 -  je 04F102F5
04F10293: 8B 0D 84 0A 51 00     -  mov ecx,["ePSXe ENG.exe"+110A84]
04F10299: F7 C1 00 00 01 00     -  test ecx,10000
04F1029F: 75 53                 -  jne 04F102F4
04F102A1: 8B C8                 -  mov ecx,eax
04F102A3: 89 C2                 -  mov edx,eax
04F102A5: C1 E9 10              -  shr ecx,10
04F102A8: 25 FF FF 00 00        -  and eax,0000FFFF
04F102AD: 8B 0C 8D 40 AF 82 00  -  mov ecx,[ecx*4+"ePSXe ENG.exe"+42AF40]
// ---------- INJECTING HERE ----------
04F102B4: 88 1C 08              -  mov [eax+ecx],bl
04F102B7: 81 E2 FC FF 1F 00     -  and edx,001FFFFC
// ---------- DONE INJECTING  ----------
04F102BD: BB 20 00 12 05        -  mov ebx,05120020
04F102C2: 03 DA                 -  add ebx,edx
04F102C4: 8B 03                 -  mov eax,[ebx]
04F102C6: 3D 40 00 F1 04        -  cmp eax,04F10040
04F102CB: 75 01                 -  jne 04F102CE
04F102CD: C3                    -  ret 
04F102CE: B8 40 00 F1 04        -  mov eax,04F10040
04F102D3: 8B 0C 10              -  mov ecx,[eax+edx]
04F102D6: B8 20 00 3B 05        -  mov eax,053B0020
04F102DB: 8B 04 10              -  mov eax,[eax+edx]
}

 

 

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

Мне кажется вопрос поставлен не корректно, хотя может я не понимаю. Если не использовать аобскан, то CE не будет знать где ей делать прыжок на выделяемое место под твой скрипт, так же и не будет знать куда передавать управление после того как скрипт отработает. 

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

А если её не использовать, то как скрипт поймет где что делать ? Телепатические способности дарк байт пока в СЕ ещо не реализовал. 

Если надо на обычном адресе - то это будет выглядеть примерно вот так. 

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

[ENABLE]
alloc(newmem,$1000)
label(code)
label(return)
newmem:
cmp byte ptr [00A3F3E5],2
jne code
cmp byte ptr [00A3F3E7],2
jne code
mov byte ptr [00A3F3F5],1
mov byte ptr [00A3F3F9],1
mov byte ptr [00A3F416],1
mov byte ptr [00A3F419],1
mov byte ptr [00A3F427],1
mov byte ptr [00A3F42A],1
mov byte ptr [00A3F42B],1
mov byte ptr [00A3F447],1
mov byte ptr [00A3F448],1
mov byte ptr [00A3F44A],1
mov byte ptr [00A3F44C],1
mov byte ptr [00A3F458],1
mov byte ptr [00A3F459],1
mov byte ptr [00A3F45B],1
mov byte ptr [00A3F45D],1
mov byte ptr [00A3F45E],1
mov byte ptr [00A3F478],1
mov byte ptr [00A3F479],1
mov byte ptr [00A3F47A],1
mov byte ptr [00A3F47C],1
mov byte ptr [00A3F47D],1
mov byte ptr [00A3F47E],1
mov byte ptr [00A3F47F],1
code:
  mov [eax+ecx],bl
  and edx,001FFFFC
  jmp return
04F102B4:
  jmp newmem
  db 90 90 90 90
return:
[DISABLE]
04F102AD:
mov [eax+ecx],bl
and edx,001FFFFC
dealloc(newmem)

 

А по другому я даже понятия не имею как она будет ещо искать нужно место - силой внушения если только попытаться - недельку, другую.

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

4 часа назад, partoftheworlD сказал:

Если не использовать аобскан

 

4 часа назад, LIRW сказал:

А если её не использовать, то как скрипт поймет где что делать ?

Например можно создавать отдельный поток (используя CREATETHREAD) и писать сразу непосредственно в адреса (благо они все статичные в игре Razi)

 

Также можно сделать и с помощью LUA-скрипта.

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

4 часа назад, LIRW сказал:

Если надо на обычном адресе - то это будет выглядеть примерно вот так. 

Жень ты так игру убьёшь:

04F102B4:              // Почему адреса -разные?
  jmp newmem
  db 90 90 90 90
return:
[DISABLE]
04F102AD:              // Почему адреса -разные?
mov [eax+ecx],bl

 

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

Тут же видно из скрипта что эмуль PSX используется...не в тему это раз, а во вторых лучше использовать отладу R3000 в эмулях или IDA Pro

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

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

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

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

ighqqh.jpg

 

Переделал этот скрипт себе, на похожую игру как у автора видео.

Вот скрипт:

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

[ENABLE]
// включить скрипт
globalalloc(battlecheck,2048)   // выделить 2 кб памяти?
CREATETHREAD(battlecheck)       // создать поток

registersymbol(mustend)         // регистрируем символ
label(mustend)                  // создаем метку

label(code)                     // создаем метку еще одну

battlecheck:                    // на эту метку прыгаем при указании на нее (вместо mov eax,["ePSXe ENG.exe"+641c15], автор говорит можно писать cmp byte ptr ["ePSXe ENG.exe"+641c15],01)
mov eax,["ePSXe ENG.exe"+641c15]  // заносим в еах значение в адресе ["ePSXe ENG.exe"+641c15] // адрес 00a41c15 (eax 4 байта занимает)
cmp eax,01      // сравниваем значение в регистре еах или = 1  // во время боя: адрес 00a41c15 =0x01
je code         // если равно, то прыгаем на метку code
jmp battlecheck // если не равно, то прыгаем на метку battlecheck

code:             // на эту метку прыгаем при указании на нее
mov word ptr["ePSXe ENG.exe"+644440],#9999  // заносим в адрес ["ePSXe ENG.exe"+644440] значение в два байта(word) 9999 // адрес 00A44440

push #500           //  500 милисекунд
call sleep          // вызываем функцию sleep (спать), правильно помнишьв LUA sleep(500) - это тоже самое
cmp [mustend],1     // сравниваем значение в адресе mustend или = 1 , но зачем сравниваем?
jne battlecheck     // если не равно прыгаем на battlecheck

ret                 // ?

mustend:           // на эту метку прыгаем при указании на нее
dd 00              // ?

[DISABLE]
// выключить скрипт
mustend:          // на эту метку прыгаем при указании на нее. Почему два раза она написана? вижу что написано при значении 00 и 01
dd 01             // ?

 

Нужно подключится к процессу игры, иначе не принимает скрипт.

Главная задача состоит в том, что бы делать запись значений через АА скрипт, в нужные адреса, при таких-то условиях. Проверял свой АА скрипт и он работает без инструкции.

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

7 минут назад, Razi сказал:

cmp [mustend],1 // сравниваем значение в адресе mustend или = 1 , но зачем сравниваем?

Это типа флага в таблице, чтобы бесконечно не создавались потоки и выполнялись проверки, включил скрипт, если 0, то он закончит выполнение скрипта инструкцией ret, если 1, то создастся поток и выполнится battlecheck, флаг опять установится 0 и все завершится.

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

А вот ссылка на видео, видео на английском. Автор едва внятно разговаривает на английском, с ужасным акцентом, но понять можно. И в комментариях к видео обьясняет, что к чему, счас переведу его комментарий.

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

 

 

Вот перевод с английского. Перевод может быть не абсолютно точным.

Вопрос задан автору видео: call sleep? Как это работает?

Автор отвечая на вопросы: вы вставляете время на которое хотите сделать паузу, затем вызываете call sleep. (Для 64 bit версии будет по другому вам нужно переместить время в регистр а затем call sleep.....и т.д. - mov ecx,#1000) вы также можете использовать "call kernel.32.sleep " в случае если другой dll осуществялет sleep.

createthread() в основном позволяет выполнить кусок кода без зацепливания к api игры код выполняется вместо того чтобы быть собранным в машинный код.  И "ret" в коде это то что завершает поток.

Вы также можете использовать alloc()  вместо  globalalloc() но он не будет повторно использовать память каждый раз, когда он активирован. Также когда вы пишите push #500 оно ложит 500 мс на верхушку стэка и после sleep останавливает(делает паузу) на значение укзанное на верхушке стэка.

 

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

Вопрос в том как это сделать? Есть только такой метод как на видео, или может есть и другие методы?

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

39 минуты назад, partoftheworlD сказал:

Это типа флага в таблице, чтобы бесконечно не создавались потоки и выполнялись проверки, включил скрипт, если 0, то он закончит выполнение скрипта инструкцией ret, если 1, то создастся поток и выполнится battlecheck, флаг опять установится 0 и все завершится.

Давно не пользовался АА скриптами, почти все забыл. А это что делает?

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

mustend:           // на эту метку прыгаем при указании на нее
dd 00              // ?

[DISABLE]
// выключить скрипт
mustend:          // на эту метку прыгаем при указании на нее. Почему два раза она написана? вижу что написано при значении 00 и 01
dd 01             // ?

 

 

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

5 минут назад, partoftheworlD сказал:

Один устанавливает 0, другой устанавливает 1

Ага, значит в конце скрипта перед disable завершает поток, а после скрипта после disable включает поток? Правильно понимаю? Нужно отойти на часок. Вопрос в главе темы остается актуальным.

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

10 час назад, krocki сказал:

Тут же видно из скрипта что эмуль PSX используется...не в тему это раз, а во вторых лучше использовать отладу R3000 в эмулях или IDA Pro

Привет. Здесь вопрос о программировании на скриптах автоасемблера. Или может я действительно не в том разделе тему создал? Пишет, что можно создавать темы о программировании на асемблере или это с аа скриптами, не связано? Про отладку R3000 имеешь ввиду пропатчить диск игры навсегда изменяя байты? IDA Pro это кто?

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

Цитата

а чем тебя aobscan Не устраивает?

Дело в том что есть 10-15 скриптов для одной и той же игры. В игре всего там 3 инструкции наверно. Поэтому эти скрипты используют одни и те же инструкциии, вследствии чего происходит конфликт и сразу зависание. Прописывать и сваливать кучу скриптов в один скрипт, тоже не вариант. Поэтому пришлось использвать язык Lua для скриптов. В общем aobscan использует инструкции, а между одинаковыми инструкциями происходит конфликт.

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

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

используй тогда абсолютный адрес, как показали в 3-ем посте

И тогда между такими скриптами с одинаковыми инструкциями не будет конфликта совсем?

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

В 26.12.2016в23:54, Razi сказал:

И тогда между такими скриптами с одинаковыми инструкциями не будет конфликта совсем?

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

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

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

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

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