面对一款apk软件,我们如何去获取它的信息,如何获取它的版本号,包名,或者ID,用户权限,这些信息都隐藏在apk包中的AndroidManifest.xml文件中,解开它我们就能获取任何想要的信息。但是当解压apk之后却发现AndroidManifest.xml是一堆看不懂的数字,那该怎么才能获得信息呢?我们不妨做一个款工具来轻松达到目的。
所需条件
- 安装java环境
- 拥有AXMLPrinter2.jar文件
获取原理
将apk解压之后,打开cmd,输入java -jar 然后将AXMLPrinter2.jar文件拖入,再将AndroidManifest.xml文件拖入,回车就能解析AndroidManifest.xml文件,得到里面的信息,这是利用jar包解析xml文件。然而这种解压出来的信息比较混乱,我们需要准确的定位信息,只出现需要的信息,这就要将信息过滤,这就需要开发工具来实现。
开发步骤
- 解压apk文件
- 获取AndroidManifest.xml文件
- 解析AndroidManifest.xml文件
- 过滤无用内容得到所需信息
代码资源
解压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