IMF-apifuzz.py
2018-04-23 本文已影响0人
Dosi_X
一个类和一个函数
class ApiFuzz:
def __init__(self):
self.apis = {}
self.apisets = {}
self.apis = basic.load_apis()
def load_apilog(self, log_fname, limit):#调用了log.py
以rb方式打开log_fname:
把数据以'\n'分开,把数据的第一个到倒数第二个存到data中
如果data的长度不是偶数:
丢掉最后一个元素
idx = 0
apilogs = []
while idx < len(data) and idx < limit * 2:
如果data[idx]的前两位是'IN':
il = utils.evaluate(data[idx][2:])
否则:utils.error('load_apilog: parse IN error')
如果data[idx+1]的前三位是'OUT':
ol = utils.evaluate(data[idx+1][3:])
否则:utils.error(''load_apilog: parse OUT error)
apilog = log.ApiLog(self.apis[il[0]], il, ol)
apilogs.append(apilog)
idx+=2
return apilogs
def make_model(self, fnames, limit, path, core):#调用了Model.py
apisets = utils.multiproc(self.load_apilog_multi(limit), fnames, core)#把fnames里的log以多线程方式传给load_apilog_multi,返回列表apisets
model = Model(apisets)
以wb方式打开path:
code = model.fuzz(const.CODE_HEAD, const.CODE_TAIL)
把code写入文件
def load_apilog_multi(self, limit):
def func(fname):
apiseq = self.load_apilog(fname, limit)
返回apiseq
返回func
函数get_limit,这个limit指的是log里的api个数吗?
def get_limit(logs):
limit = None
log遍历logs:
以rb方式打开log:
n = log以'\n'分开后的数组长度-1再除以2
如果limit为空:
limit = n
如果limit不等于n:
utils.error('Invalid triaged logs')
返回limit
main函数
fuzz = ApiFuzz()
把命令行参数1传给log_dir
logs = []
fname遍历os.listdir(log_dir):
把文件名存进列表logs中
limit = get_limit(logs)#不懂limit的含义
把命令行参数3传给core
fuzz.make_model(logs, limit, sys.argv[2], core)