#!/bin/bash # Script: crackrar # Description: Tries to crack a password protected rar-file # by using a password-list. # Author: Bodo Akdeniz # http://cypher.xail.net/ # cypher_ab@gmx.de # JID: cypher@amessage.de # ICQ#: 229442050 # Globale Variablen SCRIPTNAME=$(basename $0 .sh) VERSION="0.1" EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_ERROR=2 EXIT_BUG=10 # Variablen für Optionsschalter hier mit Default-Werten vorbelegen VERBOSE=n INPUTFILE="/dev/stdin" OVERWRITEFILES="or" LOGFILE="rar.log" # Funktionen function usage { echo "Usage: $SCRIPTNAME [-h] [-v] [-o] [-l LOGFILE] [-f INPUTFILE] RARFILE..." >&2 echo "Try to extract RARFILE using the lines of INPUTFILE or STDIN as passwords." >&2 echo "" echo "Options:" echo " -h Show this help" echo " -v Switch to verbose mode" echo " -o Overwrite existing files" echo " -l LOGFILE Specify a logfile for the output of rar (default: rar.log)" echo " -f INPUTFILE Read passwords from INPUTFILE, not from STDIN" echo "" echo "You need rar from http://www.rarlab.com/download.htm to use this script!" echo "" echo "Author: Bodo Akdeniz // http://cypher.xail.net/ // cypher_ab@gmx.de" echo "Version: $VERSION" [[ $# -eq 1 ]] && exit $1 || exit $EXIT_FAILURE } function printIfVerbose { if [[ $VERBOSE = y ]]; then echo $1; fi } function printOut { echo $1; } # Die Option -h für Hilfe sollte immer vorhanden sein, die Optionen # -v und -o sind als Beispiele gedacht. -o hat ein Optionsargument; # man beachte das auf "o" folgende ":". while getopts ':f:l:vho' OPTION ; do case $OPTION in v) VERBOSE=y ;; f) INPUTFILE="$OPTARG" ;; h) usage $EXIT_SUCCESS ;; l) LOGFILE="$OPTARG" ;; o) OVERWRITEFILES="o+" ;; \?) echo "Unknown option \"-$OPTARG\"." >&2 usage $EXIT_ERROR ;; :) echo "Option \"-$OPTARG\" needs an argument." >&2 usage $EXIT_ERROR ;; *) echo "You should not see this ;-)" >&2 usage $EXIT_BUG ;; esac done # Verbrauchte Argumente überspringen shift $(( OPTIND - 1 )) # Eventuelle Tests auf min./max. Anzahl Argumente hier if (( $# < 1 )) ; then echo "Give at least one argument." >&2 usage $EXIT_ERROR fi # Schleife über alle Argumente for ARG ; do printIfVerbose "Argument: $ARG" done printIfVerbose "Output of rar is written in $LOGFILE" if [[ $INPUTFILE = "/dev/stdin" ]]; then printIfVerbose "Reading input from STDIN." else printIfVerbose "Reading input from $INPUTFILE." fi PASSWORDS="" while read line do PASSWORDS="$PASSWORDS $line" done < $(echo $INPUTFILE) printIfVerbose "Passwords: $PASSWORDS" SUCCESS="n" FAILURECOUNT=0 for ARG; do printOut "Working on $ARG..." SUCCESS="n" for PASSWORD in $PASSWORDS; do printIfVerbose "Trying \"$PASSWORD\"..." if rar x -p$PASSWORD -$OVERWRITEFILES $ARG &> $LOGFILE; then printIfVerbose "$ARG was extracted with \"$PASSWORD\" as password." SUCCESS="y" break else printIfVerbose "Failed" fi done if [[ $SUCCESS = "y" ]]; then printOut "$ARG was extracted successfully." else printOut "Failed." let "FAILURECOUNT++" fi done if [[ $FAILURECOUNT -eq 0 ]]; then printIfVerbose "Everything's wright :-)" exit $EXIT_SUCCESS else printOut "$FAILURECOUNT archive(s) could not be extracted." exit $EXIT_FAILURE fi