You are not logged in.
Хотел поставить эксперимент: скопировал код процедуры _cheatSpawnRhino в скрипт (см.ниже) и попытался исполнить этот код с помощью 0AA5, однако при этом игра вылетела. В чём причина?
{$CLEO} 0AC6: 0@ = label @SPAWN_RHINO offset while true wait 0 if not player.Defined($player_char) then continue end if 0AB0: key_pressed 220 // \ then 0AA5: call 0@ num_params 0 pop 0 end end :SPAWN_RHINO hex 68 B0 01 00 00 // push 1B0h E8 06 FC FF FF // call _spawnCarAtPlayerLocation 59 // pop ecx C3 // retn end
Offline
В exe при вызове процедур используются локальные смещения относительно текущего адреса. Грубо говоря, вызывается не call 0x454654 а call -12.
E8 06 FC FF FF
Поэтому скопированный в другое место call будет указывать не на процедуру, а в другое место.
Чтобы избежать этого нужно адрес вызываемой в ехе функции записать в регистр, например eax, и вызвать call eax.
http://sannybuilder.com/forums/viewtopi … d=166#p166
http://sannybuilder.com/forums/viewtopi … d=369#p369
Offline
Спасибо, разобрался. Исправленный код выглядит так:
{$CLEO 0AC6: 0@ = label @SPAWN_RHINO offset while true wait 0 if not player.Defined($player_char) then continue end if 0AB0: key_pressed 220 // \ then 0AA5: call 0@ num_params 0 pop 0 end end :SPAWN_RHINO hex 68 B0 01 00 00 // push 1B0h B8 B0 A0 43 00 // mov eax, 0x43A0B0 (_spawnCarAtPlayerLocation) FF D0 // call eax 59 // pop ecx C3 // retn end
Второй вариант - без использования регистра, но более громоздкий:
{$CLEO} 0AC6: 1@ = label @SPAWN_RHINO offset 1@ += 10 // оффсет команды pop ecx 1@ *= -1 1@ += 0x43A0B0 // находим смещение между командой вызова и процедурой 0AC6: 0@ = label @SPAWN_RHINO offset 0@ += 6 0A8C: write_memory 0@ size 4 value 1@ virtual_protect 1 // записываем смещение в команду 0@ -= 6 while true wait 0 if not player.Defined($player_char) then continue end if 0AB0: key_pressed 220 // \ then 0AA5: call 0@ num_params 0 pop 0 end end :SPAWN_RHINO hex 68 B0 01 00 00 // push 1B0h E8 00 00 00 00 // call 1@ 59 // pop ecx C3 // retn end
Offline
1@ += 10 // оффсет команды pop ecx 1@ *= -1 1@ += 0x43A0B0 // находим смещение между командой вызова и процедурой
путем несложных математических операций я свернул эти 3 команды в одну:
0A8F: 1@ = 0x43A0A6 - 1@
Offline