pedump 0.4.11 → 0.4.12
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.
- data/.travis.yml +4 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +2 -2
- data/README.md +21 -2
- data/VERSION +1 -1
- data/lib/pedump.rb +26 -24
- data/lib/pedump/ne/version_info.rb +5 -1
- data/lib/pedump/pe.rb +2 -2
- data/lib/pedump/resources.rb +1 -1
- data/lib/pedump/version.rb +1 -1
- data/pedump.gemspec +11 -6
- data/samples/bad/68.exe +0 -0
- data/spec/bad_samples_spec.rb +13 -0
- data/spec/spec_helper.rb +4 -21
- data/spec/support/samples.rb +24 -0
- data/tmp/.keep +0 -0
- metadata +12 -7
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -12,7 +12,7 @@ GEM
|
|
12
12
|
json (1.7.5)
|
13
13
|
looksee (1.0.3)
|
14
14
|
multipart-post (1.1.5)
|
15
|
-
progressbar (0.
|
15
|
+
progressbar (0.12.0)
|
16
16
|
rake (10.0.2)
|
17
17
|
rdoc (3.12)
|
18
18
|
json (~> 1.4)
|
@@ -35,6 +35,6 @@ DEPENDENCIES
|
|
35
35
|
jeweler
|
36
36
|
looksee
|
37
37
|
multipart-post (~> 1.1.4)
|
38
|
-
progressbar
|
38
|
+
progressbar
|
39
39
|
rspec
|
40
40
|
what_methods
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
pedump
|
1
|
+
pedump [](https://travis-ci.org/zed-0xff/pedump) [](https://gemnasium.com/zed-0xff/pedump)
|
2
2
|
======
|
3
3
|
|
4
4
|
Description
|
@@ -299,7 +299,26 @@ Usage
|
|
299
299
|
KERNEL32.dll 21f TlsAlloc
|
300
300
|
KERNEL32.dll 220 TlsFree
|
301
301
|
KERNEL32.dll 1fd SetLastError
|
302
|
-
|
302
|
+
KERNEL32.dll 221 TlsGetValue
|
303
|
+
KERNEL32.dll 62 ExitProcess
|
304
|
+
KERNEL32.dll 1b8 ReadFile
|
305
|
+
KERNEL32.dll 16 CloseHandle
|
306
|
+
KERNEL32.dll 24f WriteFile
|
307
|
+
KERNEL32.dll 83 FlushFileBuffers
|
308
|
+
KERNEL32.dll e9 GetModuleFileNameA
|
309
|
+
KERNEL32.dll 98 GetCPInfo
|
310
|
+
KERNEL32.dll 92 GetACP
|
311
|
+
KERNEL32.dll f6 GetOEMCP
|
312
|
+
KERNEL32.dll 8b FreeEnvironmentStringsA
|
313
|
+
KERNEL32.dll d0 GetEnvironmentStrings
|
314
|
+
KERNEL32.dll 8c FreeEnvironmentStringsW
|
315
|
+
KERNEL32.dll d2 GetEnvironmentStringsW
|
316
|
+
KERNEL32.dll 242 WideCharToMultiByte
|
317
|
+
KERNEL32.dll 2b CreateFileA
|
318
|
+
KERNEL32.dll 1f8 SetFilePointer
|
319
|
+
KERNEL32.dll 206 SetStdHandle
|
320
|
+
KERNEL32.dll 178 LoadLibraryA
|
321
|
+
KERNEL32.dll 1ef SetEndOfFile
|
303
322
|
|
304
323
|
### Exports
|
305
324
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.12
|
data/lib/pedump.rb
CHANGED
@@ -505,23 +505,26 @@ class PEdump
|
|
505
505
|
tls_aoi = tls_aoi > 0 ? va2file(tls_aoi) : nil
|
506
506
|
end
|
507
507
|
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
508
|
+
r = []; t = nil
|
509
|
+
if f.checked_seek(file_offset)
|
510
|
+
while true
|
511
|
+
if tls_aoi && tls_aoi == file_offset+16
|
512
|
+
# catched the neat trick! :)
|
513
|
+
# f.tell + 12 = offset of 'FirstThunk' field from start of IMAGE_IMPORT_DESCRIPTOR structure
|
514
|
+
logger.warn "[!] catched the 'imports terminator in TLS trick'"
|
515
|
+
# http://code.google.com/p/corkami/source/browse/trunk/asm/PE/manyimportsW7.asm
|
516
|
+
break
|
517
|
+
end
|
518
|
+
t=IMAGE_IMPORT_DESCRIPTOR.read(f)
|
519
|
+
break if t.Name.to_i == 0 # also catches EOF
|
520
|
+
r << t
|
521
|
+
file_offset += IMAGE_IMPORT_DESCRIPTOR::SIZE
|
517
522
|
end
|
518
|
-
|
519
|
-
|
520
|
-
r << t
|
521
|
-
file_offset += IMAGE_IMPORT_DESCRIPTOR::SIZE
|
523
|
+
else
|
524
|
+
logger.warn "[?] imports info beyond EOF"
|
522
525
|
end
|
523
526
|
|
524
|
-
logger.warn "[?] non-empty last IMAGE_IMPORT_DESCRIPTOR: #{t.inspect}"
|
527
|
+
logger.warn "[?] non-empty last IMAGE_IMPORT_DESCRIPTOR: #{t.inspect}" if t && !t.empty?
|
525
528
|
@imports = r.each do |x|
|
526
529
|
if x.Name.to_i != 0 && (ofs = va2file(x.Name))
|
527
530
|
begin
|
@@ -538,9 +541,9 @@ class PEdump
|
|
538
541
|
f.seek ofs
|
539
542
|
x[tbl] ||= []
|
540
543
|
if pe.x64?
|
541
|
-
x[tbl] << t while (t = f.read(8).unpack('Q').first) != 0
|
544
|
+
x[tbl] << t while (t = f.read(8).to_s.unpack('Q').first).to_i != 0
|
542
545
|
else
|
543
|
-
x[tbl] << t while (t = f.read(4).unpack('V').first) != 0
|
546
|
+
x[tbl] << t while (t = f.read(4).to_s.unpack('V').first).to_i != 0
|
544
547
|
end
|
545
548
|
end
|
546
549
|
cache = {}
|
@@ -553,8 +556,7 @@ class PEdump
|
|
553
556
|
if t & (2**(bits-1)) > 0 # 0x8000_0000(_0000_0000)
|
554
557
|
ImportedFunction.new(nil,nil,t & (2**(bits-1)-1),va) # 0x7fff_ffff(_ffff_ffff)
|
555
558
|
elsif ofs=va2file(t, :quiet => true)
|
556
|
-
f.
|
557
|
-
if f.eof?
|
559
|
+
if !f.checked_seek(ofs) || f.eof?
|
558
560
|
logger.warn "[?] import ofs 0x#{ofs.to_s(16)} beyond EOF"
|
559
561
|
nil
|
560
562
|
else
|
@@ -597,14 +599,14 @@ class PEdump
|
|
597
599
|
##############################################################################
|
598
600
|
|
599
601
|
#http://msdn.microsoft.com/en-us/library/ms809762.aspx
|
600
|
-
IMAGE_EXPORT_DIRECTORY = create_struct '
|
602
|
+
IMAGE_EXPORT_DIRECTORY = create_struct 'V2v2V7',
|
601
603
|
:Characteristics,
|
602
604
|
:TimeDateStamp,
|
603
605
|
:MajorVersion, # These fields appear to be unused and are set to 0.
|
604
606
|
:MinorVersion, # These fields appear to be unused and are set to 0.
|
605
607
|
:Name,
|
606
608
|
:Base, # The starting ordinal number for exported functions
|
607
|
-
:NumberOfFunctions,
|
609
|
+
:NumberOfFunctions, # UNSIGNED!, perfectly valid when = 0xffff_ffff, see corkami/dllord.dll
|
608
610
|
:NumberOfNames,
|
609
611
|
:AddressOfFunctions,
|
610
612
|
:AddressOfNames,
|
@@ -631,9 +633,8 @@ class PEdump
|
|
631
633
|
va = @pe.ioh.DataDirectory[IMAGE_DATA_DIRECTORY::EXPORT].va
|
632
634
|
file_offset = va2file(va)
|
633
635
|
return nil unless file_offset
|
634
|
-
f.
|
635
|
-
|
636
|
-
logger.info "[?] exports info beyond EOF"
|
636
|
+
if !f.checked_seek(file_offset) || f.eof?
|
637
|
+
logger.warn "[?] exports info beyond EOF"
|
637
638
|
return nil
|
638
639
|
end
|
639
640
|
@exports = IMAGE_EXPORT_DIRECTORY.read(f).tap do |x|
|
@@ -715,7 +716,8 @@ class PEdump
|
|
715
716
|
|
716
717
|
x.functions = []
|
717
718
|
x.entry_points.each_with_index do |ep,i|
|
718
|
-
names = ord2name[i+x.Base]
|
719
|
+
names = ord2name[i+x.Base]
|
720
|
+
names = names.join(', ') if names
|
719
721
|
next if ep.to_i == 0 && names.nil?
|
720
722
|
x.functions << ExportedFunction.new(names, i+x.Base, ep)
|
721
723
|
end
|
@@ -125,7 +125,11 @@ class PEdump::NE
|
|
125
125
|
cp = PEdump::NE.cp # XXX HACK
|
126
126
|
|
127
127
|
x.Value = f.read(value_len).to_s.chomp("\x00")
|
128
|
-
|
128
|
+
begin
|
129
|
+
x.Value.force_encoding("CP#{cp}").encode!('UTF-8').sub!(/\u0000$/,'')
|
130
|
+
rescue
|
131
|
+
x.Value.force_encoding("CP1250").encode!('UTF-8').sub!(/\u0000$/,'') rescue nil
|
132
|
+
end
|
129
133
|
if f.tell%4 > 0
|
130
134
|
f.read(4-f.tell%4) # undoc padding?
|
131
135
|
end
|
data/lib/pedump/pe.rb
CHANGED
@@ -38,7 +38,7 @@ class PEdump
|
|
38
38
|
end
|
39
39
|
PE.new(pe_sig).tap do |pe|
|
40
40
|
pe.image_file_header = IMAGE_FILE_HEADER.read(f)
|
41
|
-
if pe.ifh.SizeOfOptionalHeader > 0
|
41
|
+
if pe.ifh.SizeOfOptionalHeader.to_i > 0
|
42
42
|
if pe.x64?
|
43
43
|
pe.image_optional_header = IMAGE_OPTIONAL_HEADER64.read(f, pe.ifh.SizeOfOptionalHeader)
|
44
44
|
else
|
@@ -46,7 +46,7 @@ class PEdump
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
if (nToRead=pe.ifh.NumberOfSections) > 0xffff
|
49
|
+
if (nToRead=pe.ifh.NumberOfSections.to_i) > 0xffff
|
50
50
|
if force.is_a?(Numeric) && force > 1
|
51
51
|
logger.warn "[!] too many sections (#{pe.ifh.NumberOfSections}). forced. reading all"
|
52
52
|
else
|
data/lib/pedump/resources.rb
CHANGED
@@ -189,7 +189,7 @@ class PEdump
|
|
189
189
|
r = []
|
190
190
|
Array(resources(f)).find_all{ |x| x.type == 'STRING'}.each do |res|
|
191
191
|
res.data.each_with_index do |string,idx|
|
192
|
-
r << STRING.new( ((res.id-1)<<4) + idx, res.lang, string ) unless string.empty?
|
192
|
+
r << STRING.new( ((res.id.to_i-1)<<4) + idx, res.lang, string ) unless string.empty?
|
193
193
|
end
|
194
194
|
end
|
195
195
|
r
|
data/lib/pedump/version.rb
CHANGED
data/pedump.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "pedump"
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.12"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andrey \"Zed\" Zaikin"]
|
12
|
-
s.date = "2012-12-
|
12
|
+
s.date = "2012-12-12"
|
13
13
|
s.description = "dump headers, sections, extract resources of win32 PE exe,dll,etc"
|
14
14
|
s.email = "zed.0xff@gmail.com"
|
15
15
|
s.executables = ["pedump"]
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.files = [
|
21
21
|
".document",
|
22
22
|
".rspec",
|
23
|
+
".travis.yml",
|
23
24
|
"Gemfile",
|
24
25
|
"Gemfile.lock",
|
25
26
|
"LICENSE.txt",
|
@@ -58,8 +59,10 @@ Gem::Specification.new do |s|
|
|
58
59
|
"misc/aspack/lzxdec.h",
|
59
60
|
"misc/nedump.c",
|
60
61
|
"pedump.gemspec",
|
62
|
+
"samples/bad/68.exe",
|
61
63
|
"spec/65535sects_spec.rb",
|
62
64
|
"spec/bad_imports_spec.rb",
|
65
|
+
"spec/bad_samples_spec.rb",
|
63
66
|
"spec/composite_io_spec.rb",
|
64
67
|
"spec/dllord_spec.rb",
|
65
68
|
"spec/foldedhdr_spec.rb",
|
@@ -74,9 +77,11 @@ Gem::Specification.new do |s|
|
|
74
77
|
"spec/sig_all_packers_spec.rb",
|
75
78
|
"spec/sig_spec.rb",
|
76
79
|
"spec/spec_helper.rb",
|
80
|
+
"spec/support/samples.rb",
|
77
81
|
"spec/unpackers/aspack_spec.rb",
|
78
82
|
"spec/unpackers/find_spec.rb",
|
79
|
-
"spec/virtsectblXP_spec.rb"
|
83
|
+
"spec/virtsectblXP_spec.rb",
|
84
|
+
"tmp/.keep"
|
80
85
|
]
|
81
86
|
s.homepage = "http://github.com/zed-0xff/pedump"
|
82
87
|
s.licenses = ["MIT"]
|
@@ -89,7 +94,7 @@ Gem::Specification.new do |s|
|
|
89
94
|
|
90
95
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
91
96
|
s.add_runtime_dependency(%q<multipart-post>, ["~> 1.1.4"])
|
92
|
-
s.add_runtime_dependency(%q<progressbar>, ["
|
97
|
+
s.add_runtime_dependency(%q<progressbar>, [">= 0"])
|
93
98
|
s.add_runtime_dependency(%q<awesome_print>, [">= 0"])
|
94
99
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
95
100
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
@@ -98,7 +103,7 @@ Gem::Specification.new do |s|
|
|
98
103
|
s.add_development_dependency(%q<looksee>, [">= 0"])
|
99
104
|
else
|
100
105
|
s.add_dependency(%q<multipart-post>, ["~> 1.1.4"])
|
101
|
-
s.add_dependency(%q<progressbar>, ["
|
106
|
+
s.add_dependency(%q<progressbar>, [">= 0"])
|
102
107
|
s.add_dependency(%q<awesome_print>, [">= 0"])
|
103
108
|
s.add_dependency(%q<rspec>, [">= 0"])
|
104
109
|
s.add_dependency(%q<bundler>, [">= 0"])
|
@@ -108,7 +113,7 @@ Gem::Specification.new do |s|
|
|
108
113
|
end
|
109
114
|
else
|
110
115
|
s.add_dependency(%q<multipart-post>, ["~> 1.1.4"])
|
111
|
-
s.add_dependency(%q<progressbar>, ["
|
116
|
+
s.add_dependency(%q<progressbar>, [">= 0"])
|
112
117
|
s.add_dependency(%q<awesome_print>, [">= 0"])
|
113
118
|
s.add_dependency(%q<rspec>, [">= 0"])
|
114
119
|
s.add_dependency(%q<bundler>, [">= 0"])
|
data/samples/bad/68.exe
ADDED
Binary file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/pedump')
|
3
|
+
|
4
|
+
PEDUMP_BINARY = File.expand_path(File.dirname(__FILE__) + '/../bin/pedump')
|
5
|
+
|
6
|
+
Dir[File.join(SAMPLES_DIR,"bad","*.exe")].each do |fname|
|
7
|
+
describe fname do
|
8
|
+
it "should not cause exception" do
|
9
|
+
system "#{PEDUMP_BINARY} -qqq #{fname} > /dev/null"
|
10
|
+
$?.should be_success
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,26 +8,9 @@ require 'pedump'
|
|
8
8
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
9
|
|
10
10
|
RSpec.configure do |config|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@pedump ||=
|
15
|
-
begin
|
16
|
-
fname =
|
17
|
-
if self.example
|
18
|
-
# called from it(...)
|
19
|
-
self.example.full_description.split.first
|
20
|
-
else
|
21
|
-
# called from before(:all)
|
22
|
-
self.class.metadata[:example_group][:description_args].first
|
23
|
-
end
|
24
|
-
fname = File.expand_path(File.dirname(__FILE__) + '/../samples/' + fname)
|
25
|
-
File.open(fname,"rb") do |f|
|
26
|
-
if block_given?
|
27
|
-
yield PEdump.new(f)
|
28
|
-
else
|
29
|
-
PEdump.new(f).dump
|
30
|
-
end
|
31
|
-
end
|
11
|
+
config.before :suite do
|
12
|
+
Dir[File.join(SAMPLES_DIR,"*.7z")].each do |fname|
|
13
|
+
system "7zr", "x", "-y", "-o#{SAMPLES_DIR}", fname
|
32
14
|
end
|
15
|
+
end
|
33
16
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
SAMPLES_DIR = File.expand_path(File.dirname(__FILE__) + '/../../samples/')
|
2
|
+
|
3
|
+
def sample
|
4
|
+
@pedump ||=
|
5
|
+
begin
|
6
|
+
fname =
|
7
|
+
if self.example
|
8
|
+
# called from it(...)
|
9
|
+
self.example.full_description.split.first
|
10
|
+
else
|
11
|
+
# called from before(:all)
|
12
|
+
self.class.metadata[:example_group][:description_args].first
|
13
|
+
end
|
14
|
+
fname = File.join(SAMPLES_DIR, fname)
|
15
|
+
File.open(fname,"rb") do |f|
|
16
|
+
if block_given?
|
17
|
+
yield PEdump.new(f)
|
18
|
+
else
|
19
|
+
PEdump.new(f).dump
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
data/tmp/.keep
ADDED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pedump
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multipart-post
|
@@ -32,17 +32,17 @@ dependencies:
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0
|
37
|
+
version: '0'
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0
|
45
|
+
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: awesome_print
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +150,7 @@ extra_rdoc_files:
|
|
150
150
|
files:
|
151
151
|
- .document
|
152
152
|
- .rspec
|
153
|
+
- .travis.yml
|
153
154
|
- Gemfile
|
154
155
|
- Gemfile.lock
|
155
156
|
- LICENSE.txt
|
@@ -188,8 +189,10 @@ files:
|
|
188
189
|
- misc/aspack/lzxdec.h
|
189
190
|
- misc/nedump.c
|
190
191
|
- pedump.gemspec
|
192
|
+
- samples/bad/68.exe
|
191
193
|
- spec/65535sects_spec.rb
|
192
194
|
- spec/bad_imports_spec.rb
|
195
|
+
- spec/bad_samples_spec.rb
|
193
196
|
- spec/composite_io_spec.rb
|
194
197
|
- spec/dllord_spec.rb
|
195
198
|
- spec/foldedhdr_spec.rb
|
@@ -204,9 +207,11 @@ files:
|
|
204
207
|
- spec/sig_all_packers_spec.rb
|
205
208
|
- spec/sig_spec.rb
|
206
209
|
- spec/spec_helper.rb
|
210
|
+
- spec/support/samples.rb
|
207
211
|
- spec/unpackers/aspack_spec.rb
|
208
212
|
- spec/unpackers/find_spec.rb
|
209
213
|
- spec/virtsectblXP_spec.rb
|
214
|
+
- tmp/.keep
|
210
215
|
homepage: http://github.com/zed-0xff/pedump
|
211
216
|
licenses:
|
212
217
|
- MIT
|
@@ -222,7 +227,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
222
227
|
version: '0'
|
223
228
|
segments:
|
224
229
|
- 0
|
225
|
-
hash: -
|
230
|
+
hash: -3767964697457459615
|
226
231
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
232
|
none: false
|
228
233
|
requirements:
|