Getting player index from THIS pointer inside AirAccelerate hook

Please post any questions about developing your plugin here. Please use the search function before posting!
InvisibleSoldiers
Senior Member
Posts: 114
Joined: Fri Mar 15, 2019 6:08 am

Getting player index from THIS pointer inside AirAccelerate hook

Postby InvisibleSoldiers » Sun Dec 08, 2019 11:03 pm

Hooked CGameMovement::AirAccelerate
https://github.com/ValveSoftware/source ... .cpp#L1707

THIS contains pointer to CBasePlayer, but how i can get index from it.
'objdump -d server_srv.so' on Linux:

Syntax: Select all

00340980 <_ZN13CGameMovement13AirAccelerateER6Vectorff>:
340980: 55 push %ebp
340981: 89 e5 mov %esp,%ebp
340983: 56 push %esi
340984: 53 push %ebx
340985: 83 ec 30 sub $0x30,%esp
340988: 8b 5d 08 mov 0x8(%ebp),%ebx
34098b: 8b 75 0c mov 0xc(%ebp),%esi
34098e: 8b 43 04 mov 0x4(%ebx),%eax
340991: 80 b8 28 0a 00 00 00 cmpb $0x0,0xa28(%eax)

After analyzing it i concluded that pointer to player is:

Syntax: Select all

%esp + 0x8 + 0x4

or

Syntax: Select all

stack_data[0](%esp  + 0x8) + 0x4(int pointer)

becase

Syntax: Select all

cmpb   $0x0,0xa28(%eax)
is

Syntax: Select all

if (player->pl.deadflag)


But in both cases i got the error

Syntax: Select all

ValueError: Conversion from "Pointer" (<_memory.Pointer object at ?>) to "Index" failed.


My Python code:

Syntax: Select all

from memory import Convention
from memory import DataType
from memory import make_function
from memory import find_binary
from memory.hooks import PreHook
from memory import Pointer
from entities.helpers import index_from_pointer

SERVER = find_binary('server')
AIRACCELERATE = SERVER['_ZN13CGameMovement13AirAccelerateER6Vectorff'].make_function(
Convention.THISCALL,
(DataType.POINTER, DataType.POINTER, DataType.FLOAT, DataType.FLOAT),
DataType.VOID
)

@PreHook(AIRACCELERATE)
def pre_airaccelerate(stack_data):
pointer = Pointer(stack_data.registers.esp.address.address + 0x8 + 0x4)
pindex = index_from_pointer(pointer)
pindex = index_from_pointer(stack_data[0] + 0x4)


Yes, i can get the player index from @OnPlayerRunCommand because the code is consistently, RunCommand > ProcessMovement > AirMove > AirAccelerate but it's ugly because there is THIS pointer where a player pointer stored.
User avatar
L'In20Cible
Project Leader
Posts: 1533
Joined: Sat Jul 14, 2012 9:29 pm
Location: Québec

Re: Getting player index from THIS pointer inside AirAccelerate hook

Postby L'In20Cible » Sun Dec 08, 2019 11:31 pm

InvisibleSoldiers wrote:THIS contains pointer to CBasePlayer, but how i can get index from it.

Try:

Syntax: Select all

stack_data[0].get_pointer(4)
InvisibleSoldiers
Senior Member
Posts: 114
Joined: Fri Mar 15, 2019 6:08 am

Re: Getting player index from THIS pointer inside AirAccelerate hook

Postby InvisibleSoldiers » Mon Dec 09, 2019 1:47 pm

L'In20Cible wrote:
InvisibleSoldiers wrote:THIS contains pointer to CBasePlayer, but how i can get index from it.

Try:

Syntax: Select all

stack_data[0].get_pointer(4)

Ok. It works... :confused:
User avatar
L'In20Cible
Project Leader
Posts: 1533
Joined: Sat Jul 14, 2012 9:29 pm
Location: Québec

Re: Getting player index from THIS pointer inside AirAccelerate hook

Postby L'In20Cible » Mon Dec 09, 2019 6:55 pm

InvisibleSoldiers wrote:
L'In20Cible wrote:
InvisibleSoldiers wrote:THIS contains pointer to CBasePlayer, but how i can get index from it.

Try:

Syntax: Select all

stack_data[0].get_pointer(4)

Ok. It works... :confused:

Yeah, because this + 4 is a pointer to CGameMovement::pl, which contains CBasePlayer pointer, but isn't by itself as it is just a pointer inside the this structure. So, to retrieve that pointer, you extract the pointer at that address using get_pointer.

Return to “Plugin Development Support”

Who is online

Users browsing this forum: No registered users and 18 guests