PHP Code:
void *__cdecl sub_816FE18(int a1, char a2, __int16 a3, int a4, int a5)
{
const char *v5; // edx@2
__int32 v6; // eax@4
int v7; // edx@4
int v8; // esi@4
signed int v9; // edx@7
const char *v10; // ebx@9
void *result; // eax@15
int v12; // eax@35
int v13; // [sp+18h] [bp-430h]@13
int v14; // [sp+18h] [bp-430h]@24
char *v15; // [sp+18h] [bp-430h]@40
signed int v16; // [sp+34h] [bp-414h]@7
signed int v17; // [sp+38h] [bp-410h]@8
char v18; // [sp+3Ch] [bp-40Ch]@42
if ( !sub_813C0C4(a1, a2, a3, a4, a5, v13e7844c, v13e78450, v13e78454) )
return (void *)sub_8122B2E(15, "SV_AuthorizeIpPacket: not from authorize server\n");
v5 = "%s%s\t\n" + 6;
if ( *(_DWORD *)(4 * v8879a40 + 0x8879A84) > 1 )
v5 = *(const char **)(*(_DWORD *)(4 * v8879a40 + 0x8879AA4) + 4);
v6 = __strtol_internal(v5, 0, 10, 0);
v8 = 0;
v7 = 0;
while ( v6 != *(_DWORD *)(v7 + 333857868) )
{
++v8;
v7 += 80;
if ( v8 == 1024 )
return (void *)sub_8122B2E(15, "SV_AuthorizeIpPacket: challenge not found\n");
}
*(_DWORD *)(80 * v8 + 0x13E64454) = v90b4f84;
v9 = *(_DWORD *)(4 * v8879a40 + 0x8879A84);
v16 = 136494744;
if ( v9 > 2 )
{
v16 = *(_DWORD *)(*(_DWORD *)(4 * v8879a40 + 0x8879AA4) + 8);
v17 = 136494744;
if ( v9 <= 3 )
{
LABEL_9:
v10 = "%s%s\t\n" + 6;
if ( v9 <= 5 )
goto LABEL_10;
goto LABEL_17;
}
}
else
{
v17 = 136494744;
if ( v9 <= 3 )
goto LABEL_9;
}
v17 = *(_DWORD *)(*(_DWORD *)(4 * v8879a40 + 0x8879AA4) + 12);
v10 = "%s%s\t\n" + 6;
if ( v9 > 5 )
LABEL_17:
v10 = *(const char **)(*(_DWORD *)(4 * v8879a40 + 0x8879AA4) + 20);
LABEL_10:
if ( !sub_81AAAE2(v16, "deny") )
{
if ( !v17 || !*(_BYTE *)v17 )
goto LABEL_45;
if ( !sub_81AAAE2(v17, "CLIENT_UNKNOWN_TO_AUTH") || !sub_81AAAE2(v17, 136518348) )
{
v13 = (int)"needcdkey";
goto LABEL_14;
}
if ( sub_81AAAE2(v17, "INVALID_CDKEY") )
{
sub_81AAAE2(v17, "BANNED_CDKEY");
v13 = (int)"error\nEXE_ERR_BAD_CDKEY";
}
else
{
LABEL_45:
v13 = (int)"error\nEXE_ERR_CDKEY_IN_USE";
}
LABEL_14:
sub_813D086(
1,
*(_DWORD *)(80 * v8 + 0x13E64438),
*(_DWORD *)(80 * v8 + 0x13E6443C),
*(_DWORD *)(80 * v8 + 0x13E64440),
*(_DWORD *)(80 * v8 + 0x13E64444),
*(_DWORD *)(80 * v8 + 0x13E64448),
v13);
return memset((void *)(80 * v8 + 333857848), 0, 0x50u);
}
if ( strcmp((const char *)(80 * v8 + 333857892), v10) )
{
sub_8122B2E(
15,
"rejecting connection due to mismatched GUID: expected \"%s\", got \"%s\"\n",
80 * v8 + 333857892,
v10);
v14 = (int)"error\nEXE_ERR_BAD_CDKEY";
LABEL_25:
sub_813D086(
1,
*(_DWORD *)(80 * v8 + 0x13E64438),
*(_DWORD *)(80 * v8 + 0x13E6443C),
*(_DWORD *)(80 * v8 + 0x13E64440),
*(_DWORD *)(80 * v8 + 0x13E64444),
*(_DWORD *)(80 * v8 + 0x13E64448),
v14);
return memset((void *)(80 * v8 + 333857848), 0, 0x50u);
}
if ( !sub_81AAAE2(v16, "demo") )
{
if ( !(unsigned __int8)sub_819E7C0("fs_restrict") )
{
v14 = (int)"error\nEXE_ERR_NOT_A_DEMO_SERVER";
goto LABEL_25;
}
goto LABEL_35;
}
result = (void *)sub_81AAAE2(v16, "accept");
if ( result )
{
if ( v17 && *(_BYTE *)v17 )
{
sprintf(&v18, "error\n%s", v17);
v15 = &v18;
}
else
{
v15 = "error\nEXE_ERR_BAD_CDKEY";
}
sub_813D086(
1,
*(_DWORD *)(80 * v8 + 0x13E64438),
*(_DWORD *)(80 * v8 + 0x13E6443C),
*(_DWORD *)(80 * v8 + 0x13E64440),
*(_DWORD *)(80 * v8 + 0x13E64444),
*(_DWORD *)(80 * v8 + 0x13E64448),
v15);
return memset((void *)(80 * v8 + 333857848), 0, 0x50u);
}
if ( !*(_DWORD *)(80 * v8 + 0x13E64460) )
{
LABEL_35:
v12 = sub_81A9F8A("challengeResponse %i", *(_DWORD *)(80 * v8 + 0x13E6444C));
result = (void *)sub_813D086(
1,
*(_DWORD *)(80 * v8 + 0x13E64438),
*(_DWORD *)(80 * v8 + 0x13E6443C),
*(_DWORD *)(80 * v8 + 0x13E64440),
*(_DWORD *)(80 * v8 + 0x13E64444),
*(_DWORD *)(80 * v8 + 0x13E64448),
v12);
}
return result;
}
You could hook all the calls in this function to sub_81AAAE2. (which compares the state with deny or accept)