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)
Example #2
0
    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
Example #3
0
    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)
Example #9
0
    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)
Example #10
0
    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)