Автор Тема: Вызов функции через CLEO  (Прочитано 657 раз)

Оффлайн Tommi4kaVar4etti

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Решил немного углубиться в скриптинг и повызвать функции через CLEO. Но у меня ничего не вышло из-за нехватки навыков. Так же мне не понятно, чем друг от друга отличаются эти 4 опкода:

05E1=-1,call %1d% num_params %2h% pop %3h%
05E2=-1,call_function %1d% num_params %2h% pop %3h%
05E3=-1,call_method %1d% struct %2d% num_params %3h% pop %4h%
05E4=-1,call_function_method %1d% struct %2d% num_params %3h% pop %4h%

Пример того, как я вызываю функцию:

05E1: call 0x5CA3C0 num_params 0 pop 0
Функция вызова перезарядки. Если я правильно понимаю, то тип void - это пустота. Т.е. у неё не должно быть параметров.

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Вызов функции через CLEO
« Ответ #1 : Май 03, 2017, 12:02:31 pm »
05E1: call 0x5CA3C0 num_params 0 pop 0
Функция вызова перезарядки. Если я правильно понимаю, то тип void - это пустота. Т.е. у неё не должно быть параметров.

Не совсем. Если посмотреть в базе, то можно увидеть, что эта процедура принимает неявный параметр через регистр ECX. В данной процедуре ECX содержит указатель на структуру класса CWeapon, и это значит, что мы имеем дело с методом. Раз мы имеем дело с методом, то его нужно вызывать опкодом 05E3, если метод не возвращает значение, иначе 05E4, если возвращает:
05E3: call_method 0x5CA3C0 struct $WeaponStruct num_params 0 pop 0

Оффлайн Tommi4kaVar4etti

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Re: Вызов функции через CLEO
« Ответ #2 : Май 03, 2017, 04:42:50 pm »
Хм, еще бы найти указатель на weapon struct.

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Вызов функции через CLEO
« Ответ #3 : Май 03, 2017, 06:18:35 pm »
Хм, еще бы найти указатель на weapon struct.
Если нужно перезарядить оружие игрока, тогда:
1)Получаем структуру педа игрока.
2)Смещаемся по структуре на 0x504 и высчитываем из полученного адреса значение размером в 1 байт (это номер активного слота оружия).
3)Затем снова от начала структуры смещаемся на 0x408 и прибавляем произведение номера слота на 0x18.
4)Получившиеся значение и есть адрес структуры CWeapon, который надо передать опкоду 05E3.