pedump 0.7.3 → 0.7.5

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/lib/pedump.rb CHANGED
@@ -9,6 +9,7 @@ unless Object.new.respond_to?(:try) && nil.respond_to?(:try)
9
9
  require 'pedump/core_ext/try'
10
10
  end
11
11
 
12
+ require 'pedump/version'
12
13
  require 'pedump/core'
13
14
  require 'pedump/ordlookup'
14
15
  require 'pedump/pe'
@@ -30,7 +31,6 @@ require 'pedump/clr'
30
31
  class PEdump
31
32
  attr_accessor :fname, :logger, :force, :io
32
33
 
33
- VERSION = Version::STRING
34
34
  MAX_ERRORS = 100
35
35
  MAX_IMAGE_IMPORT_DESCRIPTORS = 1000
36
36
  MAX_EXPORT_NUMBER_OF_NAMES = 16384 # got 7977 in https://pedump.me/03ad7400080678c6b1984f995d36fd04
@@ -397,7 +397,7 @@ class PEdump
397
397
  alias :rich_header :rich_hdr
398
398
  alias :rich :rich_hdr
399
399
 
400
- def va2file va, h={}
400
+ def rva2file va, h={}
401
401
  return nil if va.nil?
402
402
 
403
403
  va0 = va # save for log output of original addr
@@ -445,7 +445,11 @@ class PEdump
445
445
  nil
446
446
  end
447
447
 
448
- def file2va offset, h = {}
448
+ def va2file va, h = {}
449
+ va && rva2file(va - @pe.ioh.ImageBase.to_i, h)
450
+ end
451
+
452
+ def file2rva offset, h = {}
449
453
  return nil if offset.nil?
450
454
 
451
455
  # a special case - PE without sections
@@ -465,6 +469,11 @@ class PEdump
465
469
  nil
466
470
  end
467
471
 
472
+ def file2va offset, h = {}
473
+ va = file2rva(offset, h)
474
+ va && (va + @pe.ioh.ImageBase.to_i)
475
+ end
476
+
468
477
  # OPTIONAL: assigns @mz, @rich_hdr, @pe, etc
469
478
  def dump f=@io
470
479
  if f.is_a?(String)
@@ -601,7 +610,7 @@ class PEdump
601
610
  return nil unless pe(f) && pe(f).ioh && f
602
611
 
603
612
  imports = imports(f)
604
- return nil if imports.empty?
613
+ return nil if imports.nil? || imports.empty?
605
614
 
606
615
  a = []
607
616
  imports.each do |iid|
@@ -628,7 +637,7 @@ class PEdump
628
637
  dir = @pe.ioh.DataDirectory[IMAGE_DATA_DIRECTORY::IMPORT]
629
638
  return [] if !dir || (dir.va == 0 && dir.size == 0)
630
639
 
631
- file_offset = va2file(dir.va)
640
+ file_offset = rva2file(dir.va)
632
641
  return nil unless file_offset
633
642
 
634
643
  # scan TLS first, to catch many fake imports trick from
@@ -636,7 +645,7 @@ class PEdump
636
645
  tls_aoi = nil
637
646
  if (tls = tls(f)) && tls.any?
638
647
  tls_aoi = tls.first.AddressOfIndex.to_i - @pe.ioh.ImageBase.to_i
639
- tls_aoi = tls_aoi > 0 ? va2file(tls_aoi) : nil
648
+ tls_aoi = tls_aoi > 0 ? rva2file(tls_aoi) : nil
640
649
  end
641
650
 
642
651
  r = []; t = nil
@@ -672,7 +681,7 @@ class PEdump
672
681
  @imports = @imports[0,iidx]
673
682
  break
674
683
  end
675
- if x.Name.to_i != 0 && (ofs = va2file(x.Name))
684
+ if x.Name.to_i != 0 && (ofs = rva2file(x.Name))
676
685
  begin
677
686
  f.seek ofs
678
687
  rescue
@@ -683,7 +692,7 @@ class PEdump
683
692
  end
684
693
  [:original_first_thunk, :first_thunk].each do |tbl|
685
694
  camel = tbl.capitalize.to_s.gsub(/_./){ |char| char[1..-1].upcase}
686
- if x[camel].to_i != 0 && (ofs = va2file(x[camel])) && f.checked_seek(ofs)
695
+ if x[camel].to_i != 0 && (ofs = rva2file(x[camel])) && f.checked_seek(ofs)
687
696
  x[tbl] ||= []
688
697
  if pe.x64?
689
698
  x[tbl] << t while (t = f.read(8).to_s.unpack('Q').first).to_i != 0
@@ -701,7 +710,7 @@ class PEdump
701
710
  cache[t] ||=
702
711
  if t & mask > 0 # 0x8000_0000(_0000_0000)
703
712
  ImportedFunction.new(nil,nil,t & (mask-1),va) # 0x7fff_ffff(_ffff_ffff)
704
- elsif ofs=va2file(t, :quiet => true)
713
+ elsif ofs=rva2file(t, :quiet => true)
705
714
  if !f.checked_seek(ofs) || f.eof?
706
715
  logger.warn "[?] import ofs 0x#{ofs.to_s(16)} VA=0x#{t.to_s(16)} beyond EOF"
707
716
  nil
@@ -788,7 +797,7 @@ class PEdump
788
797
  dir = @pe.ioh.DataDirectory[IMAGE_DATA_DIRECTORY::EXPORT]
789
798
  return nil if !dir || (dir.va == 0 && dir.size == 0)
790
799
  va = @pe.ioh.DataDirectory[IMAGE_DATA_DIRECTORY::EXPORT].va
791
- file_offset = va2file(va)
800
+ file_offset = rva2file(va)
792
801
  return nil unless file_offset
793
802
  if !f.checked_seek(file_offset) || f.eof?
794
803
  logger.warn "[?] exports info beyond EOF"
@@ -798,7 +807,7 @@ class PEdump
798
807
  x.entry_points = []
799
808
  x.name_ordinals = []
800
809
  x.names = []
801
- if x.Name.to_i != 0 && (ofs = va2file(x.Name))
810
+ if x.Name.to_i != 0 && (ofs = rva2file(x.Name))
802
811
  f.seek ofs
803
812
  if f.eof?
804
813
  logger.warn "[?] export ofs 0x#{ofs.to_s(16)} beyond EOF"
@@ -808,7 +817,7 @@ class PEdump
808
817
  end
809
818
  end
810
819
  if x.NumberOfFunctions.to_i > 0
811
- if x.AddressOfFunctions.to_i !=0 && (ofs = va2file(x.AddressOfFunctions))
820
+ if x.AddressOfFunctions.to_i !=0 && (ofs = rva2file(x.AddressOfFunctions))
812
821
  f.seek ofs
813
822
  x.entry_points = []
814
823
  x.NumberOfFunctions.times do
@@ -819,7 +828,7 @@ class PEdump
819
828
  x.entry_points << f.read(4).unpack('V').first
820
829
  end
821
830
  end
822
- if x.AddressOfNameOrdinals.to_i !=0 && (ofs = va2file(x.AddressOfNameOrdinals))
831
+ if x.AddressOfNameOrdinals.to_i !=0 && (ofs = rva2file(x.AddressOfNameOrdinals))
823
832
  f.seek ofs
824
833
  x.name_ordinals = []
825
834
  x.NumberOfNames.times do
@@ -831,7 +840,7 @@ class PEdump
831
840
  end
832
841
  end
833
842
  end
834
- if x.NumberOfNames.to_i > 0 && x.AddressOfNames.to_i !=0 && (ofs = va2file(x.AddressOfNames))
843
+ if x.NumberOfNames.to_i > 0 && x.AddressOfNames.to_i !=0 && (ofs = rva2file(x.AddressOfNames))
835
844
  f.seek ofs
836
845
  x.names = []
837
846
  x.NumberOfNames.times do
@@ -844,7 +853,7 @@ class PEdump
844
853
  nErrors = 0
845
854
  x.names.size.times do |i|
846
855
  begin
847
- f.seek va2file(x.names[i])
856
+ f.seek rva2file(x.names[i])
848
857
  x.names[i] = f.gets("\x00").to_s.chomp("\x00")
849
858
  rescue
850
859
  nErrors += 1
@@ -890,7 +899,7 @@ class PEdump
890
899
  begin
891
900
  dir = @pe.ioh.DataDirectory[IMAGE_DATA_DIRECTORY::TLS]
892
901
  return nil if !dir || dir.va == 0
893
- return nil unless file_offset = va2file(dir.va)
902
+ return nil unless file_offset = rva2file(dir.va)
894
903
  f.seek file_offset
895
904
  if f.eof?
896
905
  logger.info "[?] TLS info beyond EOF"
@@ -947,7 +956,10 @@ class PEdump
947
956
  ##############################################################################
948
957
 
949
958
  def tail f=@io
950
- tail_start = sections(f).map{ |s| s.PointerToRawData + s.SizeOfRawData }.max
959
+ secs = sections(f)
960
+ return nil if secs.nil? || secs.empty?
961
+
962
+ tail_start = secs.map{ |s| s.PointerToRawData + s.SizeOfRawData }.max
951
963
  if tail_start && tail_start < f.size
952
964
  f.seek tail_start
953
965
  f
data/pedump.gemspec CHANGED
@@ -1,94 +1,35 @@
1
- # Generated by juwelier
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: pedump 0.7.3 ruby lib
1
+ # frozen_string_literal: true
2
+
3
+ require 'English'
4
+ lib = File.expand_path('lib', __dir__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require 'pedump/version'
6
7
 
7
8
  Gem::Specification.new do |s|
8
- s.name = "pedump".freeze
9
- s.version = "0.7.3".freeze
9
+ s.name = 'pedump'
10
+ s.version = PEdump::VERSION
11
+ s.authors = ['Andrey "Zed" Zaikin']
12
+ s.email = 'zed.0xff@gmail.com'
13
+ s.homepage = 'http://github.com/zed-0xff/pedump'
14
+ s.license = 'MIT'
15
+ s.summary = 'dump win32 PE executable files with a pure ruby'
16
+ s.description = 'dump headers, sections, extract resources of win32 PE exe,dll,etc'
10
17
 
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 = "1980-01-02"
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
- "CODE_OF_CONDUCT.md",
24
- "Gemfile",
25
- "Gemfile.lock",
26
- "LICENSE.txt",
27
- "README.md",
28
- "Rakefile",
29
- "VERSION",
30
- "bin/pedump",
31
- "data/comp_id.txt",
32
- "data/fs.txt",
33
- "data/jc-userdb.txt",
34
- "data/ordlookup/oleaut32.dll.yml",
35
- "data/ordlookup/pefile2json.py",
36
- "data/ordlookup/ws2_32.dll.yml",
37
- "data/ordlookup/wsock32.dll.yml",
38
- "data/sig.bin",
39
- "data/signatures.txt",
40
- "data/userdb.txt",
41
- "lib/pedump.rb",
42
- "lib/pedump/cli.rb",
43
- "lib/pedump/clr.rb",
44
- "lib/pedump/clr/readytorun.rb",
45
- "lib/pedump/clr/signature.rb",
46
- "lib/pedump/comparer.rb",
47
- "lib/pedump/composite_io.rb",
48
- "lib/pedump/core.rb",
49
- "lib/pedump/core_ext/try.rb",
50
- "lib/pedump/loader.rb",
51
- "lib/pedump/loader/minidump.rb",
52
- "lib/pedump/loader/section.rb",
53
- "lib/pedump/logger.rb",
54
- "lib/pedump/ne.rb",
55
- "lib/pedump/ne/version_info.rb",
56
- "lib/pedump/ordlookup.rb",
57
- "lib/pedump/packer.rb",
58
- "lib/pedump/pe.rb",
59
- "lib/pedump/resources.rb",
60
- "lib/pedump/rich.rb",
61
- "lib/pedump/security.rb",
62
- "lib/pedump/sig_parser.rb",
63
- "lib/pedump/te.rb",
64
- "lib/pedump/tls.rb",
65
- "lib/pedump/unpacker.rb",
66
- "lib/pedump/unpacker/aspack.rb",
67
- "lib/pedump/unpacker/upx.rb",
68
- "lib/pedump/version.rb",
69
- "lib/pedump/version_info.rb",
70
- "misc/aspack/Makefile",
71
- "misc/aspack/aspack_unlzx.c",
72
- "misc/aspack/lzxdec.c",
73
- "misc/aspack/lzxdec.h",
74
- "misc/nedump.c",
75
- "pedump.gemspec"
76
- ]
77
- s.homepage = "http://github.com/zed-0xff/pedump".freeze
78
- s.licenses = ["MIT".freeze]
79
- s.rubygems_version = "3.6.9".freeze
80
- s.summary = "dump win32 PE executable files with a pure ruby".freeze
18
+ s.required_rubygems_version = Gem::Requirement.new('>= 0')
19
+ s.require_paths = ['lib']
81
20
 
82
- s.specification_version = 4
21
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
22
+ f.match(%r{^(samples|spec|tmp)/}) ||
23
+ f.match(/^\./) ||
24
+ f == 'README.md.tpl'
25
+ end
26
+ s.executables = ['pedump']
83
27
 
84
- s.add_runtime_dependency(%q<rainbow>.freeze, [">= 0".freeze])
85
- s.add_runtime_dependency(%q<awesome_print>.freeze, [">= 0".freeze])
86
- s.add_runtime_dependency(%q<iostruct>.freeze, [">= 0.5.0".freeze])
87
- s.add_runtime_dependency(%q<multipart-post>.freeze, [">= 2.0.0".freeze])
88
- s.add_runtime_dependency(%q<zhexdump>.freeze, [">= 0.0.2".freeze])
89
- s.add_development_dependency(%q<rspec>.freeze, [">= 0".freeze])
90
- s.add_development_dependency(%q<rspec-its>.freeze, [">= 0".freeze])
91
- s.add_development_dependency(%q<bundler>.freeze, [">= 0".freeze])
92
- s.add_development_dependency(%q<juwelier>.freeze, [">= 0".freeze])
93
- end
28
+ s.extra_rdoc_files = ['LICENSE.txt', 'README.md']
94
29
 
30
+ s.add_runtime_dependency 'logger'
31
+ s.add_runtime_dependency 'iostruct', '>= 0.7.0'
32
+ s.add_runtime_dependency 'zhexdump', '>= 0.0.2'
33
+
34
+ s.metadata['rubygems_mfa_required'] = 'true'
35
+ end
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.7.3
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey "Zed" Zaikin
@@ -10,21 +10,7 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: rainbow
14
- requirement: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - ">="
17
- - !ruby/object:Gem::Version
18
- version: '0'
19
- type: :runtime
20
- prerelease: false
21
- version_requirements: !ruby/object:Gem::Requirement
22
- requirements:
23
- - - ">="
24
- - !ruby/object:Gem::Version
25
- version: '0'
26
- - !ruby/object:Gem::Dependency
27
- name: awesome_print
13
+ name: logger
28
14
  requirement: !ruby/object:Gem::Requirement
29
15
  requirements:
30
16
  - - ">="
@@ -43,28 +29,14 @@ dependencies:
43
29
  requirements:
44
30
  - - ">="
45
31
  - !ruby/object:Gem::Version
46
- version: 0.5.0
47
- type: :runtime
48
- prerelease: false
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: 0.5.0
54
- - !ruby/object:Gem::Dependency
55
- name: multipart-post
56
- requirement: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: 2.0.0
32
+ version: 0.7.0
61
33
  type: :runtime
62
34
  prerelease: false
63
35
  version_requirements: !ruby/object:Gem::Requirement
64
36
  requirements:
65
37
  - - ">="
66
38
  - !ruby/object:Gem::Version
67
- version: 2.0.0
39
+ version: 0.7.0
68
40
  - !ruby/object:Gem::Dependency
69
41
  name: zhexdump
70
42
  requirement: !ruby/object:Gem::Requirement
@@ -79,62 +51,6 @@ dependencies:
79
51
  - - ">="
80
52
  - !ruby/object:Gem::Version
81
53
  version: 0.0.2
82
- - !ruby/object:Gem::Dependency
83
- name: rspec
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- type: :development
90
- prerelease: false
91
- version_requirements: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: '0'
96
- - !ruby/object:Gem::Dependency
97
- name: rspec-its
98
- requirement: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: '0'
103
- type: :development
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- - !ruby/object:Gem::Dependency
111
- name: bundler
112
- requirement: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: '0'
117
- type: :development
118
- prerelease: false
119
- version_requirements: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: '0'
124
- - !ruby/object:Gem::Dependency
125
- name: juwelier
126
- requirement: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: '0'
131
- type: :development
132
- prerelease: false
133
- version_requirements: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
54
  description: dump headers, sections, extract resources of win32 PE exe,dll,etc
139
55
  email: zed.0xff@gmail.com
140
56
  executables:
@@ -150,7 +66,6 @@ files:
150
66
  - LICENSE.txt
151
67
  - README.md
152
68
  - Rakefile
153
- - VERSION
154
69
  - bin/pedump
155
70
  - data/comp_id.txt
156
71
  - data/fs.txt
@@ -167,6 +82,7 @@ files:
167
82
  - lib/pedump/clr.rb
168
83
  - lib/pedump/clr/readytorun.rb
169
84
  - lib/pedump/clr/signature.rb
85
+ - lib/pedump/colors.rb
170
86
  - lib/pedump/comparer.rb
171
87
  - lib/pedump/composite_io.rb
172
88
  - lib/pedump/core.rb
@@ -175,6 +91,7 @@ files:
175
91
  - lib/pedump/loader/minidump.rb
176
92
  - lib/pedump/loader/section.rb
177
93
  - lib/pedump/logger.rb
94
+ - lib/pedump/multipart.rb
178
95
  - lib/pedump/ne.rb
179
96
  - lib/pedump/ne/version_info.rb
180
97
  - lib/pedump/ordlookup.rb
@@ -200,7 +117,8 @@ files:
200
117
  homepage: http://github.com/zed-0xff/pedump
201
118
  licenses:
202
119
  - MIT
203
- metadata: {}
120
+ metadata:
121
+ rubygems_mfa_required: 'true'
204
122
  rdoc_options: []
205
123
  require_paths:
206
124
  - lib
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.7.3