Exemplo n.º 1
0
def pcfg_mower(config):
    print = logging.info
    iprint = logging.warning
    logging.basicConfig(
        level=logging.WARNING if config.quiet else logging.INFO,
        format="%(message)s")

    rules = Rules(config)
    debug = Debug()

    if rules.load_grammar():
        iprint("ERROR: load_grammar", file=sys.stderr)
        return 1

    if rules.load_capitalization():
        iprint("ERROR: load_capitalization", file=sys.stderr)
        return 1

    if rules.load_alpha():
        iprint("ERROR: load_alpha", file=sys.stderr)
        return 1

    if rules.load_terminals_cnt():
        iprint("ERROR: load_terminals_cnt", file=sys.stderr)
        return 1

    guess_cnt = rules.get_guesses_cnt()
    if guess_cnt == -1:
        iprint("ERROR: get_guesses_cnt", file=sys.stderr)
        return 1
    print("Original:\t" + str(guess_cnt))

    if config.output_dir == "":
        # output grammar is not defined
        # just printing password guesses count
        # debug.print_prob_groups(rules)
        return 0

    filter = Filter(rules)

    print("limit: " + str(config.limit))
    print("bs: " + str(config.bs))
    print("cs: " + str(config.cs))
    print("")

    print(config.input_dir)
    cs = config.cs
    print_ruleset_stat(rules, filter, cs, guess_cnt, config.quiet)

    if not config.attack_dict_file == "":
        attack_dictionaries = Attack_dictionaries(config.attack_dict_file)
        if attack_dictionaries.load_dictionaries():
            iprint("ERROR: load_dictionaries", file=sys.stderr)
            return 1
        if attack_dictionaries.assign_probability(rules):
            iprint("ERROR: assign_probability", file=sys.stderr)
            return 1
        rules.append_attack_dictionaries(attack_dictionaries)
        filter.rebuild_size("Alpha")
        guess_cnt = rules.get_guesses_cnt()
        if guess_cnt == -1:
            iprint("ERROR: get_guesses_cnt", file=sys.stderr)
            return 1

        debug.print_appended_dictionary_words(attack_dictionaries,
                                              config.quiet)

    if config.limit == 0:
        print(config.output_dir)
        print_ruleset_stat(rules, filter, cs, guess_cnt, config.quiet)
        rules.save_new_grammar()
        return 0

    while (guess_cnt > config.limit):
        filter.mow_grammar()
        filter.mow_capitalization(cs)
        guess_cnt = rules.get_guesses_cnt()
        cs += config.cs

    print(config.output_dir)
    print_ruleset_stat(rules, filter, cs, guess_cnt, config.quiet)

    if rules.save_new_grammar():
        iprint("ERROR: save_new_grammar", file=sys.stderr)
        return 1

    return 0