2025-04-10 17:31:33 +08:00

113 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from elftools.elf.elffile import ELFFile
import re,os
hdr_str=["#include \"opensdk.h\"\n"]
symbol_table_org=[]
symbol_table = []
gen_table=[]
def get_export_func(f):
file = open(f, 'r')
try:
while True:
line = file.readline()
if line:
# print ("line=",line)
tmp = re.findall(r"EXPORT_FUNC\((.+)\)",line)
if tmp:
print(tmp[0])
symbol_table_org.append(line)
symbol_table.append(tmp[0])
print("#define app_"+tmp[0]+"_addr ")
else:
break
finally:
file.close()
print(symbol_table)
print("get_export_func")
def get_info_from_elf(e_file): # e_file为需要读取的elf文件
tmp_dict = {} # 这个字典用于存放变量名和变量地址的对应关系
file = open(e_file, 'rb')
elf_file_obj = ELFFile(file)
data_section = elf_file_obj.get_section_by_name('.data')
data_address = data_section.header["sh_addr"]
print(data_section.data())
print("data addr:0x%X"%data_address)
dfile = open("test.data.bin", 'wb')
dfile.write(data_section.data());
dfile.close()
text_section = elf_file_obj.get_section_by_name(".text")
base_address = text_section.header["sh_addr"]
print(text_section.data())
print("text addr:0x%X"%base_address)
tfile = open("test.text.bin", 'wb')
tfile.write(text_section.data());
tfile.close()
# got_section = elf_file_obj.get_section_by_name('.got')
# got_address = got_section.header["sh_addr"]
# print(got_section.data())
# print("got addr:0x%X"%got_address)
# gfile = open("test.got.bin", 'wb')
# gfile.write(got_section.data());
# gfile.close()
# plt_section = elf_file_obj.get_section_by_name('.got.plt')
# plt_address = plt_section.header["sh_addr"]
# print(plt_section.data())
# print("plt addr:0x%X"%plt_address)
# pfile = open("test.plt.bin", 'wb')
# pfile.write(plt_section.data());
# pfile.close()
for section in elf_file_obj.iter_sections():
# 此处把地址以16进制的字符串形式存入字典可选择自己需要的格式。
print(section)
# tmp_dict[s.name] = str(hex(s.entry["st_value"]))section
file.close()
return tmp_dict
def gen_hdr(e_file):
print("gen header file")
tmp_dict = {}
file = open(e_file, 'rb')
elf_file_obj = ELFFile(file)
symbol_table_name = elf_file_obj.get_section_by_name(".symtab")
for sym in symbol_table_name.iter_symbols():
print(sym.name)
print(sym['st_value'])
if sym.name in symbol_table:
gen_table.append("#define app_"+sym.name+"_addr "+str(hex(sym['st_value']))+"\n")
print("insert one sym")
print(gen_table)
f = open("export_new.h", 'w')
for line in hdr_str:
f.writelines(line)
f.writelines("\n")
for line in symbol_table_org:
f.writelines(line)
f.writelines("\n")
for line in gen_table:
f.writelines(line)
f.close()
try:
os.remove("inc/export.h")
except:
print("no inc/export.h")
os.rename("export_new.h","inc/export.h")
get_info_from_elf("test.elf")
get_export_func("inc/export.h")
gen_hdr("test.elf")