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 +4 -4
- data/lib/elfcat.rb +3 -0
- data/lib/elfcat/base.rb +16 -0
- data/lib/elfcat/elf.rb +17 -7
- data/lib/elfcat/fileheader.rb +11 -22
- data/lib/elfcat/sectionname.rb +24 -0
- data/lib/elfcat/sectiontable.rb +162 -0
- data/lib/elfcat/util.rb +1 -1
- data/lib/elfcat/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2af0dcf2cdde5ac558395bb31783939784fabbfb
|
|
4
|
+
data.tar.gz: 98f6a7933894897939d8f700ab8189c657ff0a00
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5b78661ce261c7b70ef2c6cc45f1e19bd9e419bf91fdcbb836e7763c39989b00423b422af612279e0f360fc13fb322eac56f32b8d61af86b2cdf95f2cecfc573
|
|
7
|
+
data.tar.gz: 64aa56a6cb44cec4f1a16113a3bc6214d7bbce22381ba8c4c3dc57b8151cde54711341dea520289d701d9cde6af45756496322b0bb3bd9f99886dc43e4d14daf
|
data/lib/elfcat.rb
CHANGED
data/lib/elfcat/base.rb
ADDED
data/lib/elfcat/elf.rb
CHANGED
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
class Elf
|
|
2
|
-
attr_reader :resource
|
|
3
|
-
|
|
4
2
|
def initialize _filepath
|
|
5
|
-
|
|
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
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
# @file_header.debug
|
|
24
|
+
def section_table_with_names
|
|
25
|
+
section_table.populate(section_names)
|
|
16
26
|
end
|
|
17
27
|
end
|
data/lib/elfcat/fileheader.rb
CHANGED
|
@@ -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
|
|
27
|
-
|
|
28
|
-
|
|
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(
|
|
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
|
data/lib/elfcat/util.rb
CHANGED
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.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-
|
|
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
|