[翔哥高手无敌之路]0-002.如何提取apk中的信息?

面对一款apk软件,我们如何去获取它的信息,如何获取它的版本号,包名,或者ID,用户权限,这些信息都隐藏在apk包中的AndroidManifest.xml文件中,解开它我们就能获取任何想要的信息。但是当解压apk之后却发现AndroidManifest.xml是一堆看不懂的数字,那该怎么才能获得信息呢?我们不妨做一个款工具来轻松达到目的。

所需条件

  • 安装java环境
  • 拥有AXMLPrinter2.jar文件

获取原理

将apk解压之后,打开cmd,输入java -jar 然后将AXMLPrinter2.jar文件拖入,再将AndroidManifest.xml文件拖入,回车就能解析AndroidManifest.xml文件,得到里面的信息,这是利用jar包解析xml文件。然而这种解压出来的信息比较混乱,我们需要准确的定位信息,只出现需要的信息,这就要将信息过滤,这就需要开发工具来实现。

开发步骤

  1. 解压apk文件
  2. 获取AndroidManifest.xml文件
  3. 解析AndroidManifest.xml文件
  4. 过滤无用内容得到所需信息

代码资源

解压apk

    def isapk(self,into):
        # 将文件名显示在text_apk上
        separate = os.path.split(str(into))

        #解压apk
        myzip = zipfile.ZipFile((into))
        myfilelist=myzip.namelist()  

获取AndroidManifest.xml文件

        for name in myfilelist:
            #找到‘AndroidManifest.xml‘文件
            if name == ‘AndroidManifest.xml‘:
                fd = open(separate[0]+ r‘/AndroidManifest.xml‘.decode(‘utf-8‘), "wb")
                fd.write(myzip.read(name))
                fd.close()
                break  

解析AndroidManifest.xml文件

        separat = separate[0].decode(‘utf-8‘)
        roots = os.popen(‘java -jar C:/dev/PythonProjects/APKTool/src/res/AXMLPrinter2.jar ‘+ separat+ r‘/AndroidManifest.xml‘)
        text = roots.read()
        roots.close()

        #将反编译的内容存入‘AndroidManifest.xml‘
        def save(filename, contents):
            fh = open(filename, ‘w‘)
            fh.write(contents)
            fh.close()  

        save(separat+ r‘/AndroidManifest.xml‘, text)
        return separat+ r‘/AndroidManifest.xml‘

过滤无用内容得到所需信息

获取版本名、版本号、包名

    def version(self, root):
        bodys = root.getiterator("manifest")
        #提取versionName
        versionName = bodys[0].attrib[‘{http://schemas.android.com/apk/res/android}versionName‘]
        self.text_version.setText(versionName)
        #提取versionCode
        versionCode = bodys[0].attrib[‘{http://schemas.android.com/apk/res/android}versionCode‘]
        self.text_codeversion.setText(versionCode)
        #提取package
        package = bodys[0].attrib[‘package‘]
        self.text_package.setText(package)

获取用户权限

    def permission(self, root):
        permission = root.findall("uses-permission")

        #在输出前清空
        permissions = []
        for i in range(len(permission)):
            #输出permission内容
            name = permission[i].attrib[‘{http://schemas.android.com/apk/res/android}name‘]
            permissions.append(name)

        self.text_permissions.setText(‘\n‘.join(permissions))

获取ID与插件

    def mata(self, root):
        meta = root.getiterator("meta-data")
        plugins = []
        ids = []
        for i in range(len(meta)):
            #输出meta-data"
            if meta[i].attrib[‘{http://schemas.android.com/apk/res/android}name‘] == ‘plugin_‘+str(i):
                value = meta[i].attrib[‘{http://schemas.android.com/apk/res/android}value‘]
                plugins.append(value)

            else:
                name = meta[i].attrib[‘{http://schemas.android.com/apk/res/android}name‘]
                value = meta[i].attrib[‘{http://schemas.android.com/apk/res/android}value‘]
                complete = ‘[ %s ] = [ %s ]‘%(name, value)
                ids.append(str(complete))

        self.text_plugins.setText(‘\n‘.join(plugins))
        self.text_ids.setText(‘\n‘.join(ids))

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)

转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4495665.html

时间: 2024-10-28 09:16:07

[翔哥高手无敌之路]0-002.如何提取apk中的信息?的相关文章

条形码读取控件Softek Barcode Reader Toolkit提取图像中条形码信息

Softek Barcode Reader Toolkit是一款功能强大的条形码读取控件,提取图像中条形码信息的综合工具包.可用在扫描.索引文件的应用程序中.条形码信息可高速准确地从文件中读取,无需介入操作,应用程序就可索引图像. 具体功能: 支持一维和二维条形码 shell(命令解析器)工具. C语言的API(应用程序接口). Perl(实用报表提取语言)模式. Java(TM)类. 图像消噪. 兼容常规的表达形式. 通过条形码的位置可分离多页的TIF文件. 支持彩色图像, 创建Code 39

python学习笔记——爬虫中提取网页中的信息

1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层.因此,它也被称为自描述的结构.常见的半结构数据有HTML,XML和JSON等,实际上是以树或者图的结构来存储的. <person> <name>A</name> &l

MYSQL 提取时间中的信息的 4 方法

方法 1. year(),month(),day() 方法 2. dayofweek(),dayofmonth(),dayofyear(); 方法 3. hour(),minute(),second(); 方法 4. weekofyear();

[工具-004]如何从apk中提取AndroidManifest.xml并提取相应信息

跟上一篇类似,我们也需要对APK的一些诸如umengkey,ADkey,TalkingData进行验证,那么我们同样需要解压apk文件,然后提取其中的AndroidManifest.xml.然后解析xml对内容进行分析对比. 1.解压apk文件 if (Path.GetExtension(filePath).Equals(".apk")) { // 获取应用名称 String appName = Path.GetFileNameWithoutExtension(filePath); /

封装能重用的自定义Adapter,向翔哥致敬

看了翔哥的自定义万能的adapter,自己也做下笔记,分析一下高手的思维方式,让我们一起进入变态程序员的内心世界. 分析万能的adapter之前,我们先分析一下普通的adapter public class ReportSpinnerAdapter extends BaseAdapter { private Context context; private List<String> str; public ReportSpinnerAdapter(Context context, List&l

python提取字符串中数字

题目:[这是一个复杂问题的简化]如下是一个字符串列表,提取字符串中第二个数字,并判断是否大于1000,如果是,从列表中删除这一行. 1000\t1002\n .....[省略].... 代码: <pre name="code" class="python">oldStr = "1000\t1002\n" newStr = oldStr #匹配目标数字左侧字符串 t=newStr.index("\t") newStr

提取代码中的部分代码字段

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

【前端】提取URL中的各个GET参数

1 /**************************** 2 * 有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e, 3 * 请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定), 4 * 将其按key-value形式返回到一个json结构中, 5 * 如{a:'1', b:'2', c:'', d:'xxx', e:undefined}. 6 ******************

检查打开的文件是不是ELF格式的文件,提取“特别”的节中的信息

//检查打开的文件是不是ELF格式的文件 //检验ELF头 //获得节头表的地址 //遍历节头表,依次查看一个节的属性,从节头字符串表中找到其名称,如果名称和"特别"的section名匹配,则找到此节的地址 //提取"特别"的节中的信息 //显示上面提取的信息 #include<stdio.h> #include<elf.h> #include<stdlib.h> #include<string.h> int main