Razi Опубликовано 25 декабря, 2016 Поделиться Опубликовано 25 декабря, 2016 (изменено) Как переделать этот АА скрипт, чтоб в нем не использовать инструкцию? Вот эту инструкцию: 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] } Изменено 25 декабря, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 25 декабря, 2016 Поделиться Опубликовано 25 декабря, 2016 (изменено) Мне кажется вопрос поставлен не корректно, хотя может я не понимаю. Если не использовать аобскан, то CE не будет знать где ей делать прыжок на выделяемое место под твой скрипт, так же и не будет знать куда передавать управление после того как скрипт отработает. Изменено 25 декабря, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 25 декабря, 2016 Поделиться Опубликовано 25 декабря, 2016 А если её не использовать, то как скрипт поймет где что делать ? Телепатические способности дарк байт пока в СЕ ещо не реализовал. Если надо на обычном адресе - то это будет выглядеть примерно вот так. Скрытый текст [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) А по другому я даже понятия не имею как она будет ещо искать нужно место - силой внушения если только попытаться - недельку, другую. Ссылка на комментарий Поделиться на другие сайты Поделиться
aliast Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 2 часа назад, LIRW сказал: [DISABLE] 04F102AD: mov [eax+ecx],bl and edx,001FFFFC dealloc(newmem) [DISABLE] 4F102B4: mov [eax+ecx],bl and edx,001FFFFC dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 (изменено) 4 часа назад, partoftheworlD сказал: Если не использовать аобскан 4 часа назад, LIRW сказал: А если её не использовать, то как скрипт поймет где что делать ? Например можно создавать отдельный поток (используя CREATETHREAD) и писать сразу непосредственно в адреса (благо они все статичные в игре Razi) Также можно сделать и с помощью LUA-скрипта. Изменено 26 декабря, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 4 часа назад, LIRW сказал: Если надо на обычном адресе - то это будет выглядеть примерно вот так. Жень ты так игру убьёшь: 04F102B4: // Почему адреса -разные? jmp newmem db 90 90 90 90 return: [DISABLE] 04F102AD: // Почему адреса -разные? mov [eax+ecx],bl Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 Тут же видно из скрипта что эмуль PSX используется...не в тему это раз, а во вторых лучше использовать отладу R3000 в эмулях или IDA Pro Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 6 часов назад, Garik66 сказал: Жень ты так игру убьёшь: Не заметил Игорь или проще говоря не внимательность. Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 (изменено) Например сделал такой же скрипт на Lua, и все работает, идет просто запись в разные адреса при таких-то условиях. Спрашиваю, потому что видел на ютубе как человек делал что-то похожее. Ссылку на видео могу дать. А вот скриншот этого скрипта. Скрытый текст Переделал этот скрипт себе, на похожую игру как у автора видео. Вот скрипт: Скрытый текст [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 // ? Нужно подключится к процессу игры, иначе не принимает скрипт. Главная задача состоит в том, что бы делать запись значений через АА скрипт, в нужные адреса, при таких-то условиях. Проверял свой АА скрипт и он работает без инструкции. Изменено 26 декабря, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 (изменено) 7 минут назад, Razi сказал: cmp [mustend],1 // сравниваем значение в адресе mustend или = 1 , но зачем сравниваем? Это типа флага в таблице, чтобы бесконечно не создавались потоки и выполнялись проверки, включил скрипт, если 0, то он закончит выполнение скрипта инструкцией ret, если 1, то создастся поток и выполнится battlecheck, флаг опять установится 0 и все завершится. Изменено 26 декабря, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 (изменено) А вот ссылка на видео, видео на английском. Автор едва внятно разговаривает на английском, с ужасным акцентом, но понять можно. И в комментариях к видео обьясняет, что к чему, счас переведу его комментарий. Скрытый текст Вот перевод с английского. Перевод может быть не абсолютно точным. Вопрос задан автору видео: 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 останавливает(делает паузу) на значение укзанное на верхушке стэка. Главная задача состоит в том, что бы делать запись значений через АА скрипт, в нужные адреса, при таких-то условиях. Вопрос в том как это сделать? Есть только такой метод как на видео, или может есть и другие методы? Изменено 26 декабря, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 39 минуты назад, partoftheworlD сказал: Это типа флага в таблице, чтобы бесконечно не создавались потоки и выполнялись проверки, включил скрипт, если 0, то он закончит выполнение скрипта инструкцией ret, если 1, то создастся поток и выполнится battlecheck, флаг опять установится 0 и все завершится. Давно не пользовался АА скриптами, почти все забыл. А это что делает? Скрытый текст mustend: // на эту метку прыгаем при указании на нее dd 00 // ? [DISABLE] // выключить скрипт mustend: // на эту метку прыгаем при указании на нее. Почему два раза она написана? вижу что написано при значении 00 и 01 dd 01 // ? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 1 минуту назад, Razi сказал: А это что делает? Один устанавливает 0, другой устанавливает 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 (изменено) 5 минут назад, partoftheworlD сказал: Один устанавливает 0, другой устанавливает 1 Ага, значит в конце скрипта перед disable завершает поток, а после скрипта после disable включает поток? Правильно понимаю? Нужно отойти на часок. Вопрос в главе темы остается актуальным. Изменено 26 декабря, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 (изменено) 10 час назад, krocki сказал: Тут же видно из скрипта что эмуль PSX используется...не в тему это раз, а во вторых лучше использовать отладу R3000 в эмулях или IDA Pro Привет. Здесь вопрос о программировании на скриптах автоасемблера. Или может я действительно не в том разделе тему создал? Пишет, что можно создавать темы о программировании на асемблере или это с аа скриптами, не связано? Про отладку R3000 имеешь ввиду пропатчить диск игры навсегда изменяя байты? IDA Pro это кто? Изменено 26 декабря, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 а чем тебя aobscan Не устраивает? Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 (изменено) Цитата а чем тебя aobscan Не устраивает? Дело в том что есть 10-15 скриптов для одной и той же игры. В игре всего там 3 инструкции наверно. Поэтому эти скрипты используют одни и те же инструкциии, вследствии чего происходит конфликт и сразу зависание. Прописывать и сваливать кучу скриптов в один скрипт, тоже не вариант. Поэтому пришлось использвать язык Lua для скриптов. В общем aobscan использует инструкции, а между одинаковыми инструкциями происходит конфликт. Изменено 26 декабря, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 используй тогда абсолютный адрес, как показали в 3-ем посте Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 1 час назад, Dino сказал: используй тогда абсолютный адрес, как показали в 3-ем посте И тогда между такими скриптами с одинаковыми инструкциями не будет конфликта совсем? Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 28 декабря, 2016 Поделиться Опубликовано 28 декабря, 2016 (изменено) В 26.12.2016в23:54, Razi сказал: И тогда между такими скриптами с одинаковыми инструкциями не будет конфликта совсем? может будет, а может и не будет, по большей части зависит от того как построен код твоего хука(скрипта). Но лучше всего , конечно, на инструкцию вешать не более одного скрипта. Изменено 28 декабря, 2016 пользователем Dino Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения