[文档]classKnowledgeBaseSerializer:""" Serialize/unserialize a KnowledgeBase object. """
[文档]@staticmethoddefdump(session,kb:KnowledgeBase):""" :param session: The database session object. :param KnowledgeBase kb: The KnowledgeBase instance to serialize. :return: None """db_kb=session.query(DbKnowledgeBase).filter_by(name=kb.name).scalar()ifdb_kbisNone:db_kb=DbKnowledgeBase(name=kb.name)session.add(db_kb)# dump other stuffif"CFGFast"inkb.cfgs:cfg_model=kb.cfgs["CFGFast"]ifcfg_modelisnotNone:CFGModelSerializer.dump(session,db_kb,"CFGFast",cfg_model)FunctionManagerSerializer.dump(session,db_kb,kb.functions)XRefsSerializer.dump(session,db_kb,kb.xrefs)CommentsSerializer.dump(session,db_kb,kb.comments)LabelsSerializer.dump(session,db_kb,kb.labels)VariableManagerSerializer.dump(session,db_kb,kb.variables)StructuredCodeManagerSerializer.dump(session,db_kb,kb.decompilations)
[文档]@staticmethoddefload(session,project,name):""" :param session: :return: """db_kb=session.query(DbKnowledgeBase).filter_by(name=name).scalar()ifdb_kbisNone:returnNonekb=KnowledgeBase(project,name=name)# Load CFGscfg_model=CFGModelSerializer.load(session,db_kb,"CFGFast",kb.cfgs,loader=project.loader)ifcfg_modelisnotNone:kb.cfgs["CFGFast"]=cfg_model# Load functionsfuncs=FunctionManagerSerializer.load(session,db_kb,kb)iffuncsisnotNone:kb.functions=funcs# Load xrefsxrefs=XRefsSerializer.load(session,db_kb,kb,cfg_model=cfg_model)ifxrefsisnotNone:kb.xrefs=xrefs# Load commentscomments=CommentsSerializer.load(session,db_kb,kb)ifcommentsisnotNone:kb.comments=comments# Load labelslabels=LabelsSerializer.load(session,db_kb,kb)iflabelsisnotNone:kb.labels=labels# Load variablesvariables=VariableManagerSerializer.load(session,db_kb,kb)ifvariablesisnotNone:kb.variables=variables# Load structured codestructured_code=StructuredCodeManagerSerializer.load(session,db_kb,kb)ifstructured_codeisnotNone:kb.decompilations=structured_codeifcfg_modelisnotNone:# CFG may not exist for all knowledge bases# fill in CFGNode.function_addressforfuncinfuncs.values():forblock_addrinfunc.block_addrs_set:node=cfg_model.get_any_node(block_addr)ifnodeisnotNone:node.function_address=func.addr# re-initialize CFGModel.insn_addr_to_memory_data# fill in insn_addr_to_memory_dataforxrefs_inxrefs.xrefs_by_ins_addr.values():forxrefinxrefs_:ifxref.ins_addrisnotNoneandxref.memory_dataisnotNone:cfg_model.insn_addr_to_memory_data[xref.ins_addr]=xref.memory_datareturnkb