pedump 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +15 -1
- data/Gemfile.lock +75 -30
- data/Rakefile +31 -1
- data/VERSION +1 -1
- data/lib/pedump.rb +31 -10
- data/lib/pedump/loader/minidump.rb +130 -15
- data/lib/pedump/unpacker/aspack.rb +1 -1
- data/pedump.gemspec +104 -28
- metadata +46 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: '09298f0bc9e608f9b7636a80f6f4b9aeb29aaf6f8f3bf72aa743a06d1bc3dd30'
|
|
4
|
+
data.tar.gz: e86dc4d6edd01222416e4937cec876a2551dea3b4ba8cb7eefb7aaa09d0375ce
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3b83b01e940fb0388a95566d4ca53fe61913f02b9d474987a35deb9c0b4073d66712a9179f801bc617f7202a3d42fd0d05e5a1cbe34ec332f3cf38c494e2f660
|
|
7
|
+
data.tar.gz: 64d7ae8c83a01f7e9772ed1e7e631474079baedd914f19ec26c725bb2a663155076d50777c14080532de3bcc3241fa0423705326e8f20067ec568b10e934d84b
|
data/Gemfile
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
1
|
source "https://rubygems.org"
|
|
2
|
-
gemspec
|
|
2
|
+
#gemspec
|
|
3
|
+
|
|
4
|
+
gem 'rainbow'
|
|
5
|
+
gem "awesome_print"
|
|
6
|
+
gem "iostruct", ">= 0.0.4"
|
|
7
|
+
gem "multipart-post", ">= 2.0.0"
|
|
8
|
+
gem "progressbar"
|
|
9
|
+
gem "zhexdump", ">= 0.0.2"
|
|
10
|
+
|
|
11
|
+
group :development do
|
|
12
|
+
gem "rspec", "~> 3.9.0"
|
|
13
|
+
gem "rspec-its", "~> 1.3.0"
|
|
14
|
+
gem "bundler", "~> 2.1.4"
|
|
15
|
+
gem "jeweler", "~> 2.3.9"
|
|
16
|
+
end
|
data/Gemfile.lock
CHANGED
|
@@ -1,45 +1,90 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
pedump (0.5.1)
|
|
5
|
-
awesome_print
|
|
6
|
-
iostruct (>= 0.0.4)
|
|
7
|
-
multipart-post (~> 2.0.0)
|
|
8
|
-
progressbar
|
|
9
|
-
zhexdump (>= 0.0.2)
|
|
10
|
-
|
|
11
1
|
GEM
|
|
12
2
|
remote: https://rubygems.org/
|
|
13
3
|
specs:
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
addressable (2.4.0)
|
|
5
|
+
awesome_print (1.8.0)
|
|
6
|
+
builder (3.2.4)
|
|
7
|
+
descendants_tracker (0.0.4)
|
|
8
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
9
|
+
diff-lcs (1.3)
|
|
10
|
+
faraday (0.9.2)
|
|
11
|
+
multipart-post (>= 1.2, < 3)
|
|
12
|
+
git (1.5.0)
|
|
13
|
+
github_api (0.16.0)
|
|
14
|
+
addressable (~> 2.4.0)
|
|
15
|
+
descendants_tracker (~> 0.0.4)
|
|
16
|
+
faraday (~> 0.8, < 0.10)
|
|
17
|
+
hashie (>= 3.4)
|
|
18
|
+
mime-types (>= 1.16, < 3.0)
|
|
19
|
+
oauth2 (~> 1.0)
|
|
20
|
+
hashie (4.0.0)
|
|
21
|
+
highline (2.0.3)
|
|
16
22
|
iostruct (0.0.4)
|
|
23
|
+
jeweler (2.3.9)
|
|
24
|
+
builder
|
|
25
|
+
bundler
|
|
26
|
+
git (>= 1.2.5)
|
|
27
|
+
github_api (~> 0.16.0)
|
|
28
|
+
highline (>= 1.6.15)
|
|
29
|
+
nokogiri (>= 1.5.10)
|
|
30
|
+
psych
|
|
31
|
+
rake
|
|
32
|
+
rdoc
|
|
33
|
+
semver2
|
|
34
|
+
jwt (2.2.1)
|
|
35
|
+
mime-types (2.99.3)
|
|
36
|
+
mini_portile2 (2.4.0)
|
|
37
|
+
multi_json (1.14.1)
|
|
38
|
+
multi_xml (0.6.0)
|
|
17
39
|
multipart-post (2.0.0)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
40
|
+
nokogiri (1.10.7)
|
|
41
|
+
mini_portile2 (~> 2.4.0)
|
|
42
|
+
oauth2 (1.4.2)
|
|
43
|
+
faraday (>= 0.8, < 2.0)
|
|
44
|
+
jwt (>= 1.0, < 3.0)
|
|
45
|
+
multi_json (~> 1.3)
|
|
46
|
+
multi_xml (~> 0.5)
|
|
47
|
+
rack (>= 1.2, < 3)
|
|
48
|
+
progressbar (1.10.1)
|
|
49
|
+
psych (3.1.0)
|
|
50
|
+
rack (2.1.1)
|
|
51
|
+
rainbow (3.0.0)
|
|
52
|
+
rake (13.0.1)
|
|
53
|
+
rdoc (6.2.1)
|
|
54
|
+
rspec (3.9.0)
|
|
55
|
+
rspec-core (~> 3.9.0)
|
|
56
|
+
rspec-expectations (~> 3.9.0)
|
|
57
|
+
rspec-mocks (~> 3.9.0)
|
|
58
|
+
rspec-core (3.9.1)
|
|
59
|
+
rspec-support (~> 3.9.1)
|
|
60
|
+
rspec-expectations (3.9.0)
|
|
27
61
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
28
|
-
rspec-support (~> 3.
|
|
29
|
-
rspec-
|
|
62
|
+
rspec-support (~> 3.9.0)
|
|
63
|
+
rspec-its (1.3.0)
|
|
64
|
+
rspec-core (>= 3.0.0)
|
|
65
|
+
rspec-expectations (>= 3.0.0)
|
|
66
|
+
rspec-mocks (3.9.1)
|
|
30
67
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
31
|
-
rspec-support (~> 3.
|
|
32
|
-
rspec-support (3.
|
|
68
|
+
rspec-support (~> 3.9.0)
|
|
69
|
+
rspec-support (3.9.2)
|
|
70
|
+
semver2 (3.4.2)
|
|
71
|
+
thread_safe (0.3.6)
|
|
33
72
|
zhexdump (0.0.2)
|
|
34
73
|
|
|
35
74
|
PLATFORMS
|
|
36
75
|
ruby
|
|
37
76
|
|
|
38
77
|
DEPENDENCIES
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
78
|
+
awesome_print
|
|
79
|
+
bundler (~> 2.1.4)
|
|
80
|
+
iostruct (>= 0.0.4)
|
|
81
|
+
jeweler (~> 2.3.9)
|
|
82
|
+
multipart-post (>= 2.0.0)
|
|
83
|
+
progressbar
|
|
84
|
+
rainbow
|
|
85
|
+
rspec (~> 3.9.0)
|
|
86
|
+
rspec-its (~> 1.3.0)
|
|
87
|
+
zhexdump (>= 0.0.2)
|
|
43
88
|
|
|
44
89
|
BUNDLED WITH
|
|
45
|
-
1.
|
|
90
|
+
2.1.4
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
1
4
|
require 'bundler'
|
|
2
|
-
|
|
5
|
+
begin
|
|
6
|
+
Bundler.setup(:default, :development)
|
|
7
|
+
rescue Bundler::BundlerError => e
|
|
8
|
+
$stderr.puts e.message
|
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
|
10
|
+
exit e.status_code
|
|
11
|
+
end
|
|
12
|
+
require 'rake'
|
|
13
|
+
|
|
14
|
+
require 'jeweler'
|
|
15
|
+
Jeweler::Tasks.new do |gem|
|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
|
17
|
+
gem.name = "pedump"
|
|
18
|
+
gem.homepage = "http://github.com/zed-0xff/pedump"
|
|
19
|
+
gem.license = "MIT"
|
|
20
|
+
gem.summary = %Q{dump win32 PE executable files with a pure ruby}
|
|
21
|
+
gem.description = %Q{dump headers, sections, extract resources of win32 PE exe,dll,etc}
|
|
22
|
+
gem.email = "zed.0xff@gmail.com"
|
|
23
|
+
gem.authors = ["Andrey \"Zed\" Zaikin"]
|
|
24
|
+
gem.executables = %w'pedump'
|
|
25
|
+
gem.files.include "lib/**/*.rb"
|
|
26
|
+
gem.files.exclude %w'samples/**/* spec/**/* tmp/**/* tmp/.keep .* README.md.tpl'
|
|
27
|
+
gem.extra_rdoc_files.exclude 'README.md.tpl'
|
|
28
|
+
# dependencies defined in Gemfile
|
|
29
|
+
end
|
|
30
|
+
Jeweler::RubygemsDotOrgTasks.new
|
|
31
|
+
|
|
32
|
+
require 'rspec/core'
|
|
3
33
|
require 'rspec/core/rake_task'
|
|
4
34
|
|
|
5
35
|
desc "run specs"
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.5.
|
|
1
|
+
0.5.3
|
data/lib/pedump.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
require 'stringio'
|
|
3
3
|
require 'iostruct'
|
|
4
4
|
require 'zhexdump'
|
|
5
|
+
require 'set'
|
|
5
6
|
|
|
6
7
|
unless Object.new.respond_to?(:try) && nil.respond_to?(:try)
|
|
7
8
|
require 'pedump/core_ext/try'
|
|
@@ -27,6 +28,7 @@ class PEdump
|
|
|
27
28
|
|
|
28
29
|
VERSION = Version::STRING
|
|
29
30
|
MAX_ERRORS = 100
|
|
31
|
+
MAX_IMAGE_IMPORT_DESCRIPTORS = 1000
|
|
30
32
|
|
|
31
33
|
@@logger = nil
|
|
32
34
|
|
|
@@ -527,7 +529,11 @@ class PEdump
|
|
|
527
529
|
# http://code.google.com/p/corkami/source/browse/trunk/asm/PE/manyimportsW7.asm
|
|
528
530
|
break
|
|
529
531
|
end
|
|
530
|
-
|
|
532
|
+
if r.size >= MAX_IMAGE_IMPORT_DESCRIPTORS
|
|
533
|
+
logger.warn "[!] too many IMAGE_IMPORT_DESCRIPTORs, not reading more than #{r.size}"
|
|
534
|
+
break
|
|
535
|
+
end
|
|
536
|
+
t = IMAGE_IMPORT_DESCRIPTOR.read(f)
|
|
531
537
|
break if t.Name.to_i == 0 # also catches EOF
|
|
532
538
|
r << t
|
|
533
539
|
file_offset += IMAGE_IMPORT_DESCRIPTOR::SIZE
|
|
@@ -536,8 +542,16 @@ class PEdump
|
|
|
536
542
|
logger.warn "[?] imports info beyond EOF"
|
|
537
543
|
end
|
|
538
544
|
|
|
545
|
+
n_bad_names = 0
|
|
539
546
|
logger.warn "[?] non-empty last IMAGE_IMPORT_DESCRIPTOR: #{t.inspect}" if t && !t.empty?
|
|
540
|
-
@imports = r
|
|
547
|
+
@imports = r
|
|
548
|
+
r = nil
|
|
549
|
+
@imports.each_with_index do |x, iidx|
|
|
550
|
+
if n_bad_names > MAX_ERRORS
|
|
551
|
+
logger.warn "[!] too many bad imported function names. skipping further imports parsing"
|
|
552
|
+
@imports = @imports[0,iidx]
|
|
553
|
+
break
|
|
554
|
+
end
|
|
541
555
|
if x.Name.to_i != 0 && (ofs = va2file(x.Name))
|
|
542
556
|
begin
|
|
543
557
|
f.seek ofs
|
|
@@ -572,12 +586,18 @@ class PEdump
|
|
|
572
586
|
logger.warn "[?] import ofs 0x#{ofs.to_s(16)} VA=0x#{t.to_s(16)} beyond EOF"
|
|
573
587
|
nil
|
|
574
588
|
else
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
589
|
+
hint = f.read(2).unpack('v').first
|
|
590
|
+
name = f.gets("\x00").chomp("\x00")
|
|
591
|
+
if !name.empty? && name !~ /\A[\x33-\x7f]+\Z/
|
|
592
|
+
n_bad_names += 1
|
|
593
|
+
if n_bad_names > MAX_ERRORS
|
|
594
|
+
nil
|
|
595
|
+
else
|
|
596
|
+
ImportedFunction.new(hint, name, nil, va)
|
|
597
|
+
end
|
|
598
|
+
else
|
|
599
|
+
ImportedFunction.new(hint, name, nil, va)
|
|
600
|
+
end
|
|
581
601
|
end
|
|
582
602
|
elsif tbl == :original_first_thunk
|
|
583
603
|
# OriginalFirstThunk entries can not be invalid, show a warning msg
|
|
@@ -592,7 +612,7 @@ class PEdump
|
|
|
592
612
|
end
|
|
593
613
|
end
|
|
594
614
|
x[tbl] && x[tbl].compact!
|
|
595
|
-
end
|
|
615
|
+
end # [:original_first_thunk, :first_thunk].each
|
|
596
616
|
if x.original_first_thunk && !x.first_thunk
|
|
597
617
|
logger.warn "[?] import table: empty FirstThunk for #{x.module_name}"
|
|
598
618
|
elsif !x.original_first_thunk && x.first_thunk
|
|
@@ -603,7 +623,8 @@ class PEdump
|
|
|
603
623
|
logger.debug "[?] import table: OriginalFirstThunk != FirstThunk for #{x.module_name}"
|
|
604
624
|
end
|
|
605
625
|
end
|
|
606
|
-
end
|
|
626
|
+
end # r.each
|
|
627
|
+
@imports
|
|
607
628
|
end
|
|
608
629
|
|
|
609
630
|
##############################################################################
|
|
@@ -110,7 +110,34 @@ class PEdump
|
|
|
110
110
|
16 => :MemoryInfoListStream, # MINIDUMP_MEMORY_INFO_LIST
|
|
111
111
|
17 => :ThreadInfoListStream,
|
|
112
112
|
18 => :HandleOperationListStream,
|
|
113
|
-
0xffff => :LastReservedStream
|
|
113
|
+
0xffff => :LastReservedStream,
|
|
114
|
+
|
|
115
|
+
# Special types saved by google breakpad
|
|
116
|
+
# https://chromium.googlesource.com/breakpad/breakpad/+/846b6335c5b0ba46dfa2ed96fccfa3f7a02fa2f1/src/google_breakpad/common/minidump_format.h#311
|
|
117
|
+
0x47670001 => :BreakpadInfoStream,
|
|
118
|
+
0x47670002 => :BreakpadAssertionInfoStream,
|
|
119
|
+
0x47670003 => :BreakpadLinuxCpuInfo,
|
|
120
|
+
0x47670004 => :BreakpadLinuxProcStatus,
|
|
121
|
+
0x47670005 => :BreakpadLinuxLsbRelease,
|
|
122
|
+
0x47670006 => :BreakpadLinuxCmdLine,
|
|
123
|
+
0x47670007 => :BreakpadLinuxEnviron,
|
|
124
|
+
0x47670008 => :BreakpadLinuxAuxv,
|
|
125
|
+
0x47670009 => :BreakpadLinuxMaps,
|
|
126
|
+
0x4767000A => :BreakpadLinuxDsoDebug,
|
|
127
|
+
|
|
128
|
+
# Saved by crashpad
|
|
129
|
+
# https://chromium.googlesource.com/crashpad/crashpad/+/doc/minidump/minidump_extensions.h#95
|
|
130
|
+
0x43500001 => :CrashpadInfo,
|
|
131
|
+
|
|
132
|
+
# Saved by Syzyasan
|
|
133
|
+
# https://github.com/google/syzygy/blob/c8bb4927f07fec0de8834c4774ddaafef0bc099f/syzygy/kasko/api/client.h#L28
|
|
134
|
+
# https://github.com/google/syzygy/blob/master/syzygy/crashdata/crashdata.proto
|
|
135
|
+
0x4B6B0001 => :SyzyasanCrashdata,
|
|
136
|
+
|
|
137
|
+
# Saved by Chromium
|
|
138
|
+
0x4B6B0002 => :ChromiumStabilityReport,
|
|
139
|
+
0x4B6B0003 => :ChromiumSystemProfile,
|
|
140
|
+
0x4B6B0004 => :ChromiumGwpAsanData,
|
|
114
141
|
}
|
|
115
142
|
|
|
116
143
|
class Loader
|
|
@@ -134,9 +161,16 @@ class PEdump
|
|
|
134
161
|
end
|
|
135
162
|
end
|
|
136
163
|
|
|
164
|
+
def stream_by_name(name)
|
|
165
|
+
type = MINIDUMP_STREAM_TYPE.invert[name]
|
|
166
|
+
raise "Unknown type symbol #{name}!" if !type
|
|
167
|
+
|
|
168
|
+
streams.find { |s| s.StreamType == type }
|
|
169
|
+
end
|
|
170
|
+
|
|
137
171
|
def memory_info_list
|
|
138
172
|
# MINIDUMP_MEMORY_INFO_LIST
|
|
139
|
-
stream =
|
|
173
|
+
stream = stream_by_name(:MemoryInfoListStream)
|
|
140
174
|
return nil unless stream
|
|
141
175
|
io.seek stream.Location.Rva
|
|
142
176
|
MINIDUMP_MEMORY_INFO_LIST.read io
|
|
@@ -144,7 +178,7 @@ class PEdump
|
|
|
144
178
|
|
|
145
179
|
def memory_list
|
|
146
180
|
# MINIDUMP_MEMORY_LIST
|
|
147
|
-
stream =
|
|
181
|
+
stream = stream_by_name(:MemoryListStream)
|
|
148
182
|
return nil unless stream
|
|
149
183
|
io.seek stream.Location.Rva
|
|
150
184
|
MINIDUMP_MEMORY_LIST.read io
|
|
@@ -152,7 +186,7 @@ class PEdump
|
|
|
152
186
|
|
|
153
187
|
def memory64_list
|
|
154
188
|
# MINIDUMP_MEMORY64_LIST
|
|
155
|
-
stream =
|
|
189
|
+
stream = stream_by_name(:Memory64ListStream)
|
|
156
190
|
return nil unless stream
|
|
157
191
|
io.seek stream.Location.Rva
|
|
158
192
|
MINIDUMP_MEMORY64_LIST.read io
|
|
@@ -216,21 +250,102 @@ end # module PEdump
|
|
|
216
250
|
|
|
217
251
|
if $0 == __FILE__
|
|
218
252
|
require 'pp'
|
|
253
|
+
require 'optparse'
|
|
254
|
+
|
|
255
|
+
options = {}
|
|
256
|
+
opt_parse = OptionParser.new do |opts|
|
|
257
|
+
opts.banner = "Usage: #{$0} [options] <minidump>"
|
|
258
|
+
|
|
259
|
+
opts.on("--all", "Print all of the following sections") do
|
|
260
|
+
options[:all] = true
|
|
261
|
+
end
|
|
262
|
+
opts.on("--header", "Print minidump header") do
|
|
263
|
+
options[:header] = true
|
|
264
|
+
end
|
|
265
|
+
opts.on("--streams", "Print out the streams present") do
|
|
266
|
+
options[:streams] = true
|
|
267
|
+
end
|
|
268
|
+
opts.on("--memory-ranges", "Print out memory ranges included in the minidump") do
|
|
269
|
+
options[:memory_ranges] = true
|
|
270
|
+
end
|
|
271
|
+
opts.on("--breakpad", "Print out breakpad text sections if present") do
|
|
272
|
+
options[:breakpad] = true
|
|
273
|
+
end
|
|
274
|
+
opts.separator ''
|
|
275
|
+
|
|
276
|
+
opts.on("--memory <address>", "Print the memory range beginning at address") do |m|
|
|
277
|
+
options[:memory] = m.hex
|
|
278
|
+
end
|
|
279
|
+
opts.separator ''
|
|
280
|
+
|
|
281
|
+
opts.on("-h", "--help", "Help") do
|
|
282
|
+
puts opts
|
|
283
|
+
exit 0
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
opt_parse.parse!
|
|
219
288
|
|
|
220
|
-
|
|
221
|
-
|
|
289
|
+
if ARGV.empty?
|
|
290
|
+
$stderr.puts opt_parse.help
|
|
291
|
+
exit 1
|
|
292
|
+
end
|
|
222
293
|
|
|
294
|
+
io = open(ARGV.first, "rb")
|
|
223
295
|
md = PEdump::Loader::Minidump.new io
|
|
224
|
-
pp md.hdr
|
|
225
|
-
puts
|
|
226
|
-
puts "[.] #{md.memory_ranges.size} memory ranges"
|
|
227
|
-
puts "[.] #{md.memory_ranges(:merge => true).size} merged memory ranges"
|
|
228
|
-
puts
|
|
229
296
|
|
|
230
|
-
|
|
231
|
-
|
|
297
|
+
if options[:all] || options[:header]
|
|
298
|
+
pp md.hdr
|
|
299
|
+
puts
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
if options[:all] || options[:streams]
|
|
303
|
+
puts "[.] Streams present in the minidump:"
|
|
304
|
+
md.streams.each do |s|
|
|
305
|
+
if PEdump::MINIDUMP_STREAM_TYPE[s.StreamType]
|
|
306
|
+
puts "[.] #{PEdump::MINIDUMP_STREAM_TYPE[s.StreamType]}"
|
|
307
|
+
else
|
|
308
|
+
puts "[.] Unknown stream type #{s.StreamType}"
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
puts
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
if options[:all] || options[:breakpad]
|
|
315
|
+
[ :BreakpadLinuxCpuInfo, :BreakpadLinuxProcStatus, :BreakpadLinuxMaps,
|
|
316
|
+
:BreakpadLinuxCmdLine, :BreakpadLinuxEnviron ].each { |name|
|
|
317
|
+
stream = md.stream_by_name(name)
|
|
318
|
+
next if !stream
|
|
319
|
+
|
|
320
|
+
io.seek stream.Location.Rva
|
|
321
|
+
contents = io.read(stream.Location.DataSize)
|
|
322
|
+
|
|
323
|
+
if contents !~ /[^[:print:][:space:]]/
|
|
324
|
+
puts "[.] Section #{name}:"
|
|
325
|
+
puts contents
|
|
326
|
+
else
|
|
327
|
+
puts "[.] Section #{name}: #{contents.inspect}"
|
|
328
|
+
end
|
|
329
|
+
puts
|
|
330
|
+
}
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
if options[:all] || options[:memory_ranges]
|
|
334
|
+
puts "[.] #{md.memory_ranges.size} memory ranges"
|
|
335
|
+
puts "[.] #{md.memory_ranges(:merge => true).size} merged memory ranges"
|
|
336
|
+
puts
|
|
337
|
+
|
|
338
|
+
printf "[.] %16s %8s\n", "addr", "size"
|
|
339
|
+
md.memory_ranges(:merge => true).sort_by { |mr| mr.va }.each do |mr|
|
|
340
|
+
printf "[.] %16x %8x\n", mr.va, mr.size
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
if options[:memory]
|
|
345
|
+
mr = md.memory_ranges(:merge => true).find { |r| r.va == options[:memory] }
|
|
346
|
+
raise "Could not find the specified region" if !mr
|
|
232
347
|
|
|
233
|
-
|
|
234
|
-
|
|
348
|
+
io.seek(mr.file_offset)
|
|
349
|
+
print io.read(mr.size)
|
|
235
350
|
end
|
|
236
351
|
end
|
data/pedump.gemspec
CHANGED
|
@@ -1,33 +1,109 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
|
+
# -*- encoding: utf-8 -*-
|
|
5
|
+
# stub: pedump 0.5.3 ruby lib
|
|
5
6
|
|
|
6
|
-
Gem::Specification.new do |
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
spec.authors = ["Andrey \"Zed\" Zaikin"]
|
|
10
|
-
spec.email = ["zed.0xff@gmail.com"]
|
|
7
|
+
Gem::Specification.new do |s|
|
|
8
|
+
s.name = "pedump".freeze
|
|
9
|
+
s.version = "0.5.3"
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
|
+
s.require_paths = ["lib".freeze]
|
|
13
|
+
s.authors = ["Andrey \"Zed\" Zaikin".freeze]
|
|
14
|
+
s.date = "2020-01-24"
|
|
15
|
+
s.description = "dump headers, sections, extract resources of win32 PE exe,dll,etc".freeze
|
|
16
|
+
s.email = "zed.0xff@gmail.com".freeze
|
|
17
|
+
s.executables = ["pedump".freeze]
|
|
18
|
+
s.extra_rdoc_files = [
|
|
19
|
+
"LICENSE.txt",
|
|
20
|
+
"README.md"
|
|
21
|
+
]
|
|
22
|
+
s.files = [
|
|
23
|
+
"Gemfile",
|
|
24
|
+
"Gemfile.lock",
|
|
25
|
+
"LICENSE.txt",
|
|
26
|
+
"README.md",
|
|
27
|
+
"Rakefile",
|
|
28
|
+
"VERSION",
|
|
29
|
+
"bin/pedump",
|
|
30
|
+
"data/fs.txt",
|
|
31
|
+
"data/jc-userdb.txt",
|
|
32
|
+
"data/sig.bin",
|
|
33
|
+
"data/signatures.txt",
|
|
34
|
+
"data/userdb.txt",
|
|
35
|
+
"lib/pedump.rb",
|
|
36
|
+
"lib/pedump/cli.rb",
|
|
37
|
+
"lib/pedump/comparer.rb",
|
|
38
|
+
"lib/pedump/composite_io.rb",
|
|
39
|
+
"lib/pedump/core.rb",
|
|
40
|
+
"lib/pedump/core_ext/try.rb",
|
|
41
|
+
"lib/pedump/loader.rb",
|
|
42
|
+
"lib/pedump/loader/minidump.rb",
|
|
43
|
+
"lib/pedump/loader/section.rb",
|
|
44
|
+
"lib/pedump/logger.rb",
|
|
45
|
+
"lib/pedump/ne.rb",
|
|
46
|
+
"lib/pedump/ne/version_info.rb",
|
|
47
|
+
"lib/pedump/packer.rb",
|
|
48
|
+
"lib/pedump/pe.rb",
|
|
49
|
+
"lib/pedump/resources.rb",
|
|
50
|
+
"lib/pedump/security.rb",
|
|
51
|
+
"lib/pedump/sig_parser.rb",
|
|
52
|
+
"lib/pedump/tls.rb",
|
|
53
|
+
"lib/pedump/unpacker.rb",
|
|
54
|
+
"lib/pedump/unpacker/aspack.rb",
|
|
55
|
+
"lib/pedump/unpacker/upx.rb",
|
|
56
|
+
"lib/pedump/version.rb",
|
|
57
|
+
"lib/pedump/version_info.rb",
|
|
58
|
+
"misc/aspack/Makefile",
|
|
59
|
+
"misc/aspack/aspack_unlzx.c",
|
|
60
|
+
"misc/aspack/lzxdec.c",
|
|
61
|
+
"misc/aspack/lzxdec.h",
|
|
62
|
+
"misc/nedump.c",
|
|
63
|
+
"pedump.gemspec"
|
|
64
|
+
]
|
|
65
|
+
s.homepage = "http://github.com/zed-0xff/pedump".freeze
|
|
66
|
+
s.licenses = ["MIT".freeze]
|
|
67
|
+
s.rubygems_version = "2.7.6".freeze
|
|
68
|
+
s.summary = "dump win32 PE executable files with a pure ruby".freeze
|
|
16
69
|
|
|
17
|
-
|
|
18
|
-
|
|
70
|
+
if s.respond_to? :specification_version then
|
|
71
|
+
s.specification_version = 4
|
|
19
72
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
73
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
74
|
+
s.add_runtime_dependency(%q<rainbow>.freeze, [">= 0"])
|
|
75
|
+
s.add_runtime_dependency(%q<awesome_print>.freeze, [">= 0"])
|
|
76
|
+
s.add_runtime_dependency(%q<iostruct>.freeze, [">= 0.0.4"])
|
|
77
|
+
s.add_runtime_dependency(%q<multipart-post>.freeze, [">= 2.0.0"])
|
|
78
|
+
s.add_runtime_dependency(%q<progressbar>.freeze, [">= 0"])
|
|
79
|
+
s.add_runtime_dependency(%q<zhexdump>.freeze, [">= 0.0.2"])
|
|
80
|
+
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.9.0"])
|
|
81
|
+
s.add_development_dependency(%q<rspec-its>.freeze, ["~> 1.3.0"])
|
|
82
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 2.1.4"])
|
|
83
|
+
s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.3.9"])
|
|
84
|
+
else
|
|
85
|
+
s.add_dependency(%q<rainbow>.freeze, [">= 0"])
|
|
86
|
+
s.add_dependency(%q<awesome_print>.freeze, [">= 0"])
|
|
87
|
+
s.add_dependency(%q<iostruct>.freeze, [">= 0.0.4"])
|
|
88
|
+
s.add_dependency(%q<multipart-post>.freeze, [">= 2.0.0"])
|
|
89
|
+
s.add_dependency(%q<progressbar>.freeze, [">= 0"])
|
|
90
|
+
s.add_dependency(%q<zhexdump>.freeze, [">= 0.0.2"])
|
|
91
|
+
s.add_dependency(%q<rspec>.freeze, ["~> 3.9.0"])
|
|
92
|
+
s.add_dependency(%q<rspec-its>.freeze, ["~> 1.3.0"])
|
|
93
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 2.1.4"])
|
|
94
|
+
s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.9"])
|
|
95
|
+
end
|
|
96
|
+
else
|
|
97
|
+
s.add_dependency(%q<rainbow>.freeze, [">= 0"])
|
|
98
|
+
s.add_dependency(%q<awesome_print>.freeze, [">= 0"])
|
|
99
|
+
s.add_dependency(%q<iostruct>.freeze, [">= 0.0.4"])
|
|
100
|
+
s.add_dependency(%q<multipart-post>.freeze, [">= 2.0.0"])
|
|
101
|
+
s.add_dependency(%q<progressbar>.freeze, [">= 0"])
|
|
102
|
+
s.add_dependency(%q<zhexdump>.freeze, [">= 0.0.2"])
|
|
103
|
+
s.add_dependency(%q<rspec>.freeze, ["~> 3.9.0"])
|
|
104
|
+
s.add_dependency(%q<rspec-its>.freeze, ["~> 1.3.0"])
|
|
105
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 2.1.4"])
|
|
106
|
+
s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.9"])
|
|
107
|
+
end
|
|
33
108
|
end
|
|
109
|
+
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pedump
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.5.
|
|
4
|
+
version: 0.5.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrey "Zed" Zaikin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-01-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rainbow
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: awesome_print
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -42,14 +56,14 @@ dependencies:
|
|
|
42
56
|
name: multipart-post
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
|
44
58
|
requirements:
|
|
45
|
-
- - "
|
|
59
|
+
- - ">="
|
|
46
60
|
- !ruby/object:Gem::Version
|
|
47
61
|
version: 2.0.0
|
|
48
62
|
type: :runtime
|
|
49
63
|
prerelease: false
|
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
65
|
requirements:
|
|
52
|
-
- - "
|
|
66
|
+
- - ">="
|
|
53
67
|
- !ruby/object:Gem::Version
|
|
54
68
|
version: 2.0.0
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
@@ -81,54 +95,69 @@ dependencies:
|
|
|
81
95
|
- !ruby/object:Gem::Version
|
|
82
96
|
version: 0.0.2
|
|
83
97
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
98
|
+
name: rspec
|
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
|
86
100
|
requirements:
|
|
87
101
|
- - "~>"
|
|
88
102
|
- !ruby/object:Gem::Version
|
|
89
|
-
version:
|
|
103
|
+
version: 3.9.0
|
|
90
104
|
type: :development
|
|
91
105
|
prerelease: false
|
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
107
|
requirements:
|
|
94
108
|
- - "~>"
|
|
95
109
|
- !ruby/object:Gem::Version
|
|
96
|
-
version:
|
|
110
|
+
version: 3.9.0
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name:
|
|
112
|
+
name: rspec-its
|
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
|
100
114
|
requirements:
|
|
101
115
|
- - "~>"
|
|
102
116
|
- !ruby/object:Gem::Version
|
|
103
|
-
version:
|
|
117
|
+
version: 1.3.0
|
|
104
118
|
type: :development
|
|
105
119
|
prerelease: false
|
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
121
|
requirements:
|
|
108
122
|
- - "~>"
|
|
109
123
|
- !ruby/object:Gem::Version
|
|
110
|
-
version:
|
|
124
|
+
version: 1.3.0
|
|
111
125
|
- !ruby/object:Gem::Dependency
|
|
112
|
-
name:
|
|
126
|
+
name: bundler
|
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
|
114
128
|
requirements:
|
|
115
129
|
- - "~>"
|
|
116
130
|
- !ruby/object:Gem::Version
|
|
117
|
-
version:
|
|
131
|
+
version: 2.1.4
|
|
118
132
|
type: :development
|
|
119
133
|
prerelease: false
|
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
135
|
requirements:
|
|
122
136
|
- - "~>"
|
|
123
137
|
- !ruby/object:Gem::Version
|
|
124
|
-
version:
|
|
138
|
+
version: 2.1.4
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: jeweler
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - "~>"
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: 2.3.9
|
|
146
|
+
type: :development
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - "~>"
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: 2.3.9
|
|
125
153
|
description: dump headers, sections, extract resources of win32 PE exe,dll,etc
|
|
126
|
-
email:
|
|
127
|
-
- zed.0xff@gmail.com
|
|
154
|
+
email: zed.0xff@gmail.com
|
|
128
155
|
executables:
|
|
129
156
|
- pedump
|
|
130
157
|
extensions: []
|
|
131
|
-
extra_rdoc_files:
|
|
158
|
+
extra_rdoc_files:
|
|
159
|
+
- LICENSE.txt
|
|
160
|
+
- README.md
|
|
132
161
|
files:
|
|
133
162
|
- Gemfile
|
|
134
163
|
- Gemfile.lock
|
|
@@ -191,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
191
220
|
version: '0'
|
|
192
221
|
requirements: []
|
|
193
222
|
rubyforge_project:
|
|
194
|
-
rubygems_version: 2.
|
|
223
|
+
rubygems_version: 2.7.6
|
|
195
224
|
signing_key:
|
|
196
225
|
specification_version: 4
|
|
197
226
|
summary: dump win32 PE executable files with a pure ruby
|