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