Esempio n. 1
0
    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)
Esempio n. 2
0
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
Esempio n. 3
0
    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
Esempio n. 4
0
    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)
Esempio n. 5
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 ('')
Esempio n. 6
0
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)
Esempio n. 7
0
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)