Veteran Member
Join Date: May 2012
Location: Homeless
02-24-2021
, 06:13
Re: [L4D2] "ZombieAbortControl" windows singature broken
#2
Untested:
PHP Code:
\ x55 \ x8B \ xEC \ x83 \ xEC \ x30 \ x56 \ x8B \ xF1 \ xE8 \ x2A \ x2A \ x2A \ x2A \ x83 \ xF8 \ x03 \ x0F \ x85
/* 55 8B EC 83 EC 30 56 8B F1 E8 ? ? ? ? 83 F8 03 0F 85 */
Both functions look almost identical in IDA.
Linux:
Spoiler
PHP Code:
int __cdecl CTerrorPlayer :: PlayerZombieAbortControl ( CTerrorPlayer * this )
{
int result ; // eax
CBaseEntity * v2 ; // esi
float * v3 ; // esi
unsigned int v4 ; // edx
char * v5 ; // ecx
char * v6 ; // eax
int v7 ; // eax
long double v8 ; // fst7
unsigned int v9 ; // eax
int v10 ; // ecx
char * v11 ; // edx
int v12 ; // eax
int v13 [ 3 ]; // [esp+24h] [ebp-44h] BYREF
CBaseEntity * v14 ; // [esp+30h] [ebp-38h]
int v15 ; // [esp+34h] [ebp-34h]
int v16 ; // [esp+38h] [ebp-30h]
int v17 [ 3 ]; // [esp+3Ch] [ebp-2Ch] BYREF
char v18 [ 12 ]; // [esp+48h] [ebp-20h] BYREF
int v19 [ 3 ]; // [esp+54h] [ebp-14h] BYREF
result = CBaseEntity :: GetTeamNumber ( this );
if ( result == 3 )
{
if ( (*( unsigned __int8 (**)( void ))(*( _DWORD *) this + 1368 ))() )
{
if ( ( unsigned __int8 ) CTerrorGameRules :: HasPlayerControlledZombies ( this ) )
{
result = CTerrorPlayer :: WarpGhostToInitialPosition ( this , 0 );
}
else
{
v13 [ 0 ] = - 971228160 ;
v13 [ 1 ] = 2 ;
v13 [ 2 ] = 0 ;
v14 = 0 ;
v15 = 0 ;
v16 = 0 ;
result = ForEachTerrorPlayer < HighestFlowDistance >( v13 );
v2 = v14 ;
if ( v14 )
{
if ( (*(( _BYTE *) v14 + 333 ) & 8 ) != 0 )
CBaseEntity :: CalcAbsolutePosition ( v14 );
v17 [ 0 ] = *(( _DWORD *) v2 + 184 );
v17 [ 1 ] = *(( _DWORD *) v2 + 185 );
v17 [ 2 ] = *(( _DWORD *) v2 + 186 );
if ( !( unsigned __int8 ) FindNearbySpawnSpot ( this , ( Vector *) v17 , 3 , 0 , 100.0 ) )
FindNearbySpawnSpot ( this , ( Vector *) v17 , 3 , 0 , 1000.0 );
CBaseEntity :: SetAbsOrigin ( this , (const Vector *) v17 );
if ( (*(( _BYTE *) this + 333 ) & 8 ) != 0 )
CBaseEntity :: CalcAbsolutePosition ( this );
v3 = ( float *) v14 ;
if ( (*(( _BYTE *) v14 + 333 ) & 8 ) != 0 )
CBaseEntity :: CalcAbsolutePosition ( v14 );
*( float *) v19 = v3 [ 184 ] - *(( float *) this + 184 );
*( float *)& v19 [ 1 ] = v3 [ 185 ] - *(( float *) this + 185 );
*( float *)& v19 [ 2 ] = v3 [ 186 ] - *(( float *) this + 186 );
VectorAngles ( v19 , v18 );
result = CBasePlayer :: SnapEyeAngles ( this , v18 );
}
}
}
else
{
result = (*( int ( __cdecl **)( CTerrorPlayer *))(*( _DWORD *) this + 300 ))( this );
if ( ( _BYTE ) result && *(( _BYTE *) this + 13028 ) )
{
v4 = *(( _DWORD *) this + 3127 );
*(( _BYTE *) this + 16385 ) = 1 ;
v5 = ( char *) g_pEntityList ;
*(( _DWORD *) this + 4097 ) = *(( _DWORD *) this + 64 );
if ( v4 != - 1 )
{
v6 = & v5 [ 16 * ( v4 & 0xFFF )];
if ( *(( _DWORD *) v6 + 2 ) == v4 >> 12 )
{
v7 = *(( _DWORD *) v6 + 1 );
if ( v7 )
{
v8 = (( long double ( __cdecl *)(int))*( _DWORD *)(*( _DWORD *) v7 + 836 ))( v7 );
v9 = *(( _DWORD *) this + 3127 );
v10 = 0 ;
*(( float *) this + 4098 ) = v8 ;
if ( v9 != - 1 )
{
v11 = ( char *) g_pEntityList + 16 * ( v9 & 0xFFF );
if ( *(( _DWORD *) v11 + 2 ) == v9 >> 12 )
v10 = *(( _DWORD *) v11 + 1 );
}
v12 = _mm_cvtsi128_si32 (( __m128i ) 0LL );
if ( *( float *)( v10 + 1112 ) > 0.0 )
v12 = *( _DWORD *)( v10 + 1108 );
*(( _DWORD *) this + 4099 ) = v12 ;
}
}
}
result = CCSPlayer :: State_Transition ( this , 8 );
}
}
}
return result ;
}
Windows:
Spoiler
PHP Code:
int __thiscall sub_1031FBF0 ( int this )
{
int result ; // eax
float * v3 ; // edi
int v4 ; // eax
int v5 ; // eax
int v6 ; // xmm0_4
int v7 [ 3 ]; // [esp+10h] [ebp-30h] BYREF
int v8 [ 3 ]; // [esp+1Ch] [ebp-24h] BYREF
int v9 [ 3 ]; // [esp+28h] [ebp-18h] BYREF
int v10 [ 3 ]; // [esp+34h] [ebp-Ch] BYREF
result = sub_10053250 ( this );
if ( result == 3 )
{
if ( (*( unsigned __int8 ( __thiscall **)(int))(*( _DWORD *) this + 1364 ))( this ) )
{
if ( ( unsigned __int8 ) sub_102D3370 () )
{
result = sub_10315F80 ( 0 );
}
else
{
v7 [ 0 ] = - 971228160 ;
v7 [ 1 ] = 2 ;
v7 [ 2 ] = 0 ;
v8 [ 0 ] = 0 ;
v8 [ 1 ] = 0 ;
v8 [ 2 ] = 0 ;
result = sub_1025C250 ( v7 );
v3 = ( float *) v8 [ 0 ];
if ( v8 [ 0 ] )
{
if ( (*( _DWORD *)( v8 [ 0 ] + 312 ) & 0x800 ) != 0 )
sub_10059E00 ( v8 [ 0 ]);
v10 [ 0 ] = (int) v3 [ 179 ];
v10 [ 1 ] = (int) v3 [ 180 ];
v10 [ 2 ] = (int) v3 [ 181 ];
if ( !( unsigned __int8 ) sub_102B2500 ( this , v10 , 3 , 0 , 100.0 ) )
sub_102B2500 ( this , v10 , 3 , 0 , 1000.0 );
sub_100629B0 ( v10 );
if ( (*( _DWORD *)( this + 312 ) & 0x800 ) != 0 )
sub_10059E00 ( this );
if ( (( _DWORD ) v3 [ 78 ] & 0x800 ) != 0 )
sub_10059E00 ( v3 );
*( float *) v9 = v3 [ 179 ] - *( float *)( this + 716 );
*( float *)& v9 [ 1 ] = v3 [ 180 ] - *( float *)( this + 720 );
*( float *)& v9 [ 2 ] = v3 [ 181 ] - *( float *)( this + 724 );
sub_104DAA30 ( v9 , v8 );
result = sub_10167930 ((int) v8 );
}
}
}
else
{
result = (*( int ( __thiscall **)(int))(*( _DWORD *) this + 296 ))( this );
if ( ( _BYTE ) result && *( _BYTE *)( this + 13048 ) )
{
*( _DWORD *)( this + 16408 ) = *( _DWORD *)( this + 236 );
*( _BYTE *)( this + 16405 ) = 1 ;
if ( sub_102B0830 ( this ) )
{
v4 = sub_102B0830 ( this );
*( float *)( this + 16412 ) = (( double ( __thiscall *)(int))*( _DWORD *)(*( _DWORD *) v4 + 832 ))( v4 );
v5 = sub_102B0830 ( this );
v6 = 0 ;
if ( *( float *)( v5 + 1092 ) > 0.0 )
v6 = *( _DWORD *)( v5 + 1088 );
*( _DWORD *)( this + 16416 ) = v6 ;
}
result = sub_10247710 (( _DWORD *) this , 8 );
}
}
}
return result ;
}
__________________