'''
通过一定筛选条件提取出函数名.函数名长度大于4并且小于26
dec_label进行筛选,大于80的舍去。这是因为,函数名与函数体之间的极端不对称,会导致模型失效。
'''
#此版本可以清楚看到ICFG提取的情况
import os
import re
import json
temp_ll = []
l_end_added_new_func = []
ll_new3 = []
def func_body_get_ll_info(ll_files):
f = open(ll_files, encoding="utf-8")
s = f.readlines()
temp_func_ll = []
flag = 0
for i in range(len(s)):
if 'define' in str(s[i]):
flag += 1
if flag >= 1:
if len(temp_func_ll) > 0:
temp_ll.append(temp_func_ll)
temp_func_ll = []
temp_func_ll.append(s[i])
elif flag >= 1:
temp_func_ll.append(s[i])
temp_ll.append(temp_func_ll[:100])#最后一个添加的上面没有加上的函数名-函数体!限制其长度为100;
def resize_func_body(func_body_info):#函数体处理模块
l_func_body = ""
str_spqce = ""
s_re = str(str_spqce.join(re.split('[!*;:-]', func_body_info)))
match1 = re.sub(r"i[0-9][0-9]", ' N ', s_re)
match3 = re.sub(r" [0-9][0-9] ", ' N ', match1)
match3 = re.sub(r"dec_label_pc.*?[\s]", ' ', match3)
match6 = re.sub(r"\.", ' ', match3)
match7 = str_spqce.join(re.split('[\[\]\'\'=%,(){}@]', match6))
match8 = re.sub(r"N", '', match7) # 最后对于N进行处理
match9 = re.sub(r"\n", '', match8) # 最后对于/n进行处理
match10 = re.sub(r"label", ' ', match9) # 最后对于空格进行处理
match11 = re.sub(r" [0-9][0-9] ", ' ', match10) # 最后对于空格进行处理
match12 = re.sub(r" *", ' ', match11) # 最后对于空格进行处理
count = 0
for i in match12.split(' '):
if len(i) > 2:
if count < 1000:
# l_func_body += ' '+i
l_func_body += ' '+i
count += 1
return l_func_body
def get_func_name_body(ll):#得到处理过后的函数名和函数体部分!
l_end = []
for j in range(len(ll)):
print(ll[j])
func_body = ""
for i in range(len(ll[j])):
if i == 0:
func_name = re.findall(r"(?<=@).*?(?=[\(])", str(ll[j][0]), re.S) # 提取函数名
else:
func_body += ll[j][i]+' ' # 提取函数体
func_body1 = resize_func_body(func_body)#处理函数体模块
l_end.append({"func_name": func_name, "func_body": func_body1[:1000]})
print(l_end)
return l_end
# 传入一个文件夹路径,提取全部的.ll文件信息,并且返回一个列表
def get_info(path):
l = []
files = os.listdir(path)
for file in files:
if "-" in file:
# print(file)
ll_files = path + '/' + str(file)
# print(ll_files)
files = os.listdir(ll_files)
for i in files:
# print(path + '/' + str(file) + '/' + i)
l.append(path + '/' + str(file) + '/' + i)
return l
def get_func_icfg(l_end):#制作函数名-函数体的ICFG数据!
print(l_end)
big_func_name = []
big_func_body = []
for i in range(len(l_end)):#获得所有的函数名数据!
big_func_name.append(l_end[i].get('func_name')[0])
big_func_body.append(l_end[i].get('func_body').split(' '))
for i in range(len(big_func_body)):
for j in range(len(big_func_body[i])):
for k in range(len(big_func_name)):
if big_func_name[k] in big_func_body[i]:
print(big_func_name[k])
print(big_func_body[i])
temp_index = big_func_body[i].index(big_func_name[k])
print(temp_index)
big_func_body[i][temp_index] = list(big_func_body[k])
for i in range(len(big_func_name)):#将函数名和函数体信息写入列表
# big_func_body = l_end[i].get('func_body').split(' ')
print('*********************')
# for j in range(len(big_func_body)):
# l_end_added_new_func.append({"func_name": big_func_name[i], "func_body": big_func_body[i][:1000]})
process_func_body = list(big_func_body[i])
temp_ll = []
for j in range(len(process_func_body)):
process_func_body[j] = re.sub(r"\(.*?\)|\{.*?\}|\[.*?\]", "", str(process_func_body[j]))
if len(process_func_body[j]) > 2:
temp_ll.append(process_func_body[j])
big_func_body[i] = temp_ll
ss = ""
for k in range(len(big_func_body[i])):
ss += big_func_body[i][k]+' '
#去掉其中的逗号 冒号 和空格
ss1 = re.sub(r'[\,\'\ \]]', ' ', ss)
ss2 = re.sub(r" *", ' ', ss1)
l_end_added_new_func.append({"func_name": big_func_name[i], "func_body": ss2})
# l_end_added_new_func.append({"func_name": big_func_name[i], "func_body": big_func_body[i]})
# l_end_added_new_func.append({"func_name": big_func_name[i], "func_body": temp_ll})
return l_end_added_new_func
# for j in range(len(big_func_name)):
# print(big_func_body[j])
# for k in range(len(big_func_body[j])):
# print(big_func_name[j])
# print(big_func_body[j][k])
# if big_func_name[j] == big_func_body[j][k]:
# print(i)
# print(k)
#
# if big_func_name[j] in big_func_body:
# print(big_func_name[j])
# num_func_name = big_func_name.index(big_func_name[j])
# num_func_body = big_func_body.index(big_func_name[j])#函数名出现在函数体中的位置!
# big_func_body[num_func_body] = l_end[num_func_name].get('func_body')[0]
# l_end_added_new_func.append({"func_name": l_end[i].get('func_name')[0], "func_body": big_func_body[:1000]})
# print(l_end_added_new_func)
if __name__ == '__main__':
record_path = os.getcwd() # 记录当前路径
fun_body_info = get_info(record_path) # 递归提取所有路径信息
# for i in range(len(fun_body_info)):
# print("loading............" + str(fun_body_info[i]))
# func_body_get_ll_info(fun_body_info[i])
# # print(temp_ll)
# func_body_get_ll_info(fun_body_info[i])
func_body_get_ll_info(r'F:\test\my_test\0多分类实验\ll文件特征提取\libz.so.1.2.11.ll')
func_name_body = []
func_name_body = get_func_name_body(temp_ll)
func_icfg = get_func_icfg(func_name_body)
print(func_icfg)
for i in range(len(func_icfg)):
print(func_icfg[i].get('func_name'))
print(func_icfg[i].get('func_body'))
ll_new3.append({"func_name": func_icfg[i].get('func_name'), "func_body": func_icfg[i].get('func_body')})
print(ll_new3)
with open(r'mips32100.json', "a+") as json_file:
# json_str = json.dumps(temp_ll, indent=4)
# json_str = json.dumps(func_name_body, indent=4)
json_str = json.dumps(ll_new3, indent=4)
print("writing to json..........")
json_file.write(json_str)
json_file.close()
print("写入mips32.json成功!")
with open(r'mips32.txt', "w") as f_txt:
print(len(func_icfg))
f_txt.write(str(len(func_icfg)))
f_txt.close()
print("mips32.txt成功!")