Razi Опубликовано 8 марта, 2016 Автор Поделиться Опубликовано 8 марта, 2016 16 минуту назад, Garik66 сказал: В предыдущем сообщении я тебе намекнул, что задачу можно разделить на две: 1. Задача - работа самого таймера, но уже в часах, минутах и секундах. 2. Задача - разовый пересчёт из показаний в сек. - в сек, мин и часы. А можешь вот это расписать поподробнее. Потому что незнаю, все ли правильно понимаю. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 марта, 2016 Поделиться Опубликовано 8 марта, 2016 10 минуту назад, Razi сказал: А можешь вот это расписать поподробнее. Потому что незнаю, все ли правильно понимаю. Куда ещё подробнее? Есть статья, здесь уже практически написан скрипт. Мне проще написать скрипт и чтобы ты его смотрел. Только в игре, на которой я демонстрирую возможности работы с таймером, не знаю на сколько рассчитан таймер. Но попробую написать на ней. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 марта, 2016 Поделиться Опубликовано 8 марта, 2016 ЗЫ: нашёл - таймер в моей игре рассчитан на 68 лет: cmp eax,7FFFFFFF 7FFFFFFF - в dec это 2147483647 сек. Хотя в самой игре отводятся место только на минуты и сек. Ладно попробую написать для тебя и этот скрипт, тем более что он практически уже написан, осталось только сделать до конца разовый пересчёт. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 марта, 2016 Поделиться Опубликовано 8 марта, 2016 Решение на твой 2 вопрос, выложил здесь: Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 8 марта, 2016 Автор Поделиться Опубликовано 8 марта, 2016 А эти регистры, что в скрипте они же с твоей игры, да? Вот аобскан на запись на адрес с секундами с моей игры: Скрытый текст [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscan(gameclock,89 1C 08 81 E2 FC FF 1F 00) // should be unique alloc(newmem,$2048) label(code) label(return) newmem: code: mov [eax+ecx],ebx and edx,001FFFFC jmp return gameclock: jmp newmem nop nop nop nop return: registersymbol(gameclock) [DISABLE] //code from here till the end of the code will be used to disable the cheat gameclock: db 89 1C 08 81 E2 FC FF 1F 00 unregistersymbol(gameclock) dealloc(newmem) А вот исправленый скрипт под мою игру, но спешил, хотел чтоб ты успел проверить и соответственно там много чего еще нужно добавить и исправить. Адрес четырехбайтный из моей игры "009E9150" который считает секунды Скрытый текст [ENABLE] {$LUA} timer = createTimer(true) timer:setInterval(100) timer.OnTimer = function() Second = readInteger('009E9150') -- знаю, не правильно что-то или все Minute = getAddressList().getMemoryRecordByID("92").Value Hour = getAddressList().getMemoryRecordByID("93").Value Daily = getAddressList().getMemoryRecordByID("94").Value control_setCaption(UDF1_CEEdit1,Second) control_setCaption(UDF1_CEEdit2,Minute) control_setCaption(UDF1_CEEdit3,Hour) control_setCaption(UDF1_CEEdit4,Daily) end {$ASM} aobscan(gameclock,89 1C 08 81 E2 FC FF 1F 00) // should be unique alloc(newmem_TimerMission,2048) label(returnhere_TimerMission) label(code) label(code1) label(timer_address) // Ввёл для того, чтобы изменить количество registersymbol(timer_address) // в игре в ручную в таблице. label(timer1) // Игровой таймер в сек. registersymbol(timer1) label(timer2) // Таймер в сек. registersymbol(timer2) label(timer3) // Таймер в мин. registersymbol(timer3) label(timer4) // Таймер в часах. registersymbol(timer4) label(timer5) // Таймер в днях. registersymbol(timer5) label(once) // Чтобы пересчёт происходил один раз. label(Coefficient) // Для пересчёта сек в минуты. label(Coefficient1) // Для пересчёта сек в часы. label(Coefficient2) // Для пересчёта сек в дни. registersymbol(gameclock) newmem_TimerMission: mov [timer_address],ecx cmp [once],1 jne code1 mov dword ptr [timer5],eax // Расчёт дней. fild dword ptr [timer5] fdiv [Coefficient2] push eax lea eax,[timer5] db DB 08 pop eax push eax push ebx push ecx mov ebx,[timer5] mov ecx,0 imul ecx,ebx,#86400 cmp eax,ecx sub eax,ecx mov [timer4],eax fild dword ptr [timer4] // Расчёт часов. fdiv [Coefficient1] push eax lea eax,[timer4] db DB 08 pop eax mov ebx,[timer4] mov ecx,0 imul ecx,ebx,#3600 cmp eax,ecx sub eax,ecx mov [timer3],eax fild dword ptr [timer3] // Расчёт минут. fdiv [Coefficient] push eax lea eax,[timer3] db DB 08 pop eax mov ebx,[timer3] mov ecx,0 imul ecx,ebx,#60 cmp eax,ecx sub eax,ecx mov [timer2],eax pop ecx pop ebx pop eax mov [once],0 code1: inc eax inc [timer2] cmp [timer2],#60 jne code mov [timer2],0 inc [timer3] cmp [timer3],#60 jne code mov [timer3],0 inc [timer4] cmp [timer4],#24 jne code mov [timer4],0 inc [timer5] code: mov dword ptr [timer1],eax mov [eax+ecx],ebx // добавил оригинальный код из своей игры, скорей всего бред and edx,001FFFFC // добавил оригинальный код из своей игры jmp returnhere_TimerMission timer_address: dd 0 timer1: dd 0 timer2: dd 0 timer3: dd 0 timer4: dd 0 timer5: dd 0 once: dd 1 Coefficient: dd (float)60 // в 1 минуте 60 сек Coefficient1: dd (float)3600 // в 1 часе 3600 сек Coefficient2: dd (float)86400 // в 1 дне 86400 сек gameclock: jmp newmem_TimerMission nop nop nop nop returnhere_TimerMission: [DISABLE] {$LUA} timer:setEnabled(false) {$ASM} gameclock: db 89 1C 08 81 E2 FC FF 1F 00 unregistersymbol(timer_address) unregistersymbol(timer1) unregistersymbol(timer2) unregistersymbol(timer3) unregistersymbol(timer4) unregistersymbol(timer5) unregistersymbol(gameclock) dealloc(newmem_TimerMission) Проверь если сможешь, и если сам не запутаешься, а то я уже запутывался. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 марта, 2016 Поделиться Опубликовано 8 марта, 2016 Razi, ты взялся за гуж, который тебе не по плечу. Я конечно допишу скрипт уже для твоей игры, но тебе нужно начать с начала с простенького (ОТ ПРОСТОГО К СЛОЖНОМУ). Почитай статьи, посмотри видео-уроки, попиши не много простых скриптов, а уж потом переходи к сложному. Твой вопрос: 26 минуты назад, Razi сказал: А эти регистры, что в скрипте они же с твоей игры, да? об многом говорит. Отвечаю на него - да. Теперь по скрипту, чтобы привязать мой скрипт к твоей игре: 1. Выкинем из скрипта лишнее, которое я добавлял для наглядности видео. 2. У меня текущее значение игрового таймера в сек находится в регистре eax, у тебя, как я понял, в ebx. Поэтому чуть-чуть переделаем скрипт. Скрытый текст [ENABLE] {$LUA} timer = createTimer(true) timer:setInterval(100) timer.OnTimer = function() Second = getAddressList().getMemoryRecordByID("91").Value -- вместо 91, 92, 93 и 94 подставь свои ID. Minute = getAddressList().getMemoryRecordByID("92").Value Hour = getAddressList().getMemoryRecordByID("93").Value Daily = getAddressList().getMemoryRecordByID("94").Value control_setCaption(UDF1_CEEdit1,Second) control_setCaption(UDF1_CEEdit2,Minute) control_setCaption(UDF1_CEEdit3,Hour) control_setCaption(UDF1_CEEdit4,Daily) end {$ASM} aobscan(gameclock,89 1C 08 81 E2 FC FF 1F 00) alloc(newmem,$2048) label(code) label(code1) label(return) label(timer2) // Таймер в сек. registersymbol(timer2) label(timer3) // Таймер в мин. registersymbol(timer3) label(timer4) // Таймер в часах. registersymbol(timer4) label(timer5) // Таймер в днях. registersymbol(timer5) label(once) // Чтобы пересчёт происходил один раз. label(Coefficient) // Для пересчёта сек в минуты. label(Coefficient1) // Для пересчёта сек в часы. label(Coefficient2) // Для пересчёта сек в дни. registersymbol(gameclock) newmem: cmp [once],1 jne code1 mov dword ptr [timer5],ebx // Расчёт дней. fild dword ptr [timer5] fdiv [Coefficient2] push eax lea eax,[timer5] db DB 08 pop eax push eax push ebx push ecx mov ebx,[timer5] mov ecx,0 imul ecx,ebx,#86400 cmp eax,ecx sub eax,ecx mov [timer4],eax fild dword ptr [timer4] // Расчёт часов. fdiv [Coefficient1] push eax lea eax,[timer4] db DB 08 pop eax mov ebx,[timer4] mov ecx,0 imul ecx,ebx,#3600 cmp eax,ecx sub eax,ecx mov [timer3],eax fild dword ptr [timer3] // Расчёт минут. fdiv [Coefficient] push eax lea eax,[timer3] db DB 08 pop eax mov ebx,[timer3] mov ecx,0 imul ecx,ebx,#60 cmp eax,ecx sub eax,ecx mov [timer2],eax pop ecx pop ebx pop eax mov [once],0 code1: inc eax inc [timer2] cmp [timer2],#60 jne code mov [timer2],0 inc [timer3] cmp [timer3],#60 jne code mov [timer3],0 inc [timer4] cmp [timer4],#24 jne code mov [timer4],0 inc [timer5] code: mov [eax+ecx],ebx and edx,001FFFFC jmp return timer2: dd 0 timer3: dd 0 timer4: dd 0 timer5: dd 0 once: dd 1 Coefficient: dd (float)60 // в 1 минуте 60 сек Coefficient1: dd (float)3600 // в 1 часе 3600 сек Coefficient2: dd (float)86400 // в 1 дне 86400 сек gameclock: jmp newmem db 90 90 90 90 return: [DISABLE] {$LUA} timer:setEnabled(false) {$ASM} gameclock: db 89 1C 08 81 E2 FC FF 1F 00 unregistersymbol(timer2) unregistersymbol(timer3) unregistersymbol(timer4) unregistersymbol(timer5) unregistersymbol(gameclock) dealloc(newmem) 3. Добавить в таблицу под скриптом адреса с адресами timer2, timer3, timer4, timer5. Посмотри ID этих записей в таблице, если не знаешь как это сделать, хотя мы уже с тобой это делали, то в моей статье, есть ссылка - как это сделать. 4. В самом верху скрипта в {$LUA} части подставь эти ID. 5. Создай форму как у меня, кинь на неё 4 объекта Edit и тоже подставь соответствующие названия форм в скрипт. 6. После этого можешь проверить работу скрипта, если сделаешь всё правильно и инструкция у тебя правильная, то должно всё заработать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 8 марта, 2016 Автор Поделиться Опубликовано 8 марта, 2016 (изменено) Сделал, но при запуске скрипта игра вылетает. Может дело в регистрах? Или может дело в пересчете в скрипте? Потому что когда активирую скрипт, там где секунды пишет 40, там где минуты пишет 7, там где часы пишет 596224, там где дни пишет 4294942454. Или может лучше просто считывать с адреса который считает секунды, а не с регистров? Адрес четырехбайтный из моей игры "009E9150" который считает секунды. Но, я не разбираюсь в таких скриптах особо. Изменено 9 марта, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 (изменено) Вот регистры на инструкцию на запись в адрес с секундами. (Поместил в тег кода на всякий случай) Скрытый текст EAX=0000D130 EBX=00006421 ECX=009DC020 EDX=8009D130 ESI=00510AC0 EDI=000007E4 ESP=0012FAE0 EBP=0012FFC0 EIP=034A0437 Посчитал что попадаем на нужный адрес только когда EAX + ECX; D130 + 009DC020 = 009E9150 как раз тот адрес с секундами, что нам нужен. А вот EBX незнаю как к этому адресу относится. Изменено 9 марта, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 Как я понял, твоя инструкция mov [eax+ecx],ebx работает чаще чем в 1 секунду одно срабатывание. Конечно лучше было найти точную инструкцию, работающую только с таймером. На всякий случай перепроверь себя, поставь "бряк на запись" на своём адресе и сделай АА скрипт с аобсканом ничего в нём не меняй, хочу посмотреть ЛОГи инструкций, которую СЕ добавляет внизу скрипта. Но попробуем добавить твой фильтр. У тебя адрес 009E9150 скорее всего статичный (зелёный), как и все адреса из твоей игры, которые я уже видел. 6 часов назад, Razi сказал: А вот EBX незнаю как к этому адресу относится. у тебя в игре получается так, что когда eax+ecx = 009E9150 в EBX находится значение таймера. Выложи АА скрипт. Потом посмотрим. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 (изменено) ЗЫ: План 1. Проверь сам адрес таймера 009E9150 - заморозь его, если таймер в игре остановился, то адрес правильный. 2. "Бряк на запись" - сколько вылезет инструкций, если не одна, то перебери их и проверь с какими адресами они работают (лучше, если найдётся инструкция работающая только с адресом таймера, если такая инструкция найдётся, сделай из неё АА-скрипт). 3. Если одна, которую ты уже выложил, тогда убедись всегда ли EAX=0000D130, когда инструкция работает с адресом таймера - несколько раз выйди из игры и вновь её загрузи, загрузи сейв. 4. Выложи сюда АА скрипт, как я писал ранее с логами. Изменено 9 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 (изменено) 5 часов назад, Garik66 сказал: поставь "бряк на запись" на своём адресе и сделай АА скрипт с аобсканом ничего в нём не меняй, хочу посмотреть ЛОГи инструкций, которую СЕ добавляет внизу скрипта. Вот аобскан на запись на адрес с секундами: (поменял только название с INJECT на gameclock, и поменял с jmp code на jmp newmem) (эта инструкция уже была раньше в других скриптах, ты мне даже обьеденял скрипт из двух скриптов по этой же инструкции, и там адреса никак не были связаны друг с другом, из чего могу сделать вывод, что эта инструкция 89 1C 08 81 E2 FC FF 1F 00 записывает половина значений в игре. Вообще в игре, видел только две инструкции на запись в адреса эта инструкция начинается на 89 а другая на 88.) Аобскан: Скрытый текст { Game : ePSXe ENG.exe Version: Date : 2016-03-09 Author : User This script does blah blah blah } [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscan(gameclock,89 1C 08 81 E2 FC FF 1F 00) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: code: mov [eax+ecx],ebx and edx,001FFFFC jmp return gameclock: jmp newmem nop nop nop nop return: registersymbol(gameclock) [DISABLE] //code from here till the end of the code will be used to disable the cheat gameclock: db 89 1C 08 81 E2 FC FF 1F 00 unregistersymbol(gameclock) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: 034A0434 034A040B: 81 FA 00 00 80 1F - cmp edx,1F800000 034A0411: 74 62 - je 034A0475 034A0413: 8B 0D 84 0A 51 00 - mov ecx,["ePSXe ENG.exe"+110A84] 034A0419: F7 C1 00 00 01 00 - test ecx,10000 034A041F: 75 53 - jne 034A0474 034A0421: 8B C8 - mov ecx,eax 034A0423: 89 C2 - mov edx,eax 034A0425: C1 E9 10 - shr ecx,10 034A0428: 25 FF FF 00 00 - and eax,0000FFFF 034A042D: 8B 0C 8D 40 AF 82 00 - mov ecx,[ecx*4+"ePSXe ENG.exe"+42AF40] // ---------- INJECTING HERE ---------- 034A0434: 89 1C 08 - mov [eax+ecx],ebx 034A0437: 81 E2 FC FF 1F 00 - and edx,001FFFFC // ---------- DONE INJECTING ---------- 034A043D: BB 20 00 6B 03 - mov ebx,036B0020 034A0442: 03 DA - add ebx,edx 034A0444: 8B 03 - mov eax,[ebx] 034A0446: 3D 40 00 4A 03 - cmp eax,034A0040 034A044B: 75 01 - jne 034A044E 034A044D: C3 - ret 034A044E: B8 40 00 4A 03 - mov eax,034A0040 034A0453: 8B 0C 10 - mov ecx,[eax+edx] 034A0456: B8 20 00 94 03 - mov eax,03940020 034A045B: 8B 04 10 - mov eax,[eax+edx] } Изменено 9 марта, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 (изменено) 4 часа назад, Garik66 сказал: План 1. Проверь сам адрес таймера 009E9150 - заморозь его, если таймер в игре остановился, то адрес правильный. 2. "Бряк на запись" - сколько вылезет инструкций, если не одна, то перебери их и проверь с какими адресами они работают (лучше, если найдётся инструкция работающая только с адресом таймера, если такая инструкция найдётся, сделай из неё АА-скрипт). 3. Если одна, которую ты уже выложил, тогда убедись всегда ли EAX=0000D130, когда инструкция работает с адресом таймера - несколько раз выйди из игры и вновь её загрузи, загрузи сейв. 4. Выложи сюда АА скрипт, как я писал ранее с логами. 1. заморозил - таймер остановился 2. При "Бряке на запись" вылазит только одна инструкция 3. EAX=D130 не меняется после нескольких выходов и загрузок игры 4. сделал Инструкция mov [eax+ecx],ebx срабатывает один раз в секунду. Изменено 9 марта, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 2 минуты назад, Razi сказал: 1. заморозил - таймер остановился 2. При "Бряке на запись" вылазит только одна инструкция 3. EAX=D130 не меняется после нескольких выходов и загрузок игры 4. сделал Ну тогда добавим в наш скрипт фильтр, чтобы в нашу инъекцию пропускать только срабатывание инструкции на адресе таймера, а в других случаях чтобы выполнялся оригинальный код. Скрытый текст [ENABLE] {$LUA} timer = createTimer(true) timer:setInterval(100) timer.OnTimer = function() Second = getAddressList().getMemoryRecordByID("91").Value -- вместо 91, 92, 93 и 94 подставь свои ID. Minute = getAddressList().getMemoryRecordByID("92").Value Hour = getAddressList().getMemoryRecordByID("93").Value Daily = getAddressList().getMemoryRecordByID("94").Value control_setCaption(UDF1_CEEdit1,Second) control_setCaption(UDF1_CEEdit2,Minute) control_setCaption(UDF1_CEEdit3,Hour) control_setCaption(UDF1_CEEdit4,Daily) end {$ASM} aobscan(gameclock,89 1C 08 81 E2 FC FF 1F 00) alloc(newmem,$2048) label(code) label(code1) label(return) label(timer2) // Таймер в сек. registersymbol(timer2) label(timer3) // Таймер в мин. registersymbol(timer3) label(timer4) // Таймер в часах. registersymbol(timer4) label(timer5) // Таймер в днях. registersymbol(timer5) label(once) // Чтобы пересчёт происходил один раз. label(Coefficient) // Для пересчёта сек в минуты. label(Coefficient1) // Для пересчёта сек в часы. label(Coefficient2) // Для пересчёта сек в дни. registersymbol(gameclock) newmem: cmp eax,0000D130 // Проверяем с таймером ли работает инструкция при текущем срабатывании. jne code // Если не таймер, то выполняем оригинальные инструкции игры, cmp [once],1 // если тамйер, то выполняем код нашей инъекции. jne code1 push eax mov eax,ebx // Перекинем значение таймера из ebx в eax, чтобы не переписывать весь код. mov dword ptr [timer5],eax // Расчёт дней. fild dword ptr [timer5] fdiv [Coefficient2] push eax lea eax,[timer5] db DB 08 pop eax push ebx push ecx mov ebx,[timer5] mov ecx,0 imul ecx,ebx,#86400 cmp eax,ecx sub eax,ecx mov [timer4],eax fild dword ptr [timer4] // Расчёт часов. fdiv [Coefficient1] push eax lea eax,[timer4] db DB 08 pop eax mov ebx,[timer4] mov ecx,0 imul ecx,ebx,#3600 cmp eax,ecx sub eax,ecx mov [timer3],eax fild dword ptr [timer3] // Расчёт минут. fdiv [Coefficient] push eax lea eax,[timer3] db DB 08 pop eax mov ebx,[timer3] mov ecx,0 imul ecx,ebx,#60 cmp eax,ecx sub eax,ecx mov [timer2],eax pop ecx pop ebx pop eax mov [once],0 code1: inc [timer2] cmp [timer2],#60 jne code mov [timer2],0 inc [timer3] cmp [timer3],#60 jne code mov [timer3],0 inc [timer4] cmp [timer4],#24 jne code mov [timer4],0 inc [timer5] code: mov [eax+ecx],ebx and edx,001FFFFC jmp return timer2: dd 0 timer3: dd 0 timer4: dd 0 timer5: dd 0 once: dd 1 Coefficient: dd (float)60 // в 1 минуте 60 сек Coefficient1: dd (float)3600 // в 1 часе 3600 сек Coefficient2: dd (float)86400 // в 1 дне 86400 сек gameclock: jmp newmem db 90 90 90 90 return: [DISABLE] {$LUA} timer:setEnabled(false) {$ASM} gameclock: db 89 1C 08 81 E2 FC FF 1F 00 unregistersymbol(timer2) unregistersymbol(timer3) unregistersymbol(timer4) unregistersymbol(timer5) unregistersymbol(gameclock) dealloc(newmem) Проверь скрипт, не забудь заменить на свои ID в LUA части скрипта. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 Неа, не работает. Как-то неправильно пересчитывает время, в боевом режиме счетчик секунд ускоряется в 10 раз, но в адресе 009E9150 время идет нормально, без ускорений. Может нужно фильтр поставить как: cmp EAX + ECX ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 27 минуты назад, Razi сказал: Неа, не работает. Как-то неправильно пересчитывает время, в боевом режиме счетчик секунд ускоряется в 10 раз, но в адресе 009E9150 время идет нормально, без ускорений. Может нужно фильтр поставить как: cmp EAX + ECX ? Как я понял работает, но не правильно. Т.е. через фильтр проскакивают и другие срабатывания. Давай попробуем фильтр записать по другому Скрытый текст [ENABLE] {$LUA} timer = createTimer(true) timer:setInterval(100) timer.OnTimer = function() Second = getAddressList().getMemoryRecordByID("91").Value -- вместо 91, 92, 93 и 94 подставь свои ID. Minute = getAddressList().getMemoryRecordByID("92").Value Hour = getAddressList().getMemoryRecordByID("93").Value Daily = getAddressList().getMemoryRecordByID("94").Value control_setCaption(UDF1_CEEdit1,Second) control_setCaption(UDF1_CEEdit2,Minute) control_setCaption(UDF1_CEEdit3,Hour) control_setCaption(UDF1_CEEdit4,Daily) end {$ASM} aobscan(gameclock,89 1C 08 81 E2 FC FF 1F 00) alloc(newmem,$2048) label(code) label(code1) label(return) label(timer2) // Таймер в сек. registersymbol(timer2) label(timer3) // Таймер в мин. registersymbol(timer3) label(timer4) // Таймер в часах. registersymbol(timer4) label(timer5) // Таймер в днях. registersymbol(timer5) label(once) // Чтобы пересчёт происходил один раз. label(Coefficient) // Для пересчёта сек в минуты. label(Coefficient1) // Для пересчёта сек в часы. label(Coefficient2) // Для пересчёта сек в дни. registersymbol(gameclock) newmem: push edx lea edx,[eax+ecx] cmp edx,009E9150 // Проверяем с таймером ли работает инструкция при текущем срабатывании. pop edx jne code // Если не таймер, то выполняем оригинальные инструкции игры, cmp [once],1 // если тамйер, то выполняем код нашей инъекции. jne code1 push eax mov eax,ebx // Перекинем значение таймера из ebx в eax, чтобы не переписывать весь код. mov dword ptr [timer5],eax // Расчёт дней. fild dword ptr [timer5] fdiv [Coefficient2] push eax lea eax,[timer5] db DB 08 pop eax push ebx push ecx mov ebx,[timer5] mov ecx,0 imul ecx,ebx,#86400 cmp eax,ecx sub eax,ecx mov [timer4],eax fild dword ptr [timer4] // Расчёт часов. fdiv [Coefficient1] push eax lea eax,[timer4] db DB 08 pop eax mov ebx,[timer4] mov ecx,0 imul ecx,ebx,#3600 cmp eax,ecx sub eax,ecx mov [timer3],eax fild dword ptr [timer3] // Расчёт минут. fdiv [Coefficient] push eax lea eax,[timer3] db DB 08 pop eax mov ebx,[timer3] mov ecx,0 imul ecx,ebx,#60 cmp eax,ecx sub eax,ecx mov [timer2],eax pop ecx pop ebx pop eax mov [once],0 code1: inc [timer2] cmp [timer2],#60 jne code mov [timer2],0 inc [timer3] cmp [timer3],#60 jne code mov [timer3],0 inc [timer4] cmp [timer4],#24 jne code mov [timer4],0 inc [timer5] code: mov [eax+ecx],ebx and edx,001FFFFC jmp return timer2: dd 0 timer3: dd 0 timer4: dd 0 timer5: dd 0 once: dd 1 Coefficient: dd (float)60 // в 1 минуте 60 сек Coefficient1: dd (float)3600 // в 1 часе 3600 сек Coefficient2: dd (float)86400 // в 1 дне 86400 сек gameclock: jmp newmem db 90 90 90 90 return: [DISABLE] {$LUA} timer:setEnabled(false) {$ASM} gameclock: db 89 1C 08 81 E2 FC FF 1F 00 unregistersymbol(timer2) unregistersymbol(timer3) unregistersymbol(timer4) unregistersymbol(timer5) unregistersymbol(gameclock) dealloc(newmem) Проверь. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 3 часа назад, Razi сказал: Инструкция mov [eax+ecx],ebx срабатывает один раз в секунду. Это она один раз в секунду срабатывает именно на адресе таймера, а так сама инструкция работает, как я писал гораздо чаще. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 Вот теперь работает, после трех минут проверки, но надо еще немного проверить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 51 минуту назад, Razi сказал: Вот теперь работает, после трех минут проверки, но надо еще немного проверить. Ну что а дальше то работает? 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 (изменено) Работает в общем. Непонятно почему, но таймер в форме опережает игровое время на одну секунду. А так все нормально. Может еще по-мелочи еще захочу чуть усовершенствовать что-то, но главная задача сделана. Изменено 9 марта, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 6 минут назад, Razi сказал: Работает в общем. Непонятно почему, но таймер в форме опережает игровое время на одну секунду. А так все нормально. Добавь сюда: Скрытый текст fild dword ptr [timer3] // Расчёт минут. fdiv [Coefficient] push eax lea eax,[timer3] db DB 08 pop eax mov ebx,[timer3] mov ecx,0 imul ecx,ebx,#60 cmp eax,ecx sub eax,ecx dec eax // Добавь это в скрипт и таймеры выравняются. mov [timer2],eax 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 (изменено) Работает теперь точно секунда в секунду. Изменено 9 марта, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 марта, 2016 Поделиться Опубликовано 9 марта, 2016 4 минуты назад, Razi сказал: Работает теперь точно секунда в секнунду. Отлично! Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 9 марта, 2016 Автор Поделиться Опубликовано 9 марта, 2016 (изменено) Замечательно. У меня может появится один вопрос по усовершенствованию отображения времени, но это может уже завтра у тебя спрошу. Изменено 9 марта, 2016 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 10 марта, 2016 Поделиться Опубликовано 10 марта, 2016 Луа вариант: Часы автоматически конвертируются, сбрасываются на ноль с 60 и с 24, не зависят от скорости работы инструкции, автоматически вырисовывают ноли когда цифра меньше 10 то есть в форме отображается не 1 а 01. Часы на примере игры Асасин, которую я скачал только для эксперимента с часами, и которую я снес сразу же по его завершении. Таблица http://rghost.ru/7QcbTWPbS Скрипт Скрытый текст [ENABLE] {$LUA} function RecalculetionStartUp(sender) if TIME.CEButton1.Caption=="START" then TIME.CEButton1.Caption="STOP" TIME.CETimer1.Enabled=true else if TIME.CEButton1.Caption=="STOP" then TIME.CEButton1.Caption="START" TIME.CETimer1.Enabled=false end end end function DigitControl() A = readInteger("gametimeSTANDAART") if A~="??" then if (math.floor(A))-(math.floor(A/60)*60)>-1 and (math.floor(A))-(math.floor(A/60)*60)<10 then TIME.CELabel5.Caption="0" TIME.CELabel6.Left=256 TIME.CELabel6.Caption=(math.floor(A))-(math.floor(A/60)*60) else if A~="??" then TIME.CELabel5.Caption="" TIME.CELabel6.Left=TIME.CELabel5.Left+2 TIME.CELabel6.Caption=(math.floor(A))-(math.floor(A/60)*60) end end end if A~="??" then if (math.floor(A/60))-(math.floor(A/3600)*60)>-1 and (math.floor(A/60))-(math.floor(A/3600)*60)<10 then TIME.CELabel3.Caption="0" TIME.CELabel7.Left=184 TIME.CELabel7.Caption=(math.floor(A/60))-(math.floor(A/3600)*60) else if A~="??" then TIME.CELabel3.Caption="" TIME.CELabel7.Left=TIME.CELabel3.Left+2 TIME.CELabel7.Caption=(math.floor(A/60))-(math.floor(A/3600)*60) end end end if A~="??" then if (math.floor(A/3600))-(math.floor(A/1440/60))*24>-1 and (math.floor(A/3600))-(math.floor(A/1440/60))*24<10 then TIME.CELabel1.Caption="0" TIME.CELabel8.Left=112 TIME.CELabel8.Caption=(math.floor(A/3600))-(math.floor(A/1440/60))*24 else if A~="??" then TIME.CELabel1.Caption="" TIME.CELabel8.Left=TIME.CELabel1.Left+2 TIME.CELabel8.Caption=(math.floor(A/3600))-(math.floor(A/1440/60))*24 end end end end {$ASM} aobscan(SCANFORtimemmis,89 41 08 5E 59 C2) alloc(PLACEFORtimemmis,2000,SCANFORtimemmis) registersymbol(SCANFORtimemmis) globalalloc(gametimeSTANDAART, 4) label(BACKtimemmis) PLACEFORtimemmis: mov [gametimeSTANDAART],eax mov [ecx+08],eax pop esi pop ecx jmp BACKtimemmis SCANFORtimemmis: jmp PLACEFORtimemmis BACKtimemmis: [DISABLE] SCANFORtimemmis: db 89 41 08 5E 59 C2 unregistersymbol(SCANFORtimemmis) dealloc(PLACEFORtimemmis) //"ACCGame-Win32-Shipping.exe"+B774ED //mov [ecx+08],eax //pop esi //pop ecx Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2016 Поделиться Опубликовано 10 марта, 2016 (изменено) 18 минуту назад, AntonVitalievich сказал: Луа вариант: AntonVitalievich, Вы как всегда на высоте. СУПЕР!!! Правда теперь готовьтесь к куче вопросов от Razi . Изменено 10 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения