File: ildasm-monodis

package info (click to toggle)
cli-common 0.10
  • links: PTS, VCS
  • area: main
  • in suites: buster, sid
  • size: 284 kB
  • sloc: perl: 1,198; sh: 103; makefile: 44
file content (136 lines) | stat: -rwxr-xr-x 2,473 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/perl

#
# Setup
#

# Directives
use strict;
use warnings;

# Modules
use Getopt::Long;

#
# Variables
#

# Filenames
my $assemblyref;

# Get the mode
GetOptions(
	   "assemblyref!" => \$assemblyref,
	   );

# Get the filenames
my $dll_filename = shift;

usage() if (!defined $dll_filename);

# Figure out what to do
if ($assemblyref)
{
    parse_assemblyref($dll_filename);
}
else
{
    # As per meeby, do assemblyref
    parse_assemblyref($dll_filename);
}

#
# Create a pipe to the 'ildasm' program and give it the given
# DLL. Then, take the results, parse them, and write it out to stdout.
#

sub parse_assemblyref
{
    # Get the parameters
    my $dll_filename = shift;

    # Open the pipe
    open PIPE, "/usr/bin/ildasm $dll_filename |"
	or die "Cannot open /usr/bin/ildasm $dll_filename ($!)";
    
    # Print out the header
    print "AssemblyRef Table\n";
    
    # Go through the results
    my $count = 0;
    while (<PIPE>)
    {
	# Clean up the line
	chomp;
	
	# Check for assembly ref
	if (/^\.assembly extern (.*?)$/)
	{
	    # We have an assembly reference
	    my $name = $1;
	    my $version = undef;
	    my $key = "\tZero sized public key";
	    $count++;

	    # On occasion, the name has quotes around it, but monodis
	    # doesn't.
	    $name =~ s/\'//g;
	    $name =~ s/\"//g;

	    # Go through and parse the rest of the variables until we
	    # get to a } which signals the end of the block.
	    while (<PIPE>)
	    {
		# Stop if we get a }
		last if /^\}/;
		s/^\s+//;

		# Check for the keys
		if (/\.ver (\d+):(\d+):(\d+):(\d+)/)
		{
		    # Make it look like mono
		    $version = "$1.$2.$3.$4";
		    next;
		}

		# Check for public key
		if (/\.publickeytoken = \((.*?)\)/)
		{
		    # Monodis adds a space at the end of this next line
		    $key = "\tPublic Key:\n0x00000000: $1 ";
		}
	    }

	    # Emit it
	    print join("\n",
		       "$count: Version=$version",
		       "\tName=$name",
		       $key,
		       ), "\n";
	}
    }
    
    # Mono also has an extra space at the end
    print "\n";

    # Close the pipe
    close PIPE;
}

#
# Usage. Just your typical complain function that automatically exits
# out of perl after complaining.
#

sub usage
{
    print STDERR join("\n",
		      "USAGE: $0 [options] /path/to/something.dll",
		      "",
		      "Options:",
		      sprintf("%-20.20s  %s",
			      "--assemblyref",
			      "Dumps output like 'monodis --assemblyref'"),
		      ), "\n";
    exit 1;
}