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

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

Всем салют.

Ломая игру, у меня получился скрипт следующего вида:

Спойлер

{ Game   : JnG2.exe
  Version: 1.02
  Date   : 2021-01-23
  Author : SergBrNord
}

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

aobscan(BOMB,D9 98 30 01 00 00 D9 43) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:

  jmp return

code:
  fstp dword ptr [eax+00000130]
  jmp return

BOMB:
  jmp newmem
  nop
return:
registersymbol(BOMB)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
BOMB:
  db D9 98 30 01 00 00

unregistersymbol(BOMB)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Rake2D.Script.ItemBomb::Update+565

Rake2D.Script.ItemBomb::Update+53F: 75 07              - jne Rake2D.Script.ItemBomb::Update+548
Rake2D.Script.ItemBomb::Update+541: B8 01 00 00 00     - mov eax,00000001
Rake2D.Script.ItemBomb::Update+546: EB 05              - jmp Rake2D.Script.ItemBomb::Update+54D
Rake2D.Script.ItemBomb::Update+548: B8 02 00 00 00     - mov eax,00000002
Rake2D.Script.ItemBomb::Update+54D: 39 45 F0           - cmp [ebp-10],eax
Rake2D.Script.ItemBomb::Update+550: 0F 8C 3E FB FF FF  - jl Rake2D.Script.ItemBomb::Update+94
Rake2D.Script.ItemBomb::Update+556: 8B CB              - mov ecx,ebx
Rake2D.Script.ItemBomb::Update+558: E8 4B DD 5D FF     - call Rake2D.Script.ItemBehaviorScript::get_MyHero
Rake2D.Script.ItemBomb::Update+55D: D9 E8              - fld1 
Rake2D.Script.ItemBomb::Update+55F: D8 A8 30 01 00 00  - fsubr dword ptr [eax+00000130]
// ---------- INJECTING HERE ----------
Rake2D.Script.ItemBomb::Update+565: D9 98 30 01 00 00  - fstp dword ptr [eax+00000130]
// ---------- DONE INJECTING  ----------
Rake2D.Script.ItemBomb::Update+56B: D9 43 30           - fld dword ptr [ebx+30]
Rake2D.Script.ItemBomb::Update+56E: D9 EE              - fldz 
Rake2D.Script.ItemBomb::Update+570: DF F1              - fcomip st(0),st(1)
Rake2D.Script.ItemBomb::Update+572: DD D8              - fstp st(0)
Rake2D.Script.ItemBomb::Update+574: 7A 0B              - jp Rake2D.Script.ItemBomb::Update+581
Rake2D.Script.ItemBomb::Update+576: 73 09              - jae Rake2D.Script.ItemBomb::Update+581
Rake2D.Script.ItemBomb::Update+578: D9 45 08           - fld dword ptr [ebp+08]
Rake2D.Script.ItemBomb::Update+57B: D8 6B 30           - fsubr dword ptr [ebx+30]
Rake2D.Script.ItemBomb::Update+57E: D9 5B 30           - fstp dword ptr [ebx+30]
Rake2D.Script.ItemBomb::Update+581: D9 43 30           - fld dword ptr [ebx+30]
}

 

 

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

После некоторых попыток я пришёл к следующему виду скрипта:

Спойлер

{ Game   : JnG2.exe
  Version: 1.02
  Date   : 2021-01-23
  Author : SergBrNord
}

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

aobscan(BOMB,D9 98 30 01 00 00 D9 43) // should be unique

BOMB:
  db 90 90 90 90 90 90

registersymbol(BOMB)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
BOMB:
  db D9 98 30 01 00 00

unregistersymbol(BOMB)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Rake2D.Script.ItemBomb::Update+565

Rake2D.Script.ItemBomb::Update+53F: 75 07              - jne Rake2D.Script.ItemBomb::Update+548
Rake2D.Script.ItemBomb::Update+541: B8 01 00 00 00     - mov eax,00000001
Rake2D.Script.ItemBomb::Update+546: EB 05              - jmp Rake2D.Script.ItemBomb::Update+54D
Rake2D.Script.ItemBomb::Update+548: B8 02 00 00 00     - mov eax,00000002
Rake2D.Script.ItemBomb::Update+54D: 39 45 F0           - cmp [ebp-10],eax
Rake2D.Script.ItemBomb::Update+550: 0F 8C 3E FB FF FF  - jl Rake2D.Script.ItemBomb::Update+94
Rake2D.Script.ItemBomb::Update+556: 8B CB              - mov ecx,ebx
Rake2D.Script.ItemBomb::Update+558: E8 4B DD 5D FF     - call Rake2D.Script.ItemBehaviorScript::get_MyHero
Rake2D.Script.ItemBomb::Update+55D: D9 E8              - fld1 
Rake2D.Script.ItemBomb::Update+55F: D8 A8 30 01 00 00  - fsubr dword ptr [eax+00000130]
// ---------- INJECTING HERE ----------
Rake2D.Script.ItemBomb::Update+565: D9 98 30 01 00 00  - fstp dword ptr [eax+00000130]
// ---------- DONE INJECTING  ----------
Rake2D.Script.ItemBomb::Update+56B: D9 43 30           - fld dword ptr [ebx+30]
Rake2D.Script.ItemBomb::Update+56E: D9 EE              - fldz 
Rake2D.Script.ItemBomb::Update+570: DF F1              - fcomip st(0),st(1)
Rake2D.Script.ItemBomb::Update+572: DD D8              - fstp st(0)
Rake2D.Script.ItemBomb::Update+574: 7A 0B              - jp Rake2D.Script.ItemBomb::Update+581
Rake2D.Script.ItemBomb::Update+576: 73 09              - jae Rake2D.Script.ItemBomb::Update+581
Rake2D.Script.ItemBomb::Update+578: D9 45 08           - fld dword ptr [ebp+08]
Rake2D.Script.ItemBomb::Update+57B: D8 6B 30           - fsubr dword ptr [ebx+30]
Rake2D.Script.ItemBomb::Update+57E: D9 5B 30           - fstp dword ptr [ebx+30]
Rake2D.Script.ItemBomb::Update+581: D9 43 30           - fld dword ptr [ebx+30]
}

 

 

Можно ли  сделать подобное при помощи инструкции nop какими либо ещё способами (идущие подряд 6 инструкций nop я уже пробовал ?)?

 

P.S.

Нормально ли работает инструкция nop 6? Я искренне считал, что это краткая форма записи подряд идущих инструкций nop. На практике в коде игры вылазит что-то вроде:

 //BOMB - 66 0F1F 44 00 00      - nop word ptr [eax+eax+00]

 

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

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

fstp dword ptr [eax+00000130] замени Fld dword ptr [eax+00000130] так будет проще)))

Так ИМХО еще проще:

Спойлер

[ENABLE]
aobscan(BOMB,D9 98 30 01 00 00 D9 43)
alloc(newmem,$1000)
label(return)
registersymbol(BOMB)

BOMB:
  jmp return
  nop
return:

[DISABLE]
BOMB:
  db D9 98 30 01 00 00

unregistersymbol(BOMB)
dealloc(newmem)

 

 

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

А так будет еще лучше! и стек не сломаешь.

- fld1 <- на это
- fsubr dword ptr [eax+00000130]
- fstp dword ptr [eax+00000130]

 

db 90 90 DD D8 C7 80 30 01 00 00 00 00 80 3F  > patch
db D9 E8 D8 A8 30 01 00 00 D9 98 30 01 00 00  > original 

 

 

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

5 часов назад, LIRW сказал:

А так будет еще лучше! и стек не сломаешь.

там надо на fstp dword ptr [eax+00000130] ставить

fstp st0

nop [eax+eax]

 

или

fld1 < jmp
fsubr dword ptr [eax+00000130]
fstp dword ptr [eax+00000130]
fld dword ptr [ebx+30] <

 

 

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

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

ставить

Ну так.. там всё поставлено :) и запись в +130 - сколько там ? 1 что ли.  Хотя он не сказал даже что там :) Мне кажется его интересует именно подход СЕ вот с такими затираниями в строчку, а не столбик.

Я тут в байт виде и написал.

fstp st(0)
mov dword [xxx+130],1.0

хотя как и писал выше - не знай, что он задумал.. и что там в функции. Но туда и 0 же писать можно и всё что угодно. Просто судил по fld1 значит 1.0 :D и вычитает. По этому и решил туда 1 вписать..

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

  • 3 недели спустя...

Прошу прощения за поздний ответ.

 

В 26.01.2021 в 18:34, LIRW сказал:

Ну так.. там всё поставлено :) и запись в +130 - сколько там ? 1 что ли.  Хотя он не сказал даже что там :) Мне кажется его интересует именно подход СЕ вот с такими затираниями в строчку, а не столбик.

 

 

Всё верно, просто стало интересно, какие ещё варианты могут быть. Происходит в этой функции игры следующее: есть какое-то количество бомб, при использовании которых это количество уменьшается на единицу.

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

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

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

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