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 +4 -4
- data/lib/elfcat.rb +2 -0
- data/lib/elfcat/base.rb +21 -0
- data/lib/elfcat/elf.rb +8 -0
- data/lib/elfcat/programheader.rb +75 -0
- data/lib/elfcat/sectionname.rb +1 -1
- data/lib/elfcat/sectiontable.rb +14 -13
- data/lib/elfcat/stringtable.rb +24 -0
- data/lib/elfcat/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a9bfb99297cef606da82c0eee802dc08d6893e5e
|
|
4
|
+
data.tar.gz: a19611b558d5791421be87e8cb4ceb2b988b8792
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b10fa9efc667e85b9ce04ecde07d1ea852bf2ca5a517907a80f7fa682dd8380e38d332a7e21c83fe77dc73cdaf2345ad3a93536a2d1ee45ea64bece1351bb13e
|
|
7
|
+
data.tar.gz: eb5376b246c450682bee140f92d962a7f7af587b3d5cad9a619ede519624c41efa0e8c0f9fe7e365fd968c1eb81a6da38b8c7967592de933b7daac3ecdcc9809
|
data/lib/elfcat.rb
CHANGED
data/lib/elfcat/base.rb
CHANGED
|
@@ -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
|
data/lib/elfcat/elf.rb
CHANGED
|
@@ -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
|
data/lib/elfcat/sectionname.rb
CHANGED
data/lib/elfcat/sectiontable.rb
CHANGED
|
@@ -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
|
-
|
|
146
|
-
|
|
147
|
-
section_table_length =
|
|
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
|
-
|
|
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
|
data/lib/elfcat/version.rb
CHANGED
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.
|
|
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-
|
|
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
|