[翔哥高手无敌之路]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('
'.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('
'.join(plugins))
        self.text_ids.setText('
'.join(ids))

 

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

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

 

原文地址:https://www.cnblogs.com/superdo/p/4495665.html