int main(int argc, char *argv[]) { int nattempts = 0, n, best = 1025, threshold = THRESHOLD; u08b_t inbuf[MAX_MSG_LEN], hashbuf[HASHLEN]; u08b_t *iter; srand(time(NULL)); for (;;) { iter = &inbuf[0]; *iter++ = get_random_char(); *iter = '\0'; for (n = 0; n < ITERS_PER_HUNK; ++n) { int nbits; get_hash(inbuf, hashbuf); nbits = get_bit_diff(hashbuf, target, HASHLEN); if (nbits < best) { best = nbits; iter = &inbuf[0]; if (nbits < threshold) { puts("\n\nNew best hash found!"); puts("---BEGIN STRING:---"); puts((char *)inbuf); puts("---END STRING---"); printf("(should be off by %d)\n", nbits); puts("hex digest of computed hash:"); print_hash_hex_digest(hashbuf, HASHLEN); threshold = nbits; puts("Now attempting to upload to the xkcd server..."); sendit(inbuf); puts("Done!"); } } *iter++ = get_random_char(); *iter = '\0'; nattempts++; } printf("\r%d hashes compared. Best so far is %d ", nattempts, best); } return 0; }
/* * ------------------------------------------------------------------------ * EXPAND_ARG * This is a hack of act() in comm.c. I've added some safety guards, * so that missing or invalid $-codes do not crash the server * ------------------------------------------------------------------------ */ void expand_arg( char *buf, const char *format, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, CHAR_DATA *rch ) { static char * const he_she [] = { "it", "he", "she" }; static char * const him_her [] = { "it", "him", "her" }; static char * const his_her [] = { "its", "his", "her" }; const char *someone = "someone"; const char *something = "something"; const char *someones = "someone's"; char fname[MAX_INPUT_LENGTH]; CHAR_DATA *vch = (CHAR_DATA *) arg2; OBJ_DATA *obj1 = (OBJ_DATA *) arg1; OBJ_DATA *obj2 = (OBJ_DATA *) arg2; const char *str; const char *i; char *point; /* * Discard null and zero-length messages. */ if ( format == NULL || format[0] == '\0' ) return; point = buf; str = format; while ( *str != '\0' ) { if ( *str != '$' ) { *point++ = *str++; continue; } ++str; switch ( *str ) { default: bug( "Expand_arg: bad code %d.", *str ); i = " <@@@> "; break; case 'i': one_argument( mob->name, fname ); i = fname; break; case 'I': i = mob->short_descr; break; case 'n': i = someone; if ( ch != NULL && can_see( mob, ch ) ) { one_argument( ch->name, fname ); i = capitalize(fname); } break; case 'N': i = (ch != NULL && can_see( mob, ch ) ) ? ( IS_NPC( ch ) ? ch->short_descr : ch->name ) : someone; break; case 't': i = someone; if ( vch != NULL && can_see( mob, vch ) ) { one_argument( vch->name, fname ); i = capitalize(fname); } break; case 'T': i = (vch != NULL && can_see( mob, vch )) ? ( IS_NPC( vch ) ? vch->short_descr : vch->name ) : someone; break; case 'r': if ( rch == NULL ) rch = get_random_char( mob ); i = someone; if( rch != NULL && can_see( mob, rch ) ) { one_argument( rch->name, fname ); i = capitalize(fname); } break; case 'R': if ( rch == NULL ) rch = get_random_char( mob ); i = ( rch != NULL && can_see( mob, rch ) ) ? ( IS_NPC( ch ) ? ch->short_descr : ch->name ) :someone; break; case 'q': i = someone; if ( mob->mprog_target != NULL && can_see( mob, mob->mprog_target ) ) { one_argument( mob->mprog_target->name, fname ); i = capitalize( fname ); } break; case 'Q': i = (mob->mprog_target != NULL && can_see( mob, mob->mprog_target )) ? ( IS_NPC( mob->mprog_target ) ? mob->mprog_target->short_descr : mob->mprog_target->name ) : someone; break; case 'j': i = he_she [URANGE(0, mob->sex, 2)]; break; case 'e': i = (ch != NULL && can_see( mob, ch )) ? he_she [URANGE(0, ch->sex, 2)] : someone; break; case 'E': i = (vch != NULL && can_see( mob, vch )) ? he_she [URANGE(0, vch->sex, 2)] : someone; break; case 'J': i = (rch != NULL && can_see( mob, rch )) ? he_she [URANGE(0, rch->sex, 2)] : someone; break; case 'X': i = (mob->mprog_target != NULL && can_see( mob, mob->mprog_target)) ? he_she [URANGE(0, mob->mprog_target->sex, 2)] : someone; break; case 'k': i = him_her [URANGE(0, mob->sex, 2)]; break; case 'm': i = (ch != NULL && can_see( mob, ch )) ? him_her [URANGE(0, ch ->sex, 2)] : someone; break; case 'M': i = (vch != NULL && can_see( mob, vch )) ? him_her [URANGE(0, vch ->sex, 2)] : someone; break; case 'K': if ( rch == NULL ) rch = get_random_char( mob ); i = (rch != NULL && can_see( mob, rch )) ? him_her [URANGE(0, rch ->sex, 2)] : someone; break; case 'Y': i = (mob->mprog_target != NULL && can_see( mob, mob->mprog_target )) ? him_her [URANGE(0, mob->mprog_target->sex, 2)] : someone; break; case 'l': i = his_her [URANGE(0, mob ->sex, 2)]; break; case 's': i = (ch != NULL && can_see( mob, ch )) ? his_her [URANGE(0, ch ->sex, 2)] : someones; break; case 'S': i = (vch != NULL && can_see( mob, vch )) ? his_her [URANGE(0, vch ->sex, 2)] : someones; break; case 'L': if ( rch == NULL ) rch = get_random_char( mob ); i = ( rch != NULL && can_see( mob, rch ) ) ? his_her [URANGE(0, rch ->sex, 2)] : someones; break; case 'Z': i = (mob->mprog_target != NULL && can_see( mob, mob->mprog_target )) ? his_her [URANGE(0, mob->mprog_target->sex, 2)] : someones; break; case 'o': i = something; if ( obj1 != NULL && can_see_obj( mob, obj1 ) ) { one_argument( obj1->name, fname ); i = fname; } break; case 'O': i = (obj1 != NULL && can_see_obj( mob, obj1 )) ? obj1->short_descr : something; break; case 'p': i = something; if ( obj2 != NULL && can_see_obj( mob, obj2 ) ) { one_argument( obj2->name, fname ); i = fname; } break; case 'P': i = (obj2 != NULL && can_see_obj( mob, obj2 )) ? obj2->short_descr : something; break; } ++str; while ( ( *point = *i ) != '\0' ) ++point, ++i; } *point = '\0'; return; }
/* --------------------------------------------------------------------- * CMD_EVAL * This monster evaluates an if/or/and statement * There are five kinds of statement: * 1) keyword and value (no $-code) if random 30 * 2) keyword, comparison and value if people > 2 * 3) keyword and actor if isnpc $n * 4) keyword, actor and value if carries $n sword * 5) keyword, actor, comparison and value if level $n >= 10 * *---------------------------------------------------------------------- */ int cmd_eval( sh_int vnum, char *line, int check, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, CHAR_DATA *rch ) { CHAR_DATA *lval_char = mob; CHAR_DATA *vch = (CHAR_DATA *) arg2; OBJ_DATA *obj1 = (OBJ_DATA *) arg1; OBJ_DATA *obj2 = (OBJ_DATA *) arg2; OBJ_DATA *lval_obj = NULL; char *original, buf[MAX_INPUT_LENGTH], code; int lval = 0, oper = 0, rval = -1; original = line; line = one_argument( line, buf ); if ( buf[0] == '\0' || mob == NULL ) return FALSE; /* * If this mobile has no target, let's assume our victim is the one */ if ( mob->mprog_target == NULL ) mob->mprog_target = ch; switch ( check ) { /* * Case 1: keyword and value */ case CHK_RAND: return( atoi( buf ) < number_percent() ); case CHK_MOBHERE: if ( is_number( buf ) ) return( get_mob_vnum_room( mob, atoi(buf) ) ); else return( (bool) (get_char_room( mob, buf) != NULL) ); case CHK_OBJHERE: if ( is_number( buf ) ) return( get_obj_vnum_room( mob, atoi(buf) ) ); else return( (bool) (get_obj_here( mob, buf) != NULL) ); case CHK_MOBEXISTS: return( (bool) (get_char_world( mob, buf) != NULL) ); case CHK_OBJEXISTS: return( (bool) (get_obj_world( mob, buf) != NULL) ); /* * Case 2 begins here: We sneakily use rval to indicate need * for numeric eval... */ case CHK_PEOPLE: rval = count_people_room( mob, 0 ); break; case CHK_PLAYERS: rval = count_people_room( mob, 1 ); break; case CHK_MOBS: rval = count_people_room( mob, 2 ); break; case CHK_CLONES: rval = count_people_room( mob, 3 ); break; case CHK_ORDER: rval = get_order( mob ); break; case CHK_HOUR: rval = time_info.hour; break; default:; } /* * Case 2 continued: evaluate expression */ if ( rval >= 0 ) { if ( (oper = keyword_lookup( fn_evals, buf )) < 0 ) { sprintf( buf, "Cmd_eval: prog %d syntax error(2) '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } one_argument( line, buf ); lval = rval; rval = atoi( buf ); return( num_eval( lval, oper, rval ) ); } /* * Case 3,4,5: Grab actors from $* codes */ if ( buf[0] != '$' || buf[1] == '\0' ) { sprintf( buf, "Cmd_eval: prog %d syntax error(3) '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } else code = buf[1]; switch( code ) { case 'i': lval_char = mob; break; case 'n': lval_char = ch; break; case 't': lval_char = vch; break; case 'r': lval_char = rch == NULL ? get_random_char( mob ) : rch ; break; case 'o': lval_obj = obj1; break; case 'p': lval_obj = obj2; break; case 'q': lval_char = mob->mprog_target; break; default: sprintf( buf, "Cmd_eval: prog %d syntax error(4) '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } /* * From now on, we need an actor, so if none was found, bail out */ if ( lval_char == NULL && lval_obj == NULL ) return FALSE; /* * Case 3: Keyword, comparison and value */ switch( check ) { case CHK_ISPC: return( lval_char != NULL && !IS_NPC( lval_char ) ); case CHK_ISNPC: return( lval_char != NULL && IS_NPC( lval_char ) ); case CHK_ISGOOD: return( lval_char != NULL && IS_GOOD( lval_char ) ); case CHK_ISEVIL: return( lval_char != NULL && IS_EVIL( lval_char ) ); case CHK_ISNEUTRAL: return( lval_char != NULL && IS_NEUTRAL( lval_char ) ); case CHK_ISIMMORT: return( lval_char != NULL && IS_IMMORTAL( lval_char ) ); case CHK_ISCHARM: /* A relic from MERC 2.2 MOBprograms */ return( lval_char != NULL && IS_AFFECTED( lval_char, AFF_CHARM ) ); case CHK_ISFOLLOW: return( lval_char != NULL && lval_char->master != NULL && lval_char->master->in_room == lval_char->in_room ); case CHK_ISACTIVE: return( lval_char != NULL && lval_char->position > POS_SLEEPING ); case CHK_ISDELAY: return( lval_char != NULL && lval_char->mprog_delay > 0 ); case CHK_ISVISIBLE: switch( code ) { default : case 'i': case 'n': case 't': case 'r': case 'q': return( lval_char != NULL && can_see( mob, lval_char ) ); case 'o': case 'p': return( lval_obj != NULL && can_see_obj( mob, lval_obj ) ); } case CHK_HASTARGET: return( lval_char != NULL && lval_char->mprog_target != NULL && lval_char->in_room == lval_char->mprog_target->in_room ); case CHK_ISTARGET: return( lval_char != NULL && mob->mprog_target == lval_char ); default:; } /* * Case 4: Keyword, actor and value */ line = one_argument( line, buf ); switch( check ) { case CHK_AFFECTED: return( lval_char != NULL && IS_SET(lval_char->affected_by, flag_lookup(buf, affect_flags)) ); case CHK_ACT: return( lval_char != NULL && IS_SET(lval_char->act, flag_lookup(buf, act_flags)) ); case CHK_IMM: return( lval_char != NULL && IS_SET(lval_char->imm_flags, flag_lookup(buf, imm_flags)) ); case CHK_OFF: return( lval_char != NULL && IS_SET(lval_char->off_flags, flag_lookup(buf, off_flags)) ); case CHK_CARRIES: if ( is_number( buf ) ) return( lval_char != NULL && has_item( lval_char, atoi(buf), -1, FALSE ) ); else return( lval_char != NULL && (get_obj_carry( lval_char, buf ) != NULL) ); case CHK_WEARS: if ( is_number( buf ) ) return( lval_char != NULL && has_item( lval_char, atoi(buf), -1, TRUE ) ); else return( lval_char != NULL && (get_obj_wear( lval_char, buf ) != NULL) ); case CHK_HAS: return( lval_char != NULL && has_item( lval_char, -1, item_lookup(buf), FALSE ) ); case CHK_USES: return( lval_char != NULL && has_item( lval_char, -1, item_lookup(buf), TRUE ) ); case CHK_NAME: switch( code ) { default : case 'i': case 'n': case 't': case 'r': case 'q': return( lval_char != NULL && is_name( buf, lval_char->name ) ); case 'o': case 'p': return( lval_obj != NULL && is_name( buf, lval_obj->name ) ); } case CHK_POS: return( lval_char != NULL && lval_char->position == position_lookup( buf ) ); case CHK_CLAN: return( lval_char != NULL && lval_char->clan == clan_lookup( buf ) ); case CHK_RACE: return( lval_char != NULL && lval_char->race == race_lookup( buf ) ); case CHK_OBJTYPE: return( lval_obj != NULL && lval_obj->item_type == item_lookup( buf ) ); default:; } /* * Case 5: Keyword, actor, comparison and value */ if ( (oper = keyword_lookup( fn_evals, buf )) < 0 ) { sprintf( buf, "Cmd_eval: prog %d syntax error(5): '%s'", vnum, original ); bug( buf, 0 ); return FALSE; } one_argument( line, buf ); rval = atoi( buf ); switch( check ) { case CHK_VNUM: switch( code ) { default : case 'i': case 'n': case 't': case 'r': case 'q': if( lval_char != NULL && IS_NPC( lval_char ) ) lval = lval_char->pIndexData->vnum; break; case 'o': case 'p': if ( lval_obj != NULL ) lval = lval_obj->pIndexData->vnum; } break; case CHK_HPCNT: if ( lval_char != NULL ) lval = (lval_char->hit * 100)/(UMAX(1,lval_char->max_hit)); break; case CHK_ROOM: if ( lval_char != NULL && lval_char->in_room != NULL ) lval = lval_char->in_room->vnum; break; case CHK_SEX: if ( lval_char != NULL ) lval = lval_char->sex; break; case CHK_LEVEL: if ( lval_char != NULL ) lval = lval_char->level; break; case CHK_ALIGN: if ( lval_char != NULL ) lval = lval_char->alignment; break; case CHK_MONEY: /* Money is converted to silver... */ if ( lval_char != NULL ) lval = lval_char->gold + (lval_char->silver * 100); break; case CHK_OBJVAL0: if ( lval_obj != NULL ) lval = lval_obj->value[0]; break; case CHK_OBJVAL1: if ( lval_obj != NULL ) lval = lval_obj->value[1]; break; case CHK_OBJVAL2: if ( lval_obj != NULL ) lval = lval_obj->value[2]; break; case CHK_OBJVAL3: if ( lval_obj != NULL ) lval = lval_obj->value[3]; break; case CHK_OBJVAL4: if ( lval_obj != NULL ) lval = lval_obj->value[4]; break; case CHK_GRPSIZE: if( lval_char != NULL ) lval = count_people_room( lval_char, 4 ); break; default: return FALSE; } return( num_eval( lval, oper, rval ) ); }