Skip to content

Commit

Permalink
Fixed Warcraft 3 ICON SWITCH hack
Browse files Browse the repository at this point in the history
  • Loading branch information
HarpyWar committed Apr 29, 2012
1 parent b989d26 commit 84811bc
Showing 1 changed file with 93 additions and 0 deletions.
93 changes: 93 additions & 0 deletions pvpgn/src/bnetd/handle_anongame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ namespace bnetd
/* 0x08 */ static int _client_anongame_profile_clan(t_connection * c, t_packet const * const packet);
/* 0x09 */ static int _client_anongame_get_icon(t_connection * c, t_packet const * const packet);
/* 0x0A */ static int _client_anongame_set_icon(t_connection * c, t_packet const * const packet);
static int check_user_icon(t_account * account, const char * user_icon);

/* misc functions used by _client_anongame_tournament() */
static unsigned int _tournament_time_convert(unsigned int time);
Expand Down Expand Up @@ -539,11 +540,45 @@ static int _client_anongame_get_icon(t_connection * c, t_packet const * const pa
return 0;
}





//static int _client_anongame_set_icon(t_connection * c, t_packet const * const packet)
//{
// //BlacKDicK 04/20/2003
// unsigned int desired_icon;
// char user_icon[5];
//
// /*FIXME: In this case we do not get a 'count' but insted of it we get the icon
// that the client wants to set.'W3H2' for an example. For now it is ok, since they share
// the same position on the packet*/
// desired_icon=bn_int_get(packet->u.client_findanongame.count);
// user_icon[4]=0;
// if (desired_icon==0){
// std::strcpy(user_icon,"NULL");
// eventlog(eventlog_level_info,__FUNCTION__,"[%d] Set icon packet to DEFAULT ICON [%4.4s]",conn_get_socket(c),user_icon);
// }else{
// std::memcpy(user_icon,&desired_icon,4);
// eventlog(eventlog_level_info,__FUNCTION__,"[%d] Set icon packet to ICON [%s]",conn_get_socket(c),user_icon);
// }
//
// account_set_user_icon(conn_get_account(c),conn_get_clienttag(c),user_icon);
// //FIXME: Still need a way to 'refresh the user/channel'
// //_handle_rejoin_command(conn_get_account(c),"");
// /* ??? channel_update_userflags() */
// conn_update_w3_playerinfo(c);
//
// channel_rejoin(c);
// return 0;
//}
static int _client_anongame_set_icon(t_connection * c, t_packet const * const packet)
{
//BlacKDicK 04/20/2003
unsigned int desired_icon;
char user_icon[5];
t_account * account;
t_clienttag ctag;

/*FIXME: In this case we do not get a 'count' but insted of it we get the icon
that the client wants to set.'W3H2' for an example. For now it is ok, since they share
Expand All @@ -558,6 +593,15 @@ static int _client_anongame_set_icon(t_connection * c, t_packet const * const pa
eventlog(eventlog_level_info,__FUNCTION__,"[%d] Set icon packet to ICON [%s]",conn_get_socket(c),user_icon);
}

account = conn_get_account(c);

if (check_user_icon(account,user_icon) == 0)
{
eventlog(eventlog_level_info,__FUNCTION__,"[%s] \"%s\" ICON SWITCH hack attempt, icon set to default ", conn_get_username(c),user_icon);
std::strcpy(user_icon,"NULL"); // set icon to default
conn_set_state(c,conn_state_destroy); // kill user session
}

account_set_user_icon(conn_get_account(c),conn_get_clienttag(c),user_icon);
//FIXME: Still need a way to 'refresh the user/channel'
//_handle_rejoin_command(conn_get_account(c),"");
Expand All @@ -568,6 +612,55 @@ static int _client_anongame_set_icon(t_connection * c, t_packet const * const pa
return 0;
}

// check user for illegal icon
static int check_user_icon(t_account * account, const char * user_icon)
{
unsigned int i, len;
char temp_str[2];
char user_race;
int number;

len = std::strlen(user_icon);
if (len != 4)
eventlog(eventlog_level_error,__FUNCTION__,"got invalid user icon '%s'",user_icon);

for (i=0; i<len && i < 2; i++)
temp_str[i] = user_icon[i];

number = temp_str[0]-'0';
user_race = temp_str[1];


int race[]={W3_RACE_RANDOM,W3_RACE_HUMANS,W3_RACE_ORCS,W3_RACE_UNDEAD,W3_RACE_NIGHTELVES,W3_RACE_DEMONS};
char race_char[6] = {'R','H','O','U','N','D'};
int icon_pos[5] = {2,3,4,5,6};
int icon_req_wins[5] = {25, 150, 350, 750, 1500};

for (int i = 0; i < sizeof(race_char); i++)
{
if (user_race == race_char[i])
{
for (int j = 0; j < sizeof(icon_pos); j++)
{
if (number == icon_pos[j])
{
// compare account race wins and require wins
if (account_get_racewins( account, race[i], account_get_ll_clienttag(account) ) >= icon_req_wins[j])
return 1;

return 0;
}
}
}
}
return 0;
}






static int _client_anongame_infos(t_connection * c, t_packet const * const packet)
{
t_packet * rpacket;
Expand Down

0 comments on commit 84811bc

Please sign in to comment.