python获取apk内classes.dex文件

最近在用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文件

你可能感兴趣的:(编程有关经验与技巧【原创】)