чет я немного еблан, вместо того, чтобы дрочиться самостоятельно с листингом, можно было поставить call хук на вызов CVehicle::DoVehicleLights через какую-нибудь либу хуков (у меня kthook)У меня возникло аж несколько вопросов.
1. Зачем ты прыгаешь так?
Если можно использовать прыжок напрямую (и это будет занимать 5 байтов вместо 7)?C++:mov eax, 0x11223344 // b8 44 33 22 11 jmp eax // ff e0
Типа, если это обход какого-то античита - тогда ладно. Но просто так зачем усложнять жизнь?C++:jmp 0x11223344 // e9 40 33 22 11
2. У тебя в твоей реализации заменён такой код (первые 7 байтов):
А ты в эпилоге вместо этого выполняешь такое:C++:mov eax, [esi+14h] // 8B 46 14 mov ecx, esi // 8B CE push eax // 50 call CVehicle::DoVehicleLights(CMatrix &,uint) // E8 A2 5D 03 00
Понятное дело, что у тебя всё ломается...C++:mov esp, ebp // 89 ec pop ebp // 5d
3. Ты, когда прыгаешь назад, заменяешь регистр EAX из-за твоего странного метода прыжка. Он может использоваться где-то в функции... И конкретно в этой функции он запихивается в стек (push eax
) для вызова функции, поэтому этот регистр нужен. Вероятно, это и ломает код.
Раньше тут был код, но я понял, что он не сработает.
Скинь в Cheat Engine функцию чуть выше и чуть ниже, чтобы я понимал, где и как ты хочешь поставить хук.
C++:
// header
using VehicleDoVehicleLights_t = void(__thiscall*)(CVehicle* vehicle, CMatrix* matrix, std::uint32_t flags);
kthook::kthook_simple<VehicleDoVehicleLights_t>(VehicleDoVehicleLightsHook);
static void __fastcall VehicleDoVehicleLightsHooked(const decltype(VehicleDoVehicleLightsHook)& hook, CVehicle* vehicle, CMatrix* matrix, std::uint32_t flags);
// code
VehicleDoVehicleLightsHook.set_dest(0x6ABCB9);
VehicleDoVehicleLightsHook.set_cb(&VehicleDoVehicleLightsHooked);
VehicleDoVehicleLightsHook.install();
void __fastcall VehicleDoVehicleLightsHooked(const decltype(VehicleDoVehicleLightsHook)& hook, CVehicle* vehicle, CMatrix* matrix, std::uint32_t flags)
{
CShadows::StoreShadowToBeRendered(
2,
(RwTexture*)0xC403F4,
&vehicle->m_matrix->pos,
vehicle->m_matrix->up.x,
vehicle->m_matrix->up.y,
vehicle->m_matrix->right.x,
vehicle->m_matrix->right.y,
50,
0,
0,
128,
1.0f,
0,
1.0f,
0x0,
1
);
hook.get_trampoline()(vehicle, matrix, flags);
}