Python-apk安全检测--反编译资源文件(Smali+class+java)代码实现-02

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33668011/article/details/82801920

前面反编译Smali文件其实都不是比较简单的,一步就可以获取到我们想要的,但是下面我们需要获取到源码(java)文件我们需要分几步来完成,我这里就不做文字型的描述了代码中都有详细的说明:

一 。我们要先获取class文件,这里需要用到工具enjarify

def decompileClass(self):
        """反编译获取Class 文件"""
        jar_dir = self.class_dir + ".jar"  # 我们定义一个jar文件
        zip_dir = self.class_dir + ".zip"  # 我们需要将jar文件转换成zip  文件之后在解压
        if os.path.exists(jar_dir):   # 如果文件存在就删除它
            os.remove(jar_dir)
        if os.path.exists(zip_dir):
            os.remove(zip_dir)
        os.system("enjarify -o" + jar_dir + " -f " + self.apk_dir)     # 反编译出jar文件 
        shutil.copyfile(jar_dir, zip_dir)  # 将jar 文件转换成 zip文件
        os.remove(jar_dir)  # 删除jar文件
        f = zipfile.ZipFile(zip_dir, 'r')   # 解压之后遍历出来进行保存
        for file in f.namelist():
            try:
                f.extract(file, self.class_dir)
            except:
                pass
        f.close()
        os.remove(zip_dir)    # 删除zip文件
        return self.class_dir

二 。我们需要将得到的class文件反编译成Java(如果做过混淆的话基本上就没戏了)

def decompileJava(self):
        """反编译获取Java 文件"""
        class_dir = self.decompileClass()    # 获取到class文件目录
        for root, dirs, files in os.walk(class_dir):
            for file in files:
                if re.search('\.class$', file):    # 遍历所有的class 文件 进行一个个的反编译 
                    class_dirs = os.path.join(root, file)
                    os.system("jad -o -r -s java -d " + self.java_dir + " -o " + class_dirs)
        return self.java_dir

之后我们来试试吧!

if __name__ == '__main__':
    decompile = apkDecompile("com.ytrain.wxns_1.2.2_3")
    decompile.decompileClass()

稍等一会我们就可以看到控制台及文件目录中已包含相关文件
 

可以看到我们一共得到了1491 个class  文件
之后就是一堆的class 文件输入日志,其中会有部分说明(部分结构无法反编译)

从目录上来看我们是成功了的,但是最终我们还是需要对这些目录文件进行一个了解,才能进入后续的工作。

猜你喜欢

转载自blog.csdn.net/qq_33668011/article/details/82801920