def create_arsc(self, log, fileraw): """ This method is called in order to create a new ARSC object :param log: an object which corresponds to a unique app :param fileraw: the raw arsc (a string) :rtype: an :class:`APK` object """ return apk.ARSCParser(fileraw)
def main(options, arguments): if options.input != None: buff = "" arscobj = None ret_type = androconf.is_android(options.input) if ret_type == "APK": a = apk.APK(options.input) arscobj = a.get_android_resources() elif ret_type == "ARSC": arscobj = apk.ARSCParser(read(options.input)) else: # print("Unknown file type") return if not options.package and not options.type and not options.locale: buff = "" for package in arscobj.get_packages_names(): buff += package + "\n" for locale in arscobj.get_locales(package): buff += "\t" + repr(locale) + "\n" for ttype in arscobj.get_types(package, locale): buff += "\t\t" + ttype + "\n" else: package = options.package or arscobj.get_packages_names()[0] ttype = options.type or "public" locale = options.locale or '\x00\x00' buff = minidom.parseString( getattr(arscobj, "get_" + ttype + "_resources")(package, locale)).toprettyxml() if options.output != None: fd = codecs.open(options.output, "w", "utf-8") fd.write(buff) fd.close() else: # print(buff) psdd elif options.version != None: # print("Androarsc version %s" % androconf.ANDROGUARD_VERSION) pass
def run(self): self.view.set_name("%s.uarsc" % (self.filename)) self.view.set_scratch(True) edit = self.view.begin_edit() self.view.sel().clear() #self.view.set_syntax_file("Packages/ag-st/agapk.tmLanguage") arscobj = apk.ARSCParser(self.raw_object) i_buffer = get_arsc_info(arscobj) self.view.replace(edit, sublime.Region(0, self.view.size()), i_buffer) self.view.end_edit(edit) self.view.set_read_only(True) AG_ARSC_ID[self.view.id()] = arscobj if self.view.id() not in AG_SC: AG_SC[self.view.id()] = False
if not args.input and not args.file: print("Give one file to decode!", file=sys.stderr) sys.exit(1) if args.input: fname = args.input else: fname = args.file ret_type = androconf.is_android(fname) if ret_type == "APK": a = apk.APK(fname) arscobj = a.get_android_resources() elif ret_type == "ARSC": arscobj = apk.ARSCParser(read(fname)) else: print("Unknown file type!", file=sys.stderr) sys.exit(1) if args.list_packages: print("\n".join(arscobj.get_packages_names())) sys.exit(0) if args.list_locales: for p in arscobj.get_packages_names(): print("In Package:", p) print("\n".join(map(lambda x: " \\x00\\x00" if x == "\x00\x00" else " {}".format(x), sorted(arscobj.get_locales(p))))) sys.exit(0)
def run(url): # url is a apk download url try: r1 = requests.head(url, timeout=5) if (r1.status_code == 302): r1 = requests.get(url, stream=True) if ('Content-Length' in r1.headers): #print (r1.headers) range_end = r1.headers['Content-Length'] range_start = str(int(r1.headers['Content-Length']) - 1024 * 1024) headers = {'Range': 'bytes=' + range_start + '-' + range_end} r1.close() r = requests.get( url=url, headers=headers, timeout=5) #cut the last 1M content and deal 302 status code if (b'resources.arsc' in r.content): print("YES") start_46 = r.content.find(b'resources.arsc') start_0 = start_46 - 46 if (r.content[start_0:start_0 + 4] == b'\x50\x4b\x01\x02'): disk_number_start = r.content[start_0 + 42:start_0 + 46] compressed_size = r.content[start_0 + 20:start_0 + 24] number_start = int.from_bytes(disk_number_start, byteorder='little') number_end = number_start + int.from_bytes( compressed_size, byteorder='little') if (number_end + 1000 < int(range_end)): headers = { 'Range': 'bytes=' + str(number_start) + '-' + str(number_end + 1000) } else: headers = {'Range': 'bytes=' + str(number_start) + '-'} r.close() r3 = requests.get(url=url, headers=headers, timeout=5) a = r3.content r3.close() com_size = a[18:22] name_length = a[26:28] extra_length = a[28:30] size2 = int.from_bytes( com_size, byteorder='little') #file_uncompressed_size n = int.from_bytes(name_length, byteorder='little') #file_name_length m = int.from_bytes(extra_length, byteorder='little') resc = a[30 + n + m:30 + n + m + size2] kkk = apk.ARSCParser(resc) #list1.append(kkk.get_packages_names()[0]) x = kkk.get_string(kkk.get_packages_names()[0], "app_name")[1] print(x) return x else: return ('') else: return ('') else: return ('') except: return ('') return ('')
def arsc(input_, file_, output, package, locale, type_, id_, list_packages, list_locales, list_types): """ Decode resources.arsc either directly from a given file or from an APK. Example: \b $ androguard arsc app.apk """ from androguard.core import androconf from androguard.core.bytecodes import apk if file_ and input_: print( "Can not give --input and positional argument! " "Please use only one of them!", file=sys.stderr) sys.exit(1) if not input_ and not file_: print("Give one file to decode!", file=sys.stderr) sys.exit(1) if input_: fname = input_ else: fname = file_ ret_type = androconf.is_android(fname) if ret_type == "APK": a = apk.APK(fname) arscobj = a.get_android_resources() if not arscobj: print("The APK does not contain a resources file!", file=sys.stderr) sys.exit(0) elif ret_type == "ARSC": with open(fname, 'rb') as fp: arscobj = apk.ARSCParser(fp.read()) if not arscobj: print("The resources file seems to be invalid!", file=sys.stderr) sys.exit(1) else: print("Unknown file type!", file=sys.stderr) sys.exit(1) if id_: # Strip the @, if any if id_[0] == "@": id_ = id_[1:] try: i_id = int(id_, 16) except ValueError: print( "ID '{}' could not be parsed! have you supplied the correct hex ID?" .format(id_)) sys.exit(1) name = arscobj.get_resource_xml_name(i_id) if not name: print("Specified resource was not found!") sys.exit(1) print("@{:08x} resolves to '{}'".format(i_id, name)) print() # All the information is in the config. # we simply need to get the actual value of the entry for config, entry in arscobj.get_resolved_res_configs(i_id): print("{} = '{}'".format( config.get_qualifier() if not config.is_default() else "<default>", entry)) sys.exit(0) if list_packages: print("\n".join(arscobj.get_packages_names())) sys.exit(0) if list_locales: for p in arscobj.get_packages_names(): print("In Package:", p) print("\n".join( map( lambda x: " \\x00\\x00" if x == "\x00\x00" else " {}".format(x), sorted(arscobj.get_locales(p))))) sys.exit(0) if list_types: for p in arscobj.get_packages_names(): print("In Package:", p) for locale in sorted(arscobj.get_locales(p)): print(" In Locale: {}".format("\\x00\\x00" if locale == "\x00\x00" else locale)) print("\n".join( map(" {}".format, sorted(arscobj.get_types(p, locale))))) sys.exit(0) androarsc_main(arscobj, outp=output, package=package, typ=type_, locale=locale)
def arsc(input_, file_, output, package, locale, type_, list_packages, list_locales, list_types): """ Decode resources.arsc either directly from a given file or from an APK. Example: \b $ androguard arsc app.apk """ from androguard.core import androconf from androguard.core.bytecodes import apk if file_ and input_: print( "Can not give --input and positional argument! " "Please use only one of them!", file=sys.stderr) sys.exit(1) if not input_ and not file_: print("Give one file to decode!", file=sys.stderr) sys.exit(1) if input_: fname = input_ else: fname = file_ ret_type = androconf.is_android(fname) if ret_type == "APK": a = apk.APK(fname) arscobj = a.get_android_resources() elif ret_type == "ARSC": arscobj = apk.ARSCParser(read(fname)) else: print("Unknown file type!", file=sys.stderr) sys.exit(1) if list_packages: print("\n".join(arscobj.get_packages_names())) sys.exit(0) if list_locales: for p in arscobj.get_packages_names(): print("In Package:", p) print("\n".join( map( lambda x: " \\x00\\x00" if x == "\x00\x00" else " {}".format(x), sorted(arscobj.get_locales(p))))) sys.exit(0) if list_types: for p in arscobj.get_packages_names(): print("In Package:", p) for locale in sorted(arscobj.get_locales(p)): print(" In Locale: {}".format("\\x00\\x00" if locale == "\x00\x00" else locale)) print("\n".join( map(" {}".format, sorted(arscobj.get_types(p, locale))))) sys.exit(0) androarsc_main(arscobj, outp=output, package=package, typ=type_, locale=locale)