zoukankan      html  css  js  c++  java
  • [翔哥高手无敌之路]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

     

  • 相关阅读:
    HDU1720 A+B Coming
    HDU1390 ZOJ1383 Binary Numbers
    HDU1390 ZOJ1383 Binary Numbers
    HDU2504 又见GCD
    HDU2504 又见GCD
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1020 ZOJ2478 Encoding
    HDU1020 ZOJ2478 Encoding
    HDU2097 Sky数
  • 原文地址:https://www.cnblogs.com/superdo/p/4495665.html
Copyright © 2011-2022 走看看