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

Возможно ли в форму, которую создает CE вставить три адреса


Razi

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

16 минуту назад, Garik66 сказал:

В предыдущем сообщении я тебе намекнул, что задачу можно разделить на две:

1. Задача - работа самого таймера, но уже в часах, минутах и секундах.

2. Задача - разовый пересчёт из показаний в сек. - в сек, мин и часы. 

 

А можешь вот это расписать поподробнее. Потому что незнаю, все ли правильно понимаю.

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

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

А можешь вот это расписать поподробнее. Потому что незнаю, все ли правильно понимаю.

Куда ещё подробнее? Есть статья, здесь уже практически написан скрипт.

Мне проще написать скрипт и чтобы ты его смотрел. Только в игре, на которой я демонстрирую возможности работы с таймером, не знаю на сколько рассчитан таймер. Но попробую написать на ней.

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

ЗЫ: нашёл - таймер в моей игре рассчитан на 68 лет:

cmp eax,7FFFFFFF

7FFFFFFF - в dec это 2147483647 сек. Хотя в самой игре отводятся место только на минуты и сек.

Ладно попробую написать для тебя и этот скрипт, тем более что он практически уже написан, осталось только сделать до конца разовый пересчёт.  

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

А эти регистры, что в скрипте они же с твоей игры, да?

Вот аобскан на запись на адрес с секундами с моей игры:

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

[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)

 

 

Проверь если сможешь, и если сам не запутаешься, а то я уже запутывался.

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

ты взялся за гуж, который тебе не по плечу.

Я конечно допишу скрипт уже для твоей игры, но тебе нужно начать с начала с простенького (ОТ ПРОСТОГО К СЛОЖНОМУ).

Почитай статьи, посмотри видео-уроки, попиши не много простых скриптов, а уж потом переходи к сложному.

Твой вопрос:

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. После этого можешь проверить работу скрипта, если сделаешь всё правильно и инструкция у тебя правильная, то должно всё заработать. 

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

Сделал, но при запуске скрипта игра вылетает. Может дело в регистрах? Или может дело в пересчете в скрипте? Потому что когда активирую скрипт, там где секунды пишет 40, там где минуты пишет 7, там где часы пишет 596224, там где дни пишет 4294942454.

Или может лучше просто считывать с адреса который считает секунды, а не с регистров? Адрес четырехбайтный из моей игры "009E9150" который считает секунды. Но, я не разбираюсь в таких скриптах особо.

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

Вот регистры на инструкцию на запись в адрес с секундами. (Поместил в тег кода на всякий случай)

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

EAX=0000D130
EBX=00006421
ECX=009DC020
EDX=8009D130
ESI=00510AC0
EDI=000007E4
ESP=0012FAE0
EBP=0012FFC0
EIP=034A0437

 

 

Посчитал что попадаем на нужный адрес только когда EAX + ECX;   D130 + 009DC020 = 009E9150 как раз тот адрес с секундами, что нам нужен. А вот EBX незнаю как к этому адресу относится.

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

Как я понял, твоя инструкция

mov [eax+ecx],ebx

работает чаще чем в 1 секунду одно срабатывание.

Конечно лучше было найти точную инструкцию, работающую только с таймером. На всякий случай перепроверь себя, поставь "бряк на запись" на своём адресе и сделай АА скрипт с аобсканом ничего в нём не меняй, хочу посмотреть ЛОГи инструкций, которую СЕ добавляет внизу скрипта.

 

Но попробуем добавить твой фильтр.

У тебя адрес  009E9150 скорее всего статичный (зелёный), как и все адреса из твоей игры, которые я уже видел.

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

А вот EBX незнаю как к этому адресу относится.

у тебя в игре получается так, что когда   eax+ecx = 009E9150 в EBX находится значение таймера.

 

Выложи АА скрипт. Потом посмотрим.

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

ЗЫ:

План

1. Проверь сам адрес таймера 009E9150 - заморозь его, если таймер в игре остановился, то адрес правильный.

2. "Бряк на запись" - сколько вылезет инструкций, если не одна, то перебери их и проверь с какими адресами они работают (лучше, если найдётся инструкция работающая только с адресом таймера, если такая инструкция найдётся, сделай из неё АА-скрипт).

3. Если одна, которую ты уже выложил, тогда убедись всегда ли EAX=0000D130, когда инструкция работает с адресом таймера - несколько раз выйди из игры и вновь её загрузи, загрузи сейв.

4. Выложи сюда АА скрипт, как я писал ранее с логами.  

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

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]
}

 

 

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

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

План

1. Проверь сам адрес таймера 009E9150 - заморозь его, если таймер в игре остановился, то адрес правильный.

2. "Бряк на запись" - сколько вылезет инструкций, если не одна, то перебери их и проверь с какими адресами они работают (лучше, если найдётся инструкция работающая только с адресом таймера, если такая инструкция найдётся, сделай из неё АА-скрипт).

3. Если одна, которую ты уже выложил, тогда убедись всегда ли EAX=0000D130, когда инструкция работает с адресом таймера - несколько раз выйди из игры и вновь её загрузи, загрузи сейв.

4. Выложи сюда АА скрипт, как я писал ранее с логами.

 

1. заморозил - таймер остановился

2. При "Бряке на запись" вылазит только одна инструкция

3. EAX=D130 не меняется после нескольких выходов и загрузок игры

4. сделал

 

Инструкция

mov [eax+ecx],ebx

срабатывает один раз в секунду.

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

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

Неа, не работает. Как-то неправильно пересчитывает время, в боевом режиме счетчик секунд ускоряется в 10 раз, но в адресе 009E9150 время идет нормально, без ускорений. Может нужно фильтр поставить как: cmp EAX + ECX ?

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

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

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

Инструкция


mov [eax+ecx],ebx

срабатывает один раз в секунду.

Это она один раз в секунду срабатывает именно на адресе таймера, а так сама инструкция работает, как я писал гораздо чаще.

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

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

Вот теперь работает, после трех минут проверки, но надо еще немного проверить.

Ну что а дальше то работает? ;)

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

Работает в общем. Непонятно почему, но таймер в форме опережает игровое время на одну секунду. А так все нормально. Может еще по-мелочи еще захочу чуть усовершенствовать что-то, но главная задача сделана.

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

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

Луа вариант: Часы автоматически конвертируются, сбрасываются на ноль с 60 и с 24, не зависят от скорости работы инструкции, автоматически вырисовывают ноли когда цифра меньше 10 то есть в форме отображается не 1 а 01. Часы на примере игры Асасин, которую я скачал только для эксперимента с часами, и которую я снес сразу же по его завершении.

Zahvatjpg_7645426_21040208.jpg

 

Таблица

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

 

 

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

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

Луа вариант:

Вы как всегда на высоте. СУПЕР!!!

Правда теперь готовьтесь к куче вопросов от Razi :D.

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

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

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

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