1 #include <r_types.h>
2 #include <r_util.h>
3 #include <r_lib.h>
4 #include <r_bin.h>
5 
6 #include "elf_specs.h"
7 
8 #ifndef _INCLUDE_ELF_H_
9 #define _INCLUDE_ELF_H_
10 
11 #define R_BIN_ELF_SCN_IS_EXECUTABLE(x) x & SHF_EXECINSTR
12 #define R_BIN_ELF_SCN_IS_READABLE(x)   x & SHF_ALLOC
13 #define R_BIN_ELF_SCN_IS_WRITABLE(x)   x & SHF_WRITE
14 
15 #define R_BIN_ELF_SYMTAB_SYMBOLS 1 << 0
16 #define R_BIN_ELF_DYNSYM_SYMBOLS 1 << 1
17 #define R_BIN_ELF_IMPORT_SYMBOLS (1 << 2 | (bin->ehdr.e_type == ET_REL ? R_BIN_ELF_SYMTAB_SYMBOLS : R_BIN_ELF_DYNSYM_SYMBOLS))
18 #define R_BIN_ELF_ALL_SYMBOLS (R_BIN_ELF_SYMTAB_SYMBOLS | R_BIN_ELF_DYNSYM_SYMBOLS)
19 #define ELFOBJ struct Elf_(r_bin_elf_obj_t)
20 
21 #if R_BIN_ELF64
22 #define R_BIN_ELF_WORDSIZE 0x8
23 #define R_BIN_ELF_WORD_MAX UT64_MAX
24 #define R_BIN_ELF_READWORD(x, i) READ64 (x, i)
25 #define R_BIN_ELF_BREADWORD(x, i) BREAD64 (x, i)
26 #define R_BIN_ELF_ADDR_MAX UT64_MAX
27 #define R_BIN_ELF_XWORD_MAX UT64_MAX
28 #else
29 #define R_BIN_ELF_WORDSIZE 0x4
30 #define R_BIN_ELF_WORD_MAX UT32_MAX
31 #define R_BIN_ELF_READWORD(x, i) READ32 (x, i)
32 #define R_BIN_ELF_BREADWORD(x, i) BREAD32 (x, i)
33 #define R_BIN_ELF_ADDR_MAX UT32_MAX
34 #define R_BIN_ELF_XWORD_MAX UT64_MAX
35 #endif
36 
37 
38 typedef struct r_bin_elf_section_t {
39 	ut64 offset;
40 	ut64 rva;
41 	ut64 size;
42 	ut64 align;
43 	ut32 flags;
44 	ut32 link;
45 	ut32 info;
46 	char name[ELF_STRING_LENGTH];
47 	int last;
48 	int type;
49 } RBinElfSection;
50 
51 typedef struct r_bin_elf_symbol_t {
52 	ut64 offset;
53 	ut64 size;
54 	ut32 ordinal;
55 	const char *bind;
56 	const char *type;
57 	char name[ELF_STRING_LENGTH];
58 	char libname[ELF_STRING_LENGTH];
59 	int last;
60 	bool in_shdr;
61 	bool is_sht_null;
62 	bool is_vaddr; /* when true, offset is virtual address, otherwise it's physical */
63 	bool is_imported;
64 } RBinElfSymbol;
65 
66 typedef struct r_bin_elf_reloc_t {
67 	int sym;
68 	int type;
69 	Elf_(Xword) rel_mode;
70 	st64 addend;
71 	ut64 offset;
72 	ut64 rva;
73 	ut16 section;
74 	int last;
75 	ut64 sto;
76 } RBinElfReloc;
77 
78 typedef struct r_bin_elf_field_t {
79 	ut64 offset;
80 	char name[ELF_STRING_LENGTH];
81 	int last;
82 } RBinElfField;
83 
84 typedef struct r_bin_elf_string_t {
85 	ut64 offset;
86 	ut64 size;
87 	char type;
88 	char string[ELF_STRING_LENGTH];
89 	int last;
90 } RBinElfString;
91 
92 typedef struct Elf_(r_bin_elf_dynamic_info) {
93 	Elf_(Xword) dt_pltrelsz;
94 	Elf_(Addr) dt_pltgot;
95 	Elf_(Addr) dt_hash;
96 	Elf_(Addr) dt_strtab;
97 	Elf_(Addr) dt_symtab;
98 	Elf_(Addr) dt_rela;
99 	Elf_(Xword) dt_relasz;
100 	Elf_(Xword) dt_relaent;
101 	Elf_(Xword) dt_strsz;
102 	Elf_(Xword) dt_syment;
103 	Elf_(Addr) dt_fini;
104 	Elf_(Addr) dt_rel;
105 	Elf_(Xword) dt_relsz;
106 	Elf_(Xword) dt_relent;
107 	Elf_(Xword) dt_pltrel;
108 	Elf_(Addr) dt_jmprel;
109 	Elf_(Addr) dt_mips_pltgot;
110 	bool dt_bind_now;
111 	Elf_(Xword) dt_flags;
112 	Elf_(Xword) dt_flags_1;
113 	Elf_(Xword) dt_rpath;
114 	Elf_(Xword) dt_runpath;
115 	RVector dt_needed;
116 } RBinElfDynamicInfo;
117 
118 typedef struct r_bin_elf_lib_t {
119 	char name[ELF_STRING_LENGTH];
120 	int last;
121 } RBinElfLib;
122 
Elf_(r_bin_elf_obj_t)123 struct Elf_(r_bin_elf_obj_t) {
124 	Elf_(Ehdr) ehdr;
125 	Elf_(Phdr) *phdr;
126 	Elf_(Shdr) *shdr;
127 
128 	Elf_(Shdr) *strtab_section;
129 	ut64 strtab_size;
130 	char *strtab;
131 
132 	Elf_(Shdr) *shstrtab_section;
133 	ut64 shstrtab_size;
134 	char *shstrtab;
135 
136 	RBinElfDynamicInfo dyn_info;
137 
138 	ut64 version_info[DT_VERSIONTAGNUM];
139 
140 	char *dynstr;
141 	ut32 dynstr_size;
142 
143 	RBinImport **imports_by_ord;
144 	size_t imports_by_ord_size;
145 	RBinSymbol **symbols_by_ord;
146 	size_t symbols_by_ord_size;
147 
148 	int bss;
149 	ut64 size;
150 	ut64 baddr;
151 	ut64 boffset;
152 	int endian;
153 	bool verbose;
154 	const char* file;
155 	RBuffer *b;
156 	Sdb *kv;
157 	/*cache purpose*/
158 	RBinElfSection *g_sections;
159 	RBinElfSymbol *g_symbols;
160 	RBinElfSymbol *g_imports;
161 	RBinElfReloc *g_relocs;
162 	ut32 g_reloc_num;
163 	RBinElfSymbol *phdr_symbols;
164 	RBinElfSymbol *phdr_imports;
165 	HtUP *rel_cache;
166 };
167 
168 int Elf_(r_bin_elf_has_va)(struct Elf_(r_bin_elf_obj_t) *bin);
169 ut64 Elf_(r_bin_elf_get_section_addr)(struct Elf_(r_bin_elf_obj_t) *bin, const char *section_name);
170 ut64 Elf_(r_bin_elf_get_section_offset)(struct Elf_(r_bin_elf_obj_t) *bin, const char *section_name);
171 ut64 Elf_(r_bin_elf_get_baddr)(struct Elf_(r_bin_elf_obj_t) *bin);
172 ut64 Elf_(r_bin_elf_p2v)(struct Elf_(r_bin_elf_obj_t) *bin, ut64 paddr);
173 ut64 Elf_(r_bin_elf_v2p)(struct Elf_(r_bin_elf_obj_t) *bin, ut64 vaddr);
174 ut64 Elf_(r_bin_elf_p2v_new)(struct Elf_(r_bin_elf_obj_t) *bin, ut64 paddr);
175 ut64 Elf_(r_bin_elf_v2p_new)(struct Elf_(r_bin_elf_obj_t) *bin, ut64 vaddr);
176 ut64 Elf_(r_bin_elf_get_boffset)(struct Elf_(r_bin_elf_obj_t) *bin);
177 ut64 Elf_(r_bin_elf_get_entry_offset)(struct Elf_(r_bin_elf_obj_t) *bin);
178 ut64 Elf_(r_bin_elf_get_main_offset)(struct Elf_(r_bin_elf_obj_t) *bin);
179 ut64 Elf_(r_bin_elf_get_init_offset)(struct Elf_(r_bin_elf_obj_t) *bin);
180 ut64 Elf_(r_bin_elf_get_fini_offset)(struct Elf_(r_bin_elf_obj_t) *bin);
181 char *Elf_(r_bin_elf_intrp)(struct Elf_(r_bin_elf_obj_t) *bin);
182 char *Elf_(r_bin_elf_compiler)(ELFOBJ *bin);
183 bool Elf_(r_bin_elf_get_stripped)(struct Elf_(r_bin_elf_obj_t) *bin);
184 bool Elf_(r_bin_elf_is_static)(struct Elf_(r_bin_elf_obj_t) *bin);
185 char* Elf_(r_bin_elf_get_data_encoding)(struct Elf_(r_bin_elf_obj_t) *bin);
186 char* Elf_(r_bin_elf_get_arch)(struct Elf_(r_bin_elf_obj_t) *bin);
187 char* Elf_(r_bin_elf_get_machine_name)(struct Elf_(r_bin_elf_obj_t) *bin);
188 char* Elf_(r_bin_elf_get_head_flag)(ELFOBJ *bin); //yin
189 char* Elf_(r_bin_elf_get_abi)(ELFOBJ *bin);
190 char* Elf_(r_bin_elf_get_cpu)(ELFOBJ *bin);
191 char* Elf_(r_bin_elf_get_file_type)(struct Elf_(r_bin_elf_obj_t) *bin);
192 char* Elf_(r_bin_elf_get_elf_class)(struct Elf_(r_bin_elf_obj_t) *bin);
193 int Elf_(r_bin_elf_get_bits)(struct Elf_(r_bin_elf_obj_t) *bin);
194 char* Elf_(r_bin_elf_get_osabi_name)(struct Elf_(r_bin_elf_obj_t) *bin);
195 int Elf_(r_bin_elf_is_big_endian)(struct Elf_(r_bin_elf_obj_t) *bin);
196 RBinElfReloc* Elf_(r_bin_elf_get_relocs)(struct Elf_(r_bin_elf_obj_t) *bin);
197 RBinElfLib* Elf_(r_bin_elf_get_libs)(struct Elf_(r_bin_elf_obj_t) *bin);
198 RBinElfSection* Elf_(r_bin_elf_get_sections)(struct Elf_(r_bin_elf_obj_t) *bin);
199 RBinElfSymbol* Elf_(r_bin_elf_get_symbols)(struct Elf_(r_bin_elf_obj_t) *bin);
200 RBinElfSymbol* Elf_(r_bin_elf_get_imports)(struct Elf_(r_bin_elf_obj_t) *bin);
201 struct r_bin_elf_field_t* Elf_(r_bin_elf_get_fields)(struct Elf_(r_bin_elf_obj_t) *bin);
202 char *Elf_(r_bin_elf_get_rpath)(struct Elf_(r_bin_elf_obj_t) *bin);
203 
204 struct Elf_(r_bin_elf_obj_t)* Elf_(r_bin_elf_new)(const char* file, bool verbose);
205 struct Elf_(r_bin_elf_obj_t)* Elf_(r_bin_elf_new_buf)(RBuffer *buf, bool verbose);
206 void Elf_(r_bin_elf_free)(struct Elf_(r_bin_elf_obj_t)* bin);
207 
208 ut64 Elf_(r_bin_elf_resize_section)(RBinFile *bf, const char *name, ut64 size);
209 bool Elf_(r_bin_elf_section_perms)(RBinFile *bf, const char *name, int perms);
210 bool Elf_(r_bin_elf_entry_write)(RBinFile *bf, ut64 addr);
211 bool Elf_(r_bin_elf_del_rpath)(RBinFile *bf);
212 
213 bool Elf_(r_bin_elf_is_executable)(ELFOBJ *bin);
214 int Elf_(r_bin_elf_has_relro)(struct Elf_(r_bin_elf_obj_t) *bin);
215 int Elf_(r_bin_elf_has_nx)(struct Elf_(r_bin_elf_obj_t) *bin);
216 ut8 *Elf_(r_bin_elf_grab_regstate)(struct Elf_(r_bin_elf_obj_t) *bin, int *len);
217 RList *Elf_(r_bin_elf_get_maps)(ELFOBJ *bin);
218 RBinSymbol *Elf_(_r_bin_elf_convert_symbol)(struct Elf_(r_bin_elf_obj_t) *bin,
219 					  struct r_bin_elf_symbol_t *symbol,
220 					  const char *namefmt);
221 #endif
222