use File::Basename; use File::Spec; use Cwd; use File::Path; use File::Find; if ($ARGV[0] =~ /^-h(.*)/i){ print "Usage:: jarp.pl []"; exit 1; } my $java_home = $ENV{JAVA_HOME}; my $classdir = 'classes'; my $jasmdir = 'jasm'; # perform validations die "Environment variable JAVA_HOME not defined." if not defined $java_home; if (!-d $classdir){ my $jarfile = $ARGV[0]; die "Not a file: $jarfile" if !-f $jarfile; my $jarpath = File::Spec->rel2abs($jarfile); mkpath $classdir or die "Cannot create temporary directory $classdir: $!"; my $curdir = getcwd; chdir $classdir or die "Cannot chdir to $classdir: $!"; print "Unjarring $jarpath in directory $classdir ...\n"; `$java_home/bin/jar xf $jarpath`; print "... done.\n"; chdir $curdir or die "Cannot chdir to $curdir: $!"; } else { print "Found directory $classdir. Won't unjar $jarfile.\n"; } my @classes = (); my $dirlist = []; print "Making list of classes ...\n"; find(\&visit_file, $classdir); print "... done.\n"; for my $dir (@$dirlist){ print $dir, "\n"; } mkpath($dirlist); my $index = 0; for my $class (@classes){ my $filename = "$jasmdir/$class"; $filename =~ s/\./\//g; $filename .= ".jasm"; `$java_home/bin/javap -classpath $classdir -c $class > $filename`; print "[$index] Disassembled: $filename\n"; ++$index; } sub visit_file { if (-f $_){ if ($File::Find::name =~ m!$classdir/(.*).class!){ my $class = $1; $class =~ s/\//\./g; push @classes, $class; } } elsif (-d $_){ if ($File::Find::name =~ m!$classdir/(.*)!){ my $dir = "$jasmdir/$1"; push @$dirlist, $dir if not grep { $_ eq $dir } @$dirlist; } } }