最近在用python写一个恶意文件检测工具,需要获取apk内classes.dex进行检测。
在编写工具的过程中发现了一个问题,很多人在获取dex文件时,用到了zipFile模块,思路是将.apk文件重命名为.zip文件,然后用.zip文件实例化zipfile成为一个对象,进而访问压缩包内的文件,这样处理不是很方便。参考文章:http://blog.csdn.net/chichoxian/article/details/42382695
但其实,zipFile模块是可以直接处理.apk文件的。接下来贴出部分代码:
#!usr/bin/python
# -*- coding: utf-8 -*-
import os
import zipfile
import random
import string
def apk2dext(filepath):
'''
将apk中的dex文件提取出来
:param filepath: apk文件路径
:return: 命中:True
'''
#直接用zipfule.ZipFile处理.apk文件
apkfile = zipfile.ZipFile(filepath,'r')
if os.path.isdir('dex') == False:
os.mkdir('dex')
#将apk内所有.dex文件都生成在'dex/'路径下
for tempfile in apkfile.namelist(): #遍历apk包内的所有文件名
if tempfile.endswith('.dex'):
dexfilename = ''.join(random.sample(string.ascii_letters + string.digits, 16)) + '.dex' #随机16位字符串文件名
f = open('dex/' + dexfilename,'w+')
f.write(apkfile.read(tempfile))
return True
这样做的好处是:
1、不用将.apk文件重命名处理
2、不用考虑同路径下是否存在同名.zip文件,导致重命名失败
3、不会改变源文件,不用还原.apk文件