def test_angr_vars(request): file_id, file_name, func_addr = ReqParams.many(request, ['file_id', 'file_name', 'func_addr.hex']) func_parse = FunctionParse(file_id, func_addr) props = func_parse.get_props() # _test_func(file_name) return sys_app_ok_p(props)
def func_props(file_id, func_addr): # 查找是否已有缓存结果,如有,不再做重复解析,直接返回缓存结果 props_dict = FuncCacheDAO.fetch_props(file_id, func_addr) if props_dict is not None: return props_dict # 加载、解析,获得函数属性 func_parse = FunctionParse(file_id, func_addr) props_dict = func_parse.get_props() # 在数据库中缓存解析结果 FuncCacheDAO.save_props(file_id, func_addr, props_dict) return props_dict
def func_codes(file_id, func_addr): # 查找是否已有缓存结果,如有,不再做重复解析,直接返回缓存结果 codes_dict = FuncCacheDAO.fetch_codes(file_id, func_addr) if codes_dict is not None: return codes_dict # 获取指定函数的代码信息 func_parse = FunctionParse(file_id, func_addr) codes_dict = func_parse.function_codes() # 在数据库中缓存解析结果 FuncCacheDAO.save_codes(file_id, func_addr, codes_dict) return codes_dict
def test_angr_reaching_definitions(request): file_id, file_name, func_addr = ReqParams.many(request, ['file_id', 'file_name', 'func_addr.hex']) file_path = os.path.join(MyPath.samples(), file_name) project = angr.Project(file_path, load_options={'auto_load_libs': False}) # cfg = project.analyses.CFGFast() cfg = project.analyses.CFGEmulated() function = FunctionParse.func_by_addr(func_addr, cfg=cfg) tmp_kb = angr.KnowledgeBase(project) reaching_definition = project.analyses.ReachingDefinitions( subject=function, kb=tmp_kb, observe_all=True ) # nose.tools.assert_equal(reaching_definition.subject.__class__ is Subject, True) def _result_extractor(rda): unsorted_result = map( lambda x: {'key': x[0], 'register_definitions': x[1].register_definitions._storage, 'stack_definitions': x[1].stack_definitions._storage, 'memory_definitions': x[1].memory_definitions._storage}, rda.observed_results.items() ) return list(sorted( unsorted_result, key=lambda x: x['key'] )) result = _result_extractor(reaching_definition) pass
def test_angr_plot_graph(request): file_id, file_name, func_addr = ReqParams.many(request, ['file_id', 'file_name', 'func_addr.hex']) if len(file_id) == 0: if len(file_name) == 0: return sys_app_err_p('INVALID_REQ_PARAM', 'file_id 或 file_name 必填其一') file_path = os.path.join(MyPath.samples(), file_name) project = angr.Project(file_path, load_options={'auto_load_libs': False}) start_state = project.factory.blank_state(addr=func_addr) start_state.stack_push(0x0) with hook0(project): cfg = project.analyses.CFGEmulated(fail_fast=True, starts=[func_addr], initial_state=start_state, context_sensitivity_level=2, keep_state=True, call_depth=100, normalize=True) graph_file = os.path.join(MyPath.temporary(), StrUtils.uuid_str()) plot_cfg(cfg, graph_file, asminst=True, vexinst=False, func_addr={func_addr: True}, debug_info=False, remove_imports=True, remove_path_terminator=True) else: func_parse = FunctionParse(file_id, func_addr) content = func_parse.cfg_graph() return sys_app_ok()
def call_graph_a(request): # 从请求中取参数:文件 ID、函数地址、画图模式 file_id, func_addr, simple = ReqParams.many( request, ['file_id', 'func_addr.hex', 'simple.int']) # 获取 call_graph 图形数据 func_parse = FunctionParse(file_id, func_addr) graph_data = func_parse.cg_graph(simple != 1) # 保存操作日志 LogRecords.save('', category='query', action='生成函数调用图', desc='生成指定函数的调用关系图,文件ID=%s,函数地址=0x%x' % (file_id, func_addr)) return sys_app_ok_p({ 'file_id': file_id, 'func_addr': func_addr, 'call_graph': graph_data })
def control_dependence_graph(request): # 从请求中取参数:文件 ID、函数地址、画图模式 file_id, func_addr, simple = ReqParams.many( request, ['file_id', 'func_addr.hex', 'simple.int']) # 绘制 control_dependence_graph (CDG) 图形 func_parse = FunctionParse(file_id, func_addr) graph_data = func_parse.cdg_graph() # 保存操作日志 LogRecords.save('', category='query', action='生成控制依赖图', desc='生成指定函数的控制依赖图,文件ID=%s,函数地址=0x%x' % (file_id, func_addr)) return sys_app_ok_p({ 'file_id': file_id, 'func_addr': func_addr, 'cdg_graph': graph_data })
def cfg_all_exec_bin_files(self, pack_id, task_id): # 获取本固件包所有的二进制可执行文件记录 bin_files_list = FwFileDO.search_files_of_pack(pack_id, FileType.EXEC_FILE) # 枚举每个文件,读出其文件数据,校验 total_count = len(bin_files_list) for index, file_item in enumerate(bin_files_list): # 检查任务状态 if MyTask.is_task_stopped(task_id): break # 保存任务执行百分比 self._save_task_percentage(task_id, index, total_count) # 注意:此处一定要设置覆写,否则判定的是旧文件数据,造成判定结果错误 file_id = file_item['file_id'] file_path = FwFilesStorage.export(file_item['file_id'], file_name=task_id, override=True) is_cfg = CfgAnalyzeService.has_cfg_analyze(file_id) if not is_cfg: try: # 通过 project 快速解析文件 angr_proj = AngrProj(file_id, progress_callback=self.run_percent_cb, task_id=task_id, cfg_mode='cfg_fast') # 从 project 中提取函数列表 functions = FunctionParse.functions_extract(angr_proj.proj) # 保存 函数列表到数据库 FileCacheDAO.save_functions(file_id, functions) arch = str(angr_proj.proj.arch) # 设置文件已完成 CFG 分析的标记 FwFileDO.set_cfg_analyzed(file_id, 1, arch) PackFileDO.updateArch(pack_id, arch) except Exception as e: print(e) # 保存任务完成状态 MyTask.save_exec_info(task_id, 100.0) # 包分析完成标志 PackFileDO.analyze_complet(pack_id, 1)
def analyze_cfg_proc(self, file_id, task_id): self.task_id = task_id # 通过 project 快速解析文件 angr_proj = AngrProj(file_id, progress_callback=self.run_percent_cb, task_id=task_id, cfg_mode='cfg_fast') # 从 project 中提取函数列表 functions = FunctionParse.functions_extract(angr_proj.proj) # 保存 函数列表到数据库 FileCacheDAO.save_functions(file_id, functions) print(str(angr_proj.proj.arch)) arch = str(angr_proj.proj.arch) # 设置文件已完成 CFG 分析的标记 FwFileDO.set_cfg_analyzed(file_id, 1, arch)
def analyze_cfg_proc_auto(self, task_id): # 查询所有文件 list_file_id = FwFileDO._db_get_all_file(FileType.EXEC_FILE) for file in list_file_id: # print(file) file_id = file['file_id'] is_cfg = CfgAnalyzeService.has_cfg_analyze(file_id) if not is_cfg: # 启动分析任务 self.task_id = task_id self.file_id = file_id try: # 通过 project 快速解析文件 angr_proj = AngrProj(file_id, progress_callback=self.run_percent_cb, task_id=task_id, cfg_mode='cfg_fast') # angr_proj = AngrProj(file_id, progress_callback=self.run_percent_cb, cfg_mode='cfg_fast') # 从 project 中提取函数列表 functions = FunctionParse.functions_extract(angr_proj.proj) # 保存 函数列表到数据库 FileCacheDAO.save_functions(file_id, functions) print(str(angr_proj.proj.arch)) arch = str(angr_proj.proj.arch) # 设置文件已完成 CFG 分析的标记 FwFileDO.set_cfg_analyzed(file_id, 1, arch) # PackFileDO.updateArch(arch) time.sleep(1) except Exception as e: print(e)