#!/usr/bin/perl $dllname=uc($ARGV[0]); $libname=$dllname; $libname=~s/\.dll/.lib/i; $mapname=$dllname; $mapname=~s/\.dll/.map/i; $base=$dllname; $base=~s/\.dll//i; system("DUMPBIN /all $dllname > fl") && die "cannot DUMPBIN dll $dllname"; system("DUMPBIN /all $libname > fl2") && die "cannot DUMPBIN lib $libname"; open(DLL, "$mapname") || die "cannot open $mapname"; open(TEXT, "<$dllname") || die "cannot open $dllname"; binmode TEXT; @s=stat(TEXT); #print "len $s[7]\n"; read TEXT, $img, $s[7]; #sysread TEXT, $img, $s[7]; #print "read len ", length($img), "\n"; while() { last if (/ordinal hint/); } while() { next if (/^\s*$/); last if (/SECTION/); ($ord, $addr, $name)=split; $addr=hex($addr); $addr[$ord]=$addr; } while() { last if (/ordinal\s*name/); } while() { next if (/^\s*$/); last if (/Summary/); /^\s+([0-9]+)\s+[^ ]+ \([^(]* ([^ (]+)\(/; ($ord, $name)=($1, $2); $name=$base . "::" . $name; $addr=$addr[$ord]; next if ($addr<=0 || $name=~/^\s*$/); $code=substr($img, $addr, 5); #print "addr $addr code $code\n"; ($op, $jaddr)=unpack("Cl", $code); #printf "%x\n", $op; if ($op==0xe9) { print OUT 1, "\t"; $jaddr+=$addr+5; $jaddr-=hex("1000"); printf OUT "%x", $jaddr; print OUT "\t", $name, "\n"; $name.="JMP"; } $addr-=hex("1000"); print OUT 1, "\t"; printf OUT "%x", $addr; print OUT "\t", $name, "\n"; } close(DLL); close(LIB); close(OUT);