前面反编译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 文件输入日志,其中会有部分说明(部分结构无法反编译)
从目录上来看我们是成功了的,但是最终我们还是需要对这些目录文件进行一个了解,才能进入后续的工作。