#!/usr/bin/perl 
#
# 
# This program is Copyright the grugq, 2000 
#	
#	Greets to:
#	mammon_, _dose, Epic (and lil'Epic :), augustus_p, Anewbiz_,
#	the +HCU Linux,	Volatility, the Immortal Descendants, Darwin,
#	The whole iST kREW, and mad props to Dylan. 
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

use strict;
use Getopt::Std;
my $version = 'v0.7f'; # our version
my $dasm  = 'dasm'; # what dasm is installed as
my $oob  = 'oob'; # what is objdump-output-beautifier installed as
my( $target, $return, $dir );
use vars qw/$opt_t $opt_v/;

# help out the luser
sub help  {

	print " ..ooOO reqt $version OOoo.. \n";
	print "                            \n";
	print "        by                  \n";
	print "           the grugq        \n";
	print " Usage:                     \n";
	print "       req-t < binary > [-v]\n";
	print "                            \n";
	exit(0);
}

# get the header information
sub gank_header {

	if( system(" readelf -a $target > $dir/${target}.hed ") == 0) {
		$return = "succeeded";
	}
	else { $return = "failed"; }
}

# get the strings
sub gank_strings {
	
	if( system(" strings $target > $dir/${target}.str ") == 0) {
		$return = "succeeded";
	}
	else { $return = "failed"; }
}

# try and get the symbol table
sub gank_nm {
	
	if( system(" nm $target > $dir/${target}.sym ") == 0) {
		$return = "succeeded";
	}
	else { $return = "failed"; }
}

# try and disassemble
sub gank_disasm {
	open( IN, "readelf -e $target |");
	while(<IN>) {
		last if(/\.text/);
	}
	my @gunk = split(/\s+/, $_ );
	my $off = hex($gunk[5]);
	my $end = hex($gunk[6]);
	close(IN);

	if(system("ndisasm -u -e $off $target > $dir/${target}.asm") == 0) {
		$return = 'succeeded';
	}
	else {
		$return = 'failed';
	}
}

# get a hexdump
sub gank_hex {
	
	if( system(" objdump -s $target > $dir/${target}.hex ") == 0) {
		$return = "succeeded";
	}
	else { $return = "failed"; }
}
# get a dasm
sub gank_dasm {
	
	if( system(" $dasm $target  $dir/${target}.S >/dev/null ") == 0) {
		$return = "succeeded";
	}
	else { $return = "failed"; }
}

# get oobed 
sub gank_oob {
	
	if( system(" $oob $target > $dir/${target}.oob ") == 0) {
		$return = "succeeded";
	}
	else { $return = "failed"; }
}

# get_args
getopt('t');
$target = $opt_t;

#######################################
#
getopt('v');
print "\$opt_v : $opt_v \n";
#######################################
if($target eq "") {
	&help; 
}
$dir = "${target}-req";
mkdir($dir, 755);
system("chmod 755 $dir"); # I can't get mkdir to work... but kapt'n kludge strikes again!

print "Getting headers.... [ "; gank_header($target); print "$return ] \n";
if($opt_v) { print "\t  headers saved as: $dir/${target}.hed \n"; }

print "Getting symbols.... [ "; gank_nm($target); print "$return ] \n";
if($opt_v) { print "\t  symbols saved as: $dir/${target}.sym \n"; }

print "Getting strings.... [ "; gank_strings($target); print "$return ] \n";
if($opt_v) { print "\t  strings saved as: $dir/${target}.str \n"; }

print "Getting beautified objdump.... [ "; gank_oob($target); print "$return ] \n";
if($opt_v) { print "\t  beatiful objdump saved as: $dir/${target}.oob \n"; }

print "Getting disasm... ["; gank_disasm($target); print "$return ]\n";
if($opt_v) { print "\t  disasm  saved as: $dir/${target}.asm \n"; }

print "Getting hexdump... ["; gank_hex($target); print "$return ]\n";
if($opt_v) { print "\t  hexdump saved as: $dir/${target}.hex \n"; }

print "Getting dasm... ["; gank_dasm($target); print "$return ]\n";
if($opt_v) { print "\t  dasm saved as: $dir/${target}.S \n"; }
