elfcat 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 276bf0fda31cc2596108a360c7d483a99988c715
4
- data.tar.gz: 2465da17762b16996a40e4ada39d36f6f2b5694f
3
+ metadata.gz: 2af0dcf2cdde5ac558395bb31783939784fabbfb
4
+ data.tar.gz: 98f6a7933894897939d8f700ab8189c657ff0a00
5
5
  SHA512:
6
- metadata.gz: c11781b78a9749023ab7bc203b3a3a0680dc3ca969be8140317ecf3fff81360ee79f26cb6d5e4b9990438c18f7c2650a0a75035f622a7a40c6ae57edf99fc7dc
7
- data.tar.gz: b5ac3b81824aad30faad99f5ab1e94333ce6125dc905f4624a05fcff6f516650254782e4259c9de1862845d379754b9125c3eb91b037630086ba8d68cc64147a
6
+ metadata.gz: 5b78661ce261c7b70ef2c6cc45f1e19bd9e419bf91fdcbb836e7763c39989b00423b422af612279e0f360fc13fb322eac56f32b8d61af86b2cdf95f2cecfc573
7
+ data.tar.gz: 64aa56a6cb44cec4f1a16113a3bc6214d7bbce22381ba8c4c3dc57b8151cde54711341dea520289d701d9cde6af45756496322b0bb3bd9f99886dc43e4d14daf
@@ -1,7 +1,10 @@
1
1
  require "cute-hex"
2
2
  require "elfcat/version"
3
3
  require "elfcat/util"
4
+ require "elfcat/base"
4
5
  require "elfcat/fileheader"
6
+ require "elfcat/sectiontable"
7
+ require "elfcat/sectionname"
5
8
 
6
9
  module Elfcat
7
10
  end
@@ -0,0 +1,16 @@
1
+ class Base
2
+ attr_reader :data, :debug
3
+
4
+ def initialize
5
+ @data = Hash.new
6
+ @debug = Proc.new { self.debug }
7
+ end
8
+
9
+ def method_missing _method
10
+ return @data[_method][:data]
11
+ end
12
+
13
+ def [](_name)
14
+ return @data[_name]
15
+ end
16
+ end
@@ -1,17 +1,27 @@
1
1
  class Elf
2
- attr_reader :resource
3
-
4
2
  def initialize _filepath
5
- @resource = File.binread _filepath
3
+ $resource = File.binread _filepath
6
4
 
7
5
  return self
8
6
  end
9
7
 
10
8
  def file_header
11
- @file_header ||= FileHeader.new(@resource.slice_with_index(0, 64))
9
+ @file_header ||= FileHeader.new
10
+ end
11
+
12
+ def resource
13
+ return $resource
14
+ end
15
+
16
+ def section_table
17
+ @section_table ||= SectionTable.new(file_header)
18
+ end
19
+
20
+ def section_names
21
+ @section_names ||= SectionName.new(file_header, section_table)
22
+ end
12
23
 
13
- # ap @file_header.ei_magic_number
14
- # ap @file_header[:ei_magic_number]
15
- # @file_header.debug
24
+ def section_table_with_names
25
+ section_table.populate(section_names)
16
26
  end
17
27
  end
@@ -1,13 +1,11 @@
1
- class FileHeader
2
- attr_reader :file_header
3
-
1
+ class FileHeader < Base
4
2
  FH = {
5
3
  ei_magic_number: [0x00,4],
6
- ei_class: [0x04],
7
- ei_data: [0x05],
8
- ei_version: [0x06],
9
- ei_osabi: [0x07],
10
- ei_abiversion: [0x08],
4
+ ei_class: [0x04,1],
5
+ ei_data: [0x05,1],
6
+ ei_version: [0x06,1],
7
+ ei_osabi: [0x07,1],
8
+ ei_abiversion: [0x08,1],
11
9
  e_type: [0x10,2],
12
10
  e_machine: [0x12,2],
13
11
  e_version: [0x14,4],
@@ -23,28 +21,19 @@ class FileHeader
23
21
  e_shstrndx: [0x32,2]
24
22
  }
25
23
 
26
- def initialize _x
27
- @data = Hash.new
28
- @debug = Proc.new{self.debug}
24
+ def initialize
25
+ super
26
+ x = $resource.slice_with_index(0, 64)
29
27
 
30
28
  FH.each do |k, v|
31
- @data[k] = Util.concatenate(_x, v[0], v[1] || 1)
29
+ @data[k] = Util.concatenate(x, v[0], v[1])
32
30
  end
33
31
  end
34
32
 
35
- def method_missing _method
36
- puts "i'm called"
37
- return @data[_method][:data]
38
- end
39
-
40
- def [](_name)
41
- return @data[_name]
42
- end
43
-
44
33
  def debug
45
34
  @data.each do |k, d|
46
35
  k_s = sprintf("%32s", k)
47
- puts "#{k_s} #{CuteHex.x d.data}"
36
+ puts "#{k_s}: #{CuteHex.x d.data, slicer: :byte, word_size: (FH[k][1] * 8), style: :data, pad_zeros: true}"
48
37
  end
49
38
  end
50
39
  end
@@ -0,0 +1,24 @@
1
+ class SectionName < Base
2
+ def initialize _fh, _st
3
+ super()
4
+ parse _fh, _st
5
+ end
6
+
7
+ def debug
8
+ @data.each_with_index do |x, i|
9
+ index_s = sprintf("%4d", i)
10
+ name_s = sprintf("%s", x)
11
+
12
+ puts "#{index_s} | #{name_s}"
13
+ end
14
+ end
15
+
16
+ private
17
+ def parse _fh, _st
18
+ entry = _st[_fh.e_shstrndx]
19
+ base_elf_address = entry.sh_offset
20
+ length = entry.sh_size
21
+
22
+ @data = $resource.slice(base_elf_address, length).split(/\x0/).dup
23
+ end
24
+ end
@@ -0,0 +1,162 @@
1
+ class SectionTable < Base
2
+ SH = {
3
+ sh_name: [0x00, 4],
4
+ sh_type: [0x04, 4],
5
+ sh_flags: [0x08, 4],
6
+ sh_addr: [0x0C, 4],
7
+ sh_offset: [0x10, 4],
8
+ sh_size: [0x14, 4],
9
+ sh_link: [0x18, 4],
10
+ sh_info: [0x1C, 4],
11
+ sh_addralign: [0x20, 4],
12
+ sh_entsize: [0x24, 4]
13
+ }
14
+
15
+ LUT_SHN = {
16
+ 0 => 'SHN_UNDEF',
17
+ 0xff00 => 'SHN_LORESERVE',
18
+ 0xff00 => 'SHN_LOPROC',
19
+ 0xff00 => 'SHN_BEFORE',
20
+ 0xff01 => 'SHN_AFTER',
21
+ 0xff02 => 'SHN_AMD64_LCOMMON',
22
+ 0xff1f => 'SHN_HIPROC',
23
+ 0xff20 => 'SHN_LOOS',
24
+ 0xff3f => 'SHN_LOSUNW',
25
+ 0xff3f => 'SHN_SUNW_IGNORE',
26
+ 0xff3f => 'SHN_HISUNW',
27
+ 0xff3f => 'SHN_HIOS',
28
+ 0xfff1 => 'SHN_ABS',
29
+ 0xfff2 => 'SHN_COMMON',
30
+ 0xffff => 'SHN_XINDEX',
31
+ 0xffff => 'SHN_HIRESERVE',
32
+ }
33
+
34
+ LUT_SH_FLAGS = {
35
+ 0x1 => 'SHF_WRITE',
36
+ 0x2 => 'SHF_ALLOC',
37
+ 0x4 => 'SHF_EXECINSTR',
38
+ 0x10 => 'SHF_MERGE',
39
+ 0x20 => 'SHF_STRINGS',
40
+ 0x40 => 'SHF_INFO_LINK',
41
+ 0x80 => 'SHF_LINK_ORDER',
42
+ 0x100 => 'SHF_OS_NONCONFORMING',
43
+ 0x200 => 'SHF_GROUP',
44
+ 0x400 => 'SHF_TLS',
45
+ 0x0ff00000 => 'SHF_MASKOS',
46
+ 0x10000000 => 'SHF_AMD64_LARGE',
47
+ 0x40000000 => 'SHF_ORDERED',
48
+ 0x80000000 => 'SHF_EXCLUDE',
49
+ 0xf0000000 => 'SHF_MASKPROC'
50
+ }
51
+
52
+ LUT_SH_TYPE = {
53
+ 0 => 'SHT_NULL',
54
+ 1 => 'SHT_PROGBITS',
55
+ 2 => 'SHT_SYMTAB',
56
+ 3 => 'SHT_STRTAB',
57
+ 4 => 'SHT_RELA',
58
+ 5 => 'SHT_HASH',
59
+ 6 => 'SHT_DYNAMIC',
60
+ 7 => 'SHT_NOTE',
61
+ 8 => 'SHT_NOBITS',
62
+ 9 => 'SHT_REL',
63
+ 10 => 'SHT_SHLIB',
64
+ 11 => 'SHT_DYNSYM',
65
+ 14 => 'SHT_INIT_ARRAY',
66
+ 15 => 'SHT_FINI_ARRAY',
67
+ 16 => 'SHT_PREINIT_ARRAY',
68
+ 17 => 'SHT_GROUP',
69
+ 18 => 'SHT_SYMTAB_SHNDX',
70
+ 0x60000000 => 'SHT_LOOS',
71
+ 0x6fffffef => 'SHT_LOSUNW',
72
+ 0x6fffffef => 'SHT_SUNW_capchain',
73
+ 0x6ffffff0 => 'SHT_SUNW_capinfo',
74
+ 0x6ffffff1 => 'SHT_SUNW_symsort',
75
+ 0x6ffffff2 => 'SHT_SUNW_tlssort',
76
+ 0x6ffffff3 => 'SHT_SUNW_LDYNSYM',
77
+ 0x6ffffff4 => 'SHT_SUNW_dof',
78
+ 0x6ffffff5 => 'SHT_SUNW_cap',
79
+ 0x6ffffff6 => 'SHT_SUNW_SIGNATURE',
80
+ 0x6ffffff7 => 'SHT_SUNW_ANNOTATE',
81
+ 0x6ffffff8 => 'SHT_SUNW_DEBUGSTR',
82
+ 0x6ffffff9 => 'SHT_SUNW_DEBUG',
83
+ 0x6ffffffa => 'SHT_SUNW_move',
84
+ 0x6ffffffb => 'SHT_SUNW_COMDAT',
85
+ 0x6ffffffc => 'SHT_SUNW_syminfo',
86
+ 0x6ffffffd => 'SHT_SUNW_verdef',
87
+ 0x6ffffffe => 'SHT_SUNW_verneed',
88
+ 0x6fffffff => 'SHT_SUNW_versym',
89
+ 0x6fffffff => 'SHT_HISUNW',
90
+ 0x6fffffff => 'SHT_HIOS',
91
+ 0x70000000 => 'SHT_LOPROC',
92
+ 0x70000000 => 'SHT_SPARC_GOTDATA',
93
+ 0x70000001 => 'SHT_AMD64_UNWIND',
94
+ 0x7fffffff => 'SHT_HIPROC',
95
+ 0x80000000 => 'SHT_LOUSER',
96
+ 0xffffffff => 'SHT_HIUSER'
97
+ }
98
+
99
+ def initialize _fh
100
+ super()
101
+ @index = Hash.new
102
+
103
+ parse _fh
104
+ end
105
+
106
+ def populate _sn
107
+ @data.each do |k, d|
108
+ @data[k][:sh_real_name] = _sn[k]
109
+ end
110
+
111
+ return self
112
+ end
113
+
114
+ def debug
115
+ @data.each_with_index do |(k, d), i|
116
+ print_debug_header(d.sh_real_name) if i % 64 == 0
117
+ index_s = sprintf("%4d", k)
118
+ sh_name_index_s = d.sh_real_name ? sprintf("%-16.16s", d.sh_real_name) : sprintf("%4X", d.sh_name)
119
+ sh_type_enum_s = sprintf("%-8.8s", LUT_SH_TYPE[d.sh_type] || d.sh_type)
120
+ sh_flag_enum_s = sprintf("%-8.8s", LUT_SH_FLAGS[d.sh_flags] || d.sh_flags)
121
+ sh_mem_address_s = CuteHex.x d.sh_addr
122
+ sh_elf_address_s = CuteHex.x d.sh_offset
123
+ sh_size_s = sprintf("%8d", d.sh_size)
124
+
125
+ puts "#{index_s} | #{sh_name_index_s} #{sh_type_enum_s} #{sh_flag_enum_s} | #{sh_mem_address_s} #{sh_elf_address_s} #{sh_size_s}"
126
+ end
127
+ end
128
+
129
+ private
130
+ def print_debug_header _has_real_name = false
131
+ case _has_real_name
132
+ when false
133
+ puts "----------------------------------------------------------------"
134
+ puts " IDX | nidx type flag | mem_addr elf_addr size (B)"
135
+ puts "----------------------------------------------------------------"
136
+ else
137
+ puts "----------------------------------------------------------------------------"
138
+ puts " IDX | name type flag | mem_addr elf_addr size (B)"
139
+ puts "----------------------------------------------------------------------------"
140
+ end
141
+ end
142
+
143
+ def parse _fh
144
+ base_elf_address = _fh.e_shoff
145
+ entry_element_size = _fh.e_shentsize
146
+ entry_count = _fh.e_shnum
147
+ section_table_length = entry_element_size * entry_count
148
+
149
+ x = $resource.slice_with_index(base_elf_address, section_table_length)
150
+
151
+ entry_count.times do |i|
152
+ st = Hash.new
153
+ struct_address = i * entry_element_size
154
+
155
+ SH.each do |k, v|
156
+ st[k] = Util.concatenate(x, struct_address + v[0], v[1])
157
+ end
158
+
159
+ @data[i] = st.dup
160
+ end
161
+ end
162
+ end
@@ -14,7 +14,7 @@ end
14
14
 
15
15
  class Hash
16
16
  def method_missing _method
17
- return self[_method]
17
+ return self[_method].is_a?(Hash) ? self[_method][:data] : self[_method]
18
18
  end
19
19
  end
20
20
 
@@ -1,3 +1,3 @@
1
1
  module Elfcat
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elfcat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gloria Budiman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-22 00:00:00.000000000 Z
11
+ date: 2016-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cute-hex
@@ -85,8 +85,11 @@ files:
85
85
  - bin/setup
86
86
  - elfcat.gemspec
87
87
  - lib/elfcat.rb
88
+ - lib/elfcat/base.rb
88
89
  - lib/elfcat/elf.rb
89
90
  - lib/elfcat/fileheader.rb
91
+ - lib/elfcat/sectionname.rb
92
+ - lib/elfcat/sectiontable.rb
90
93
  - lib/elfcat/util.rb
91
94
  - lib/elfcat/version.rb
92
95
  homepage: https://github.com/gbudiman/elfcat