def check_private_api(app, pid):
    #print app
    strings = app_utils.get_app_strings(app, pid) #一般是app中的一些可打印文本
    #app中的私有库和公有库 .framework
    private, _ = otool_utils.otool_app(app)
    
    app_varibles = app_utils.get_app_variables(app, pid)

    left = strings - app_varibles #去除一些关键字,剩余app中的一些关键词
    
    api_set = api_dbs.get_private_api_list() #数据库中的私有api
    print 'private length:', len(api_set)
    inter_api = api_utils.intersection_list_and_api(left, api_set) # app中的api和数据库中的私有api取交集,获得app中的私有api关键字数据
    
    app_methods = app_utils.get_app_methods(app, pid) #app中的方法名
    app_apis = []
    for m in app_methods:
        class_name = m["class"] if m["class"] != "ctype" else 'cur_app'
        method_list = m["methods"]
        m_type = m["type"]
        for m in method_list:
            tmp_api = {}
            tmp_api['api_name'] = m
            tmp_api['class_name'] = class_name
            tmp_api['type'] = m_type
            #tmp_api['header_file'] = ''
            #tmp_api['sdk'] = ''
            #tmp_api['framework'] = ''
            app_apis.append(tmp_api)
    
    
    methods_in_app = api_utils.intersection_api(app_apis, inter_api) #app中的私有方法
    methods_not_in_app = inter_api # inter_method - methods_in_app # 不在app中的私有方法
    
    return methods_in_app, methods_not_in_app, private
def check_private_api(app, pid):
    #print app
    strings = app_utils.get_app_strings(app, pid) #一般是app中的一些可打印文本
    #app中的私有库和公有库 .framework
    private, public = otool_utils.otool_app(app)
    
    app_varibles = app_utils.get_app_variables(app, pid)

    left = strings - app_varibles #去除一些关键字,剩余app中的一些关键词
    
    api_set = api_dbs.get_framework_private_apis() #数据库中的私有api
    print 'private length:', len(api_set)
    inter_api = api_utils.intersection_list_and_api(left, api_set) # app中的api和数据库中的私有api取交集,获得app中的私有api关键字数据
    
    app_methods = app_utils.get_app_methods(app, pid) #app中的方法名
    app_apis = []
    for m in app_methods:
        class_name = m["class"] if m["class"] != "ctype" else 'cur_app'
        method_list = m["methods"]
        m_type = m["type"]
        for m in method_list:
            tmp_api = {}
            tmp_api['api_name'] = m
            tmp_api['class_name'] = class_name
            tmp_api['type'] = m_type
            #tmp_api['header_file'] = ''
            #tmp_api['sdk'] = ''
            #tmp_api['framework'] = ''
            app_apis.append(tmp_api)
    
    
    methods_in_app = api_utils.intersection_api(app_apis, inter_api) #app中的私有方法
    methods_not_in_app = inter_api# inter_method - methods_in_app # 不在app中的私有方法
    
    return methods_in_app, methods_not_in_app, private
def check_private_api(app, pid):
    strings = app_utils.get_app_strings(app, pid)  #一般是app中的一些可打印文本
    #app中的私有库和公有库 .framework
    private, public = otool_utils.otool_app(app)
    print '=' * 15
    print 'private:', len(private)
    print 'public', len(public)
    print '=' * 15

    dump_result = app_utils.get_dump_result(app)
    app_varibles = app_utils.get_app_variables(dump_result,
                                               pid)  #app自定义的一些方法,不需要检查
    left = strings - app_varibles  #去除一些app中开发人员自定义的方法,剩余app中的一些字符串

    app_methods = app_utils.get_app_methods(dump_result,
                                            pid)  #dump-class分析出app中的类和方法名

    app_apis = []
    for m in app_methods:
        class_name = m["class"] if m["class"] != "ctype" else 'cur_app'
        #if m["class"] != "ctype" else 'cur_app'
        method_list = m["methods"]
        m_type = m["type"]
        for m in method_list:
            tmp_api = {}
            tmp_api['api_name'] = m
            tmp_api['class_name'] = class_name
            tmp_api['type'] = m_type
            #tmp_api['header_file'] = ''
            #tmp_api['sdk'] = ''
            #tmp_api['framework'] = ''
            app_apis.append(tmp_api)

    api_set = api_dbs.get_private_api_list(public)  #数据库中的私有api,去除了whitelist白名单
    print '=' * 15
    print 'left app_varibles:', len(left)
    print 'app_methods:', len(app_apis)
    print 'private length:', len(api_set)
    print '=' * 15
    inter_api = api_utils.intersection_list_and_api(
        left, api_set)  # app中的api和数据库中的私有api取交集,获得app中的私有api关键字数据

    methods_in_app, method_not_in = api_utils.intersection_api(
        app_apis, inter_api)  #app中的私有方法

    print '=' * 15
    print 'methods_in_app', len(methods_in_app)
    print 'methods_not_in_app', len(method_not_in)
    # for i in xrange(20):
    # print methods_not_in_app[i]
    print '=' * 15

    return methods_in_app, method_not_in, private
def check_private_api(app, pid):
    strings = app_utils.get_app_strings(app, pid) #一般是app中的一些可打印文本
    #app中的私有库和公有库 .framework
    private, public = otool_utils.otool_app(app)
    print '=' * 15
    print 'private:', len(private)
    print 'public', len(public)
    print '=' * 15

    dump_result = app_utils.get_dump_result(app)
    app_varibles = app_utils.get_app_variables(dump_result, pid) #app自定义的一些方法,不需要检查
    left = strings - app_varibles #去除一些app中开发人员自定义的方法,剩余app中的一些字符串
    
    app_methods = app_utils.get_app_methods(dump_result, pid) #dump-class分析出app中的类和方法名
    
    app_apis = []
    for m in app_methods:
        class_name = m["class"] if m["class"] != "ctype" else 'cur_app'
        #if m["class"] != "ctype" else 'cur_app'
        method_list = m["methods"]
        m_type = m["type"]
        for m in method_list:
            tmp_api = {}
            tmp_api['api_name'] = m
            tmp_api['class_name'] = class_name
            tmp_api['type'] = m_type
            #tmp_api['header_file'] = ''
            #tmp_api['sdk'] = ''
            #tmp_api['framework'] = ''
            app_apis.append(tmp_api)
    
    api_set = api_dbs.get_private_api_list(public) #数据库中的私有api,去除了whitelist白名单
    print '=' * 15
    print 'left app_varibles:', len(left)
    print 'app_methods:', len(app_apis)
    print 'private length:', len(api_set)
    print '=' * 15
    inter_api = api_utils.intersection_list_and_api(left, api_set) # app中的api和数据库中的私有api取交集,获得app中的私有api关键字数据

    methods_in_app, method_not_in = api_utils.intersection_api(app_apis, inter_api) #app中的私有方法

    print '=' * 15
    print 'methods_in_app', len(methods_in_app)
    print 'methods_not_in_app', len(method_not_in)
    # for i in xrange(20):
        # print methods_not_in_app[i]
    print '=' * 15
    
    
    return methods_in_app, method_not_in, private
def check(ipa_path):
    if not os.path.exists(ipa_path):
        #不存在,返回检查结果为空值
        return [], [], []
    cur_dir = os.getcwd()
    dest = os.path.join(cur_dir, 'tmp')
    app_path = app_utils.unzip_ipa(ipa_path, dest) #解压ipa,获得xxx.app目录路径
    print app_path
    
    app = app_utils.get_executable_file(app_path)
    #print app
    strings = app_utils.get_app_strings(app) #一般是app中的一些可打印文本
    #app中的私有库和公有库 .framework
    private, public = otool_utils.otool_app(app)
    
    app_varibles = app_utils.get_app_variables(app)

    left = strings - app_varibles #去除一些关键字,剩余app中的一些关键词
    
    api_set = api_dbs.get_framework_private_apis() #数据库中的私有api
    inter_api = api_utils.intersection_list_and_api(left, api_set) # app中的api和数据库中的私有api取交集,获得app中的私有api关键字数据
    
    app_methods = app_utils.get_app_methods(app) #app中的方法名
    app_apis = []
    for m in app_methods:
        class_name = m["class"] if m["class"] != "ctype" else 'cur_app'
        method_list = m["methods"]
        m_type = m["type"]
        for m in method_list:
            tmp_api = {}
            tmp_api['api_name'] = m
            tmp_api['class_name'] = class_name
            tmp_api['type'] = m_type
            #tmp_api['header_file'] = ''
            #tmp_api['sdk'] = ''
            #tmp_api['framework'] = ''
            app_apis.append(tmp_api)
    
    
    methods_in_app = api_utils.intersection_api(app_apis, inter_api) #app中的私有方法
    methods_not_in_app = inter_api# inter_method - methods_in_app # 不在app中的私有方法
    
    return methods_in_app, methods_not_in_app, private
def check_private_api(app, pid):
    # 获取App内一些可打印的文本信息 cmd:strings
    strings = app_utils.check_app_strings(app)

    print('Strings:--->')
    # print(strings)
    # 获取App内私有库和公有库  cmd: otool -L
    private, public = otool_utils.otool_app(app)

    print("=" * 20)
    print('private ' + str(len(private)))
    print('public ' + str(len(public)))
    print("=" * 20)

    # class-dump ipa mach-o
    dump_macho_result = app_utils.get_dump_macho_result(app)
    # print('dump_macho_result_strings:--->')
    # print(dump_macho_result)
    app_availables = app_utils.get_app_available(
        dump_macho_result, pid)  # 提取App自定义的方法 不需要检查 TODO 再仔细看下输出
    print('app_availables:--->')
    # print(app_availables)

    leave = strings - app_availables  # 去除一些App自定义的方法,剩余App中的一些字符串

    ### app_methods
    app_methods = app_utils.get_app_methods(dump_macho_result,
                                            pid)  # class-dump出来的字符串格式中提取方法
    # [{"class": "ctype", "methods": method, "type": "C/C++"}]
    print("app_methods")
    # print(app_methods)

    app_apis = []
    for m in app_methods:
        class_name = m['class'] if m['class'] != 'ctype' else 'cur_app'
        method_lists = m['methods']
        m_type = m['type']
        for m in method_lists:
            tmp_api = {}
            tmp_api['api_name'] = m
            tmp_api['class_name'] = class_name
            tmp_api['type'] = m_type
            app_apis.append(tmp_api)
    ### app_methods

    # Pulic用到的库中对应的私有API [{},{},{}]
    api_set = api_dbs.get_private_api_list(
        public)  # 数据库中的私有api,去除了whitelist白名单

    print("*" * 50)
    print("App可见Strings : %s" % len(strings))
    print("App协议,变量属性 : %s" % len(app_availables))
    print("剩下的字符串--->  String -  App协议,变量属性  : %s" % len(leave))
    print('App方法名app_methods: %s' % len(app_apis))
    print('App用的Public对应的private apis length :%s' % len(api_set))
    print("*" * 50)

    # App可见Strings: 14634
    # 自定义的app_availables: 3954
    # 剩下的String - app_availables: 11640
    # App方法名app_methods: 4088
    # App用的Public对应的private
    # apis
    # length: 15125

    # app中leave(所有API除开自定义的)和用到的Public库对应的私有API集合进行交叉,获得App中私有API关键字数据 [{},{},{}]
    intersection_api = api_utils.intersection_leave_list_and_private_apis(
        leave, api_set)
    print('strings剩余可见字符串关键字和Publick对应的私有API集合交集后的私有API--->%s' %
          len(intersection_api))
    # print(intersection_api)

    methods_in_app, method_not_in = api_utils.intersection_api(
        app_apis, intersection_api)  # app中的私有方法

    print("*" * 50)
    print("最终API扫描结果")
    print('method_in_app:%s' % (len(methods_in_app)))
    print('method_not_in_app:%s' % (len(method_not_in)))
    print('private framework:%s' % len(private))
    print("*" * 50)
    return methods_in_app, method_not_in, private
def check(ipa_path):
    if not os.path.exists(ipa_path):
        #不存在,返回检查结果为空值
        print "被测应用不存在... exit()"
        return [], [], []

    #创建结果存放文件夹
    cur_dir = os.getcwd()
    dest = os.path.join(cur_dir, 'result')
    if (os.path.exists(dest) == True):
        os.system("rm -rf %s" % (dest))
    os.mkdir(dest)

    app_path = app_utils.unzip_ipa(ipa_path, dest) #解压ipa,获得xxx.app目录路径
    
    app = app_utils.get_executable_file(app_path)

    strings = app_utils.get_app_strings(app) #一般是app中的一些可打印文本

    #app中的私有库和公有库 .framework
    private, public = otool_utils.otool_app(app)

    #使用class-dump 获得ipa 中函数信息
    app_varibles = app_utils.get_app_variables(app)

    left_without_document_apis = strings - app_varibles #去除一些关键字,剩余app中的一些关键词


    #2)去除app中的 config.build_type 信息
    import config
    for build_type in config.build_type_list:
        print "="*50
        print "document 匹配 %s:" % (build_type)
        print "*"*50
        document_set_type_apis = api_dbs.get_document_apis_type(build_type)
        left_without_document_apis = api_utils.not_intersection_api(left_without_document_apis, document_set_type_apis, build_type)
        print "*"*50

    # app中的api和数据库中的私有api取交集,获得app中的私有api关键字数据
    # api_set = api_dbs.get_framework_private_apis() #数据库中的私有api


    # gavincui change 2016-03-31 在获得私有库中的内容时, 根据ipa所使用的系统库做一个筛选
    api_set = api_dbs.get_private_apis() #数据库中的私有api
    # api_set = api_dbs.get_private_apis(private, public) #数据库中的私有api
    #gavincui change end

    inter_api = api_utils.intersection_list_and_api(left_without_document_apis, api_set)
    
    app_methods = app_utils.get_app_methods(app) #app中的方法名
    app_apis = []
    for m in app_methods:
        class_name = m["class"] if m["class"] != "ctype" else 'cur_app'
        method_list = m["methods"]
        m_type = m["type"]
        for m in method_list:
            tmp_api = {}
            tmp_api['api_name'] = m
            tmp_api['class_name'] = class_name
            tmp_api['type'] = m_type
            app_apis.append(tmp_api)
    
    
    methods_in_app = api_utils.intersection_api(app_apis, api_set) #app中的私有方法
    methods_not_in_app = inter_api# inter_method - methods_in_app # 不在app中的私有方法
    
    return methods_in_app, methods_not_in_app, private