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

[FarCry 2] Восстановить число.


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

Как сделать так, что бы при отключении скрипта восстанавливалось оригинальное число.(Не особо шарю. Лучше добавьте в код, всё что нужно)

[esi+0c] - тут лежит число,которое нужно записать при включении,а потом восстановить при отключении скрипта.

Не ругайте за неправильное оформление темы,на форумах не часто пишу.

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

Спойлер

{ Game   : farcry2.exe
  Version: 
  Date   : 2018-03-18
  Author : KOML

  This script does blah blah blah
}

[ENABLE]

 
 
aobscanmodule(unbrakeableweapon,Dunia.dll,83 7E 20 00 75 22) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  mov [esi+0c],(float)240
  
code:
  cmp dword ptr [esi+20],00
  jne Dunia.RunGame+129891
  jmp return

unbrakeableweapon:
  jmp newmem
  nop
return:
registersymbol(unbrakeableweapon)


[DISABLE]

unbrakeableweapon:
  db 83 7E 20 00 75 22


unregistersymbol(unbrakeableweapon)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Dunia.dll"+12FD99

"Dunia.dll"+12FD73: 8B 46 04              -  mov eax,[esi+04]
"Dunia.dll"+12FD76: 83 B8 94 00 00 00 00  -  cmp dword ptr [eax+00000094],00
"Dunia.dll"+12FD7D: 7F 1A                 -  jg Dunia.dll+12FD99
"Dunia.dll"+12FD7F: 80 B8 A4 00 00 00 00  -  cmp byte ptr [eax+000000A4],00
"Dunia.dll"+12FD86: 74 08                 -  je Dunia.dll+12FD90
"Dunia.dll"+12FD88: 8B 80 8C 00 00 00     -  mov eax,[eax+0000008C]
"Dunia.dll"+12FD8E: EB 05                 -  jmp Dunia.dll+12FD95
"Dunia.dll"+12FD90: E8 3B EC FF FF        -  call Dunia.dll+12E9D0
"Dunia.dll"+12FD95: 85 C0                 -  test eax,eax
"Dunia.dll"+12FD97: 7E 28                 -  jle Dunia.dll+12FDC1
// ---------- INJECTING HERE ----------
"Dunia.dll"+12FD99: 83 7E 20 00           -  cmp dword ptr [esi+20],00
"Dunia.dll"+12FD9D: 75 22                 -  jne Dunia.dll+12FDC1
// ---------- DONE INJECTING  ----------
"Dunia.dll"+12FD9F: 8B 46 04              -  mov eax,[esi+04]
"Dunia.dll"+12FDA2: 05 88 00 00 00        -  add eax,00000088
"Dunia.dll"+12FDA7: 50                    -  push eax
"Dunia.dll"+12FDA8: 8D 4E 08              -  lea ecx,[esi+08]
"Dunia.dll"+12FDAB: E8 50 BD 05 00        -  call Dunia.dll+18BB00
"Dunia.dll"+12FDB0: 84 C0                 -  test al,al
"Dunia.dll"+12FDB2: 74 0D                 -  je Dunia.dll+12FDC1
"Dunia.dll"+12FDB4: 83 7E 18 00           -  cmp dword ptr [esi+18],00
"Dunia.dll"+12FDB8: 7F 07                 -  jg Dunia.dll+12FDC1
"Dunia.dll"+12FDBA: B8 01 00 00 00        -  mov eax,00000001
}

 

 

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

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

Как сделать так, что бы при отключении скрипта восстанавливалось оригинальное число.

Все равно будет два скрипта, один внешний, который будет следить отключил ты скрипт или нет.

Поэтому предложу другой вариант.

При активации скрипта - в адресе будет нужное тебе значение.

Перед выключением скрипта значение флага, поменяй на любое, кроме 0 и 1 ну например 2.

Прочти кометы в скрипте.

Потесть, я не тестил. не начем, да и нет времени.

Скрипт:

Спойлер

{ Game   : farcry2.exe
  Version:
  Date   : 2018-03-18
  Author : KOML

  This script does blah blah blah
}

[ENABLE]
aobscanmodule(unbrakeableweapon,Dunia.dll,83 7E 20 00 75 22) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
labеl(flag)   // вводим для восстановления значения в памяти [esi+0c]
registersymbol(flag)
label(save)   // вводим, чтобы сохранить игровое значение
registersymbol(unbrakeableweapon)

newmem:
  cmp [flag],0  // если флаг равен 0, то разово сохраним игровое значение
  jne @f
  push [esi+0c] // передаем через стек игровое значение
  pop [save]    // в нашу метку, одновременно восстанавливая стек.
  mov [flag],1  // и изменим flag на 1

@@:
  cmp [flag],1  // если 1, то
  jne @f
  mov [esi+0c],(float)240 // записываем нужное значение.
  jmp code

@@:             // если не 1. то
  push [save]   // восстанавливаем через стек
  pop [esi+0c]  // значение в адресе.

code:
  cmp dword ptr [esi+20],00
  jne Dunia.RunGame+129891
  jmp return

save:
  dd 0
flag:
  dd 0 // добавь в табличку адрес с адресом "flag", название сам дай какое тебе
       // нужно. При значении в этом адресе 1 будет работать (float)240, при
       // любом другом значении флага (кроме 0 и 1) - будет игровое значение.

unbrakeableweapon:
  jmp newmem
  db 90
return:

[DISABLE]
unbrakeableweapon:
  db 83 7E 20 00 75 22

unregistersymbol(flag)
unregistersymbol(unbrakeableweapon)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Dunia.dll"+12FD99

"Dunia.dll"+12FD73: 8B 46 04              -  mov eax,[esi+04]
"Dunia.dll"+12FD76: 83 B8 94 00 00 00 00  -  cmp dword ptr [eax+00000094],00
"Dunia.dll"+12FD7D: 7F 1A                 -  jg Dunia.dll+12FD99
"Dunia.dll"+12FD7F: 80 B8 A4 00 00 00 00  -  cmp byte ptr [eax+000000A4],00
"Dunia.dll"+12FD86: 74 08                 -  je Dunia.dll+12FD90
"Dunia.dll"+12FD88: 8B 80 8C 00 00 00     -  mov eax,[eax+0000008C]
"Dunia.dll"+12FD8E: EB 05                 -  jmp Dunia.dll+12FD95
"Dunia.dll"+12FD90: E8 3B EC FF FF        -  call Dunia.dll+12E9D0
"Dunia.dll"+12FD95: 85 C0                 -  test eax,eax
"Dunia.dll"+12FD97: 7E 28                 -  jle Dunia.dll+12FDC1
// ---------- INJECTING HERE ----------
"Dunia.dll"+12FD99: 83 7E 20 00           -  cmp dword ptr [esi+20],00
"Dunia.dll"+12FD9D: 75 22                 -  jne Dunia.dll+12FDC1
// ---------- DONE INJECTING  ----------
"Dunia.dll"+12FD9F: 8B 46 04              -  mov eax,[esi+04]
"Dunia.dll"+12FDA2: 05 88 00 00 00        -  add eax,00000088
"Dunia.dll"+12FDA7: 50                    -  push eax
"Dunia.dll"+12FDA8: 8D 4E 08              -  lea ecx,[esi+08]
"Dunia.dll"+12FDAB: E8 50 BD 05 00        -  call Dunia.dll+18BB00
"Dunia.dll"+12FDB0: 84 C0                 -  test al,al
"Dunia.dll"+12FDB2: 74 0D                 -  je Dunia.dll+12FDC1
"Dunia.dll"+12FDB4: 83 7E 18 00           -  cmp dword ptr [esi+18],00
"Dunia.dll"+12FDB8: 7F 07                 -  jg Dunia.dll+12FDC1
"Dunia.dll"+12FDBA: B8 01 00 00 00        -  mov eax,00000001
}

 

 

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

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

Потесть

Потестил .Спасибо за помощь, но там  есть баг. Когда переключаешь флаг на 2, число не отнимается.Под этим числом состояние оружия,ну и при выстреле оно должно отниматься. А не отнимается оно потому, что всё время считывает с 'save' ориг. число,но я это пофиксил (mov [flag],3). В общем,не практично,ибо всё время приходится переключать числа. Может кто знает ещё способы?

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

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

Может кто знает ещё способы?

А для чего в обще восстанавливать то ? не понятно. Это я так понял долговечность оружия..  Зачем восстанавливать оригинал ? Новое оно и новое.. Захотел что бы сломалось, отключил функцию.. 

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

33 минуты назад, LIRW сказал:

А для чего в обще восстанавливать то ?

Просто хочется узнать,как можно это сделать.Были случаи, когда нужно было восстанавливать числа (в других играх),приходилось использовать флаги.

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

флаги не нужны, если тебе нужно во время выполнения кода сохранить оригинал, перезаписать новое значение и восстановить. Для этого можно либо создать лейбл и помещать туда оригинальное значение, либо работать со стеком или регистрами в том числе и xmm.

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

53 минуты назад, derpch сказал:

Были случаи, когда нужно было восстанавливать числа

Подобные числа нет не обходимости восстанавливать...   

Обычно восстанавливается какая не будь к примеру скорость.. Не будешь же постоянно на спид хаке гонять..  

Вот к примеру так можно.. Это у нас чел на форуме дня два назад просил выносливость сделать и вот осталась к примеру скорость скрипт. 

Спойлер

[ENABLE]
aobscanmodule(Speed,Dunia.dll,F3 0F 10 80 D4 00 00 00 F3 0F 11)
alloc(newmem,$1000)
label(code)
label(return)
newmem:
  push (float)12
  movss xmm0,[esp]
  add esp,4
  jmp return
Speed:
  jmp newmem
  db 90 90 90
return:
registersymbol(Speed)
[DISABLE]
Speed:
  db F3 0F 10 80 D4 00 00 00
unregistersymbol(Speed)
dealloc(newmem)

 

Либо так:

movss xmm0,[xxxxxx] 

xxxxxx: 
dd (float) 12

скрипт отпускаешь и оригинал перезаписывает обратно xmm0. 

Ну и там ещо есть способы на подобии как у Игоря.. 

 

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

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

и при выстреле оно должно отниматься.

Понял. (Не знал, нужно было сразу написать об этом)

Пробуй (только теперь при flag=0 - твое значение, при flag=2 игровое) :

Спойлер

fl[ENABLE]
aobscanmodule(unbrakeableweapon,Dunia.dll,83 7E 20 00 75 22) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
labеl(flag)   // вводим для восстановления значения в памяти [esi+0c]
registersymbol(flag)
label(save)   // вводим, чтобы сохранить игровое значение
registersymbol(unbrakeableweapon)

newmem:
  cmp [flag],0  // если флаг равен 0, то разово сохраним игровое значение
  jne @f
  push [esi+0c] // передаем через стек игровое значение
  pop [save]    // в нашу метку, одновременно восстанавливая стек.
  mov [flag],1  // и изменим flag на 1

@@:
  cmp [flag],1  // если 1, то
  jne @f
  mov [esi+0c],(float)240 // записываем нужное значение.
  jmp code

@@:
  cmp [flag],2  // если флаг равен 2, то разово восстановим игровое значение
  jne code
  push [save]   // восстанавливаем через стек
  pop [esi+0c]  // значение в адресе.
  mov [flag],3  // и опять изменим значение флага

code:
  cmp dword ptr [esi+20],00
  jne Dunia.RunGame+129891
  jmp return

save:
  dd 0
flag:
  dd 0 // добавь в табличку адрес с адресом "flag", название сам дай какое тебе
       // нужно. При значении в этом адресе 0 будет работать (float)240, при
       // значении флага равным 2  - будет игровое значение.

unbrakeableweapon:
  jmp newmem
  db 90
return:

[DISABLE]
unbrakeableweapon:
  db 83 7E 20 00 75 22

unregistersymbol(flag)
unregistersymbol(unbrakeableweapon)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Dunia.dll"+12FD99

"Dunia.dll"+12FD73: 8B 46 04              -  mov eax,[esi+04]
"Dunia.dll"+12FD76: 83 B8 94 00 00 00 00  -  cmp dword ptr [eax+00000094],00
"Dunia.dll"+12FD7D: 7F 1A                 -  jg Dunia.dll+12FD99
"Dunia.dll"+12FD7F: 80 B8 A4 00 00 00 00  -  cmp byte ptr [eax+000000A4],00
"Dunia.dll"+12FD86: 74 08                 -  je Dunia.dll+12FD90
"Dunia.dll"+12FD88: 8B 80 8C 00 00 00     -  mov eax,[eax+0000008C]
"Dunia.dll"+12FD8E: EB 05                 -  jmp Dunia.dll+12FD95
"Dunia.dll"+12FD90: E8 3B EC FF FF        -  call Dunia.dll+12E9D0
"Dunia.dll"+12FD95: 85 C0                 -  test eax,eax
"Dunia.dll"+12FD97: 7E 28                 -  jle Dunia.dll+12FDC1
// ---------- INJECTING HERE ----------
"Dunia.dll"+12FD99: 83 7E 20 00           -  cmp dword ptr [esi+20],00
"Dunia.dll"+12FD9D: 75 22                 -  jne Dunia.dll+12FDC1
// ---------- DONE INJECTING  ----------
"Dunia.dll"+12FD9F: 8B 46 04              -  mov eax,[esi+04]
"Dunia.dll"+12FDA2: 05 88 00 00 00        -  add eax,00000088
"Dunia.dll"+12FDA7: 50                    -  push eax
"Dunia.dll"+12FDA8: 8D 4E 08              -  lea ecx,[esi+08]
"Dunia.dll"+12FDAB: E8 50 BD 05 00        -  call Dunia.dll+18BB00
"Dunia.dll"+12FDB0: 84 C0                 -  test al,al
"Dunia.dll"+12FDB2: 74 0D                 -  je Dunia.dll+12FDC1
"Dunia.dll"+12FDB4: 83 7E 18 00           -  cmp dword ptr [esi+18],00
"Dunia.dll"+12FDB8: 7F 07                 -  jg Dunia.dll+12FDC1
"Dunia.dll"+12FDBA: B8 01 00 00 00        -  mov eax,00000001
}ag=0

 

 

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

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

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

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