elfcat 0.0.2 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2af0dcf2cdde5ac558395bb31783939784fabbfb
4
- data.tar.gz: 98f6a7933894897939d8f700ab8189c657ff0a00
3
+ metadata.gz: a9bfb99297cef606da82c0eee802dc08d6893e5e
4
+ data.tar.gz: a19611b558d5791421be87e8cb4ceb2b988b8792
5
5
  SHA512:
6
- metadata.gz: 5b78661ce261c7b70ef2c6cc45f1e19bd9e419bf91fdcbb836e7763c39989b00423b422af612279e0f360fc13fb322eac56f32b8d61af86b2cdf95f2cecfc573
7
- data.tar.gz: 64aa56a6cb44cec4f1a16113a3bc6214d7bbce22381ba8c4c3dc57b8151cde54711341dea520289d701d9cde6af45756496322b0bb3bd9f99886dc43e4d14daf
6
+ metadata.gz: b10fa9efc667e85b9ce04ecde07d1ea852bf2ca5a517907a80f7fa682dd8380e38d332a7e21c83fe77dc73cdaf2345ad3a93536a2d1ee45ea64bece1351bb13e
7
+ data.tar.gz: eb5376b246c450682bee140f92d962a7f7af587b3d5cad9a619ede519624c41efa0e8c0f9fe7e365fd968c1eb81a6da38b8c7967592de933b7daac3ecdcc9809
@@ -5,6 +5,8 @@ require "elfcat/base"
5
5
  require "elfcat/fileheader"
6
6
  require "elfcat/sectiontable"
7
7
  require "elfcat/sectionname"
8
+ require "elfcat/stringtable"
9
+ require "elfcat/programheader"
8
10
 
9
11
  module Elfcat
10
12
  end
@@ -13,4 +13,25 @@ class Base
13
13
  def [](_name)
14
14
  return @data[_name]
15
15
  end
16
+
17
+ def debug
18
+ raise RuntimeError, "Base::debug() is stubbed. Please override this method"
19
+ end
20
+
21
+ def parse_struct _struct, _resource, _element_count, _element_size
22
+ _element_count.times do |i|
23
+ st = Hash.new
24
+ struct_address = i * _element_size
25
+
26
+ _struct.each do |k, v|
27
+ st[k] = Util.concatenate(_resource, struct_address + v[0], v[1])
28
+ end
29
+
30
+ @data[i] = st.dup
31
+ end
32
+ end
33
+
34
+ def parse_slice _address, _length
35
+ return $resource.slice(_address, _length).split(/\x0/).dup
36
+ end
16
37
  end
@@ -13,6 +13,10 @@ class Elf
13
13
  return $resource
14
14
  end
15
15
 
16
+ def program_header
17
+ @program_header ||= ProgramHeader.new(file_header, section_table_with_names)
18
+ end
19
+
16
20
  def section_table
17
21
  @section_table ||= SectionTable.new(file_header)
18
22
  end
@@ -24,4 +28,8 @@ class Elf
24
28
  def section_table_with_names
25
29
  section_table.populate(section_names)
26
30
  end
31
+
32
+ def string_table
33
+ @string_table ||= StringTable.new(section_table_with_names)
34
+ end
27
35
  end
@@ -0,0 +1,75 @@
1
+ class ProgramHeader < Base
2
+ PH = {
3
+ p_type: [0x00, 4],
4
+ p_offset: [0x04, 4],
5
+ p_vaddr: [0x08, 4],
6
+ p_paddr: [0x0C, 4],
7
+ p_filesz: [0x10, 4],
8
+ p_memsz: [0x14, 4],
9
+ p_flags: [0x18, 4],
10
+ p_align: [0x1C, 4]
11
+ }
12
+
13
+ def initialize _fh, _st
14
+ super()
15
+ parse _fh
16
+ populate _st
17
+ end
18
+
19
+ def debug
20
+ @data.each_with_index do |(k, d), i|
21
+ print_debug_header if i % 64 == 0
22
+ index_s = sprintf("%4d", k)
23
+
24
+ real_name_s = sprintf("%-16.16s", d.real_name)
25
+
26
+ elf_address_s = CuteHex.x d.p_offset
27
+ elf_size_s = sprintf("%8d", d.p_filesz)
28
+
29
+ virtual_address_s = CuteHex.x d.p_vaddr
30
+ physical_address_s = CuteHex.x d.p_paddr
31
+ mem_size_s = sprintf("%8d", d.p_memsz)
32
+
33
+ puts "#{index_s} | #{real_name_s} #{elf_address_s} (#{elf_size_s}) | #{virtual_address_s} (#{mem_size_s})"
34
+ end
35
+ end
36
+
37
+ private
38
+ def print_debug_header
39
+ puts "----------------------------------------------------------------------------"
40
+ puts " IDX | section_name elf_addr ( size B) | mem_addr ( size B)"
41
+ puts "----------------------------------------------------------------------------"
42
+ end
43
+
44
+ def parse _fh
45
+ base_elf_address = _fh.e_phoff
46
+ struct_element_size = _fh.e_phentsize
47
+ struct_count = _fh.e_phnum
48
+ total_program_header_length = struct_count * struct_element_size
49
+
50
+ x = $resource.slice_with_index(base_elf_address, total_program_header_length)
51
+
52
+ parse_struct(PH, x, struct_count, struct_element_size)
53
+ end
54
+
55
+ def populate _st
56
+ @data.each do |k, d|
57
+ @data[k][:real_name] = Proc.new {
58
+ if d.p_filesz == 0 and d.memsz == 0
59
+ raise RuntimeError, 'Unexpected empty elf and mem'
60
+ elsif d.p_filesz > 0 and d.p_offset > 0
61
+ _st.addresses[d.p_vaddr]
62
+ elsif d.p_memsz > 0 and d.p_vaddr > 0
63
+ _st.addresses[d.p_offset]
64
+ # else
65
+ # name_by_elf = _st.addresses[d.p_offset]
66
+ # name_by_mem = _st.addresses[d.p_vaddr]
67
+
68
+ # if d.p_vaddr > 0 and d.p_offset > 0
69
+ # raise RuntimeError, "Mismatch elf and mem name #{name_by_elf} | #{name_by_mem}" if name_by_elf != name_by_mem
70
+ # end
71
+ end
72
+ }.call
73
+ end
74
+ end
75
+ end
@@ -19,6 +19,6 @@ private
19
19
  base_elf_address = entry.sh_offset
20
20
  length = entry.sh_size
21
21
 
22
- @data = $resource.slice(base_elf_address, length).split(/\x0/).dup
22
+ @data = parse_slice(base_elf_address, length)
23
23
  end
24
24
  end
@@ -1,4 +1,6 @@
1
1
  class SectionTable < Base
2
+ attr_reader :index, :addresses
3
+
2
4
  SH = {
3
5
  sh_name: [0x00, 4],
4
6
  sh_type: [0x04, 4],
@@ -99,6 +101,7 @@ class SectionTable < Base
99
101
  def initialize _fh
100
102
  super()
101
103
  @index = Hash.new
104
+ @addresses = Hash.new
102
105
 
103
106
  parse _fh
104
107
  end
@@ -106,11 +109,18 @@ class SectionTable < Base
106
109
  def populate _sn
107
110
  @data.each do |k, d|
108
111
  @data[k][:sh_real_name] = _sn[k]
112
+ @index[_sn[k]] = k
113
+ @addresses[d.sh_addr] = _sn[k]
114
+ @addresses[d.sh_offset] = _sn[k]
109
115
  end
110
116
 
111
117
  return self
112
118
  end
113
119
 
120
+ def get_by_index _n
121
+ return @data[@index[_n]]
122
+ end
123
+
114
124
  def debug
115
125
  @data.each_with_index do |(k, d), i|
116
126
  print_debug_header(d.sh_real_name) if i % 64 == 0
@@ -142,21 +152,12 @@ private
142
152
 
143
153
  def parse _fh
144
154
  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
155
+ struct_element_size = _fh.e_shentsize
156
+ struct_count = _fh.e_shnum
157
+ section_table_length = struct_element_size * struct_count
148
158
 
149
159
  x = $resource.slice_with_index(base_elf_address, section_table_length)
150
160
 
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
+ parse_struct(SH, x, struct_count, struct_element_size)
161
162
  end
162
163
  end
@@ -0,0 +1,24 @@
1
+ class StringTable < Base
2
+ def initialize _st
3
+ super()
4
+ parse _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 _st
18
+ entry = _st.get_by_index('.strtab')
19
+ base_elf_address = entry.sh_offset
20
+ length = entry.sh_size
21
+
22
+ @data = parse_slice(base_elf_address, length)
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module Elfcat
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
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.2
4
+ version: 0.0.3
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-23 00:00:00.000000000 Z
11
+ date: 2016-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cute-hex
@@ -88,8 +88,10 @@ files:
88
88
  - lib/elfcat/base.rb
89
89
  - lib/elfcat/elf.rb
90
90
  - lib/elfcat/fileheader.rb
91
+ - lib/elfcat/programheader.rb
91
92
  - lib/elfcat/sectionname.rb
92
93
  - lib/elfcat/sectiontable.rb
94
+ - lib/elfcat/stringtable.rb
93
95
  - lib/elfcat/util.rb
94
96
  - lib/elfcat/version.rb
95
97
  homepage: https://github.com/gbudiman/elfcat