1、解压apk的到classes.dex文件
2、编译获得Jar文件:> .\dex2jar-2.0\d2j-dex2jar.bat classes.dex
3、分析生成的 classes-dex2jar.jar 文件,判断apk是否混淆或加固
1、已加固apk,反编译生成后的class-dex2.jar明显小于class.dex文件;jar文件中的class文件明显被隐藏无法被正常查看
2、未加固的apk,发编译生成后的class-dex2.jar大小接近于class.dex文件大小
3、已加固文件判断混淆,由于得到的jar文件过小获得信息量不多,so 默认判断为已混淆状态
4、未加固的apk,得到的jar文件中信息量充足,通过判断文件目录结构与class文件的名称判断是否混淆
图一:
通过ZIP压缩方式打开文件,查看class文件大小判断是否加固
图二:
分别找了同一个apk,已加固和未加固的class.dex对比截图
图三:
class-dex2jar(未加固但已混淆) 截图
图四:
class-dex.jar(已加固)截图
手动判断分析的流程上面已经展示了,下面展示Python实现自动化判断的模块代码如下
Python代码示例:
def getaAPKDEX(self):
dexFile = "classes.dex"
jarFile = "classes-dex2jar.jar"
if (os.path.exists(dexFile)):os.remove(dexFile)
if (os.path.exists(jarFile)): os.remove(jarFile)
# 读取文件大小mb
dexFilefsize = round(os.path.getsize(dexFile) / float(1024), 0)
z_file = zipfile.ZipFile(self.fileAPKPath, "r")
dex_file_path = z_file.extract(dexFile)
z_file.close()
cmdCommond = ".\dex2jar-2.0\d2j-dex2jar.bat " + dex_file_path
self.doCMD(cmdCommond)
# 读取文件大小mb
jarFilefsize = round(os.path.getsize(jarFile) / float(1024), 0)
z_file = zipfile.ZipFile(jarFile, "r")
# 读取jar文件中的文件夹与文件信息
fileNameStr = ""
for f in z_file.namelist(): fileNameStr += f
z_file.close()
if dexFilefsize > jarFilefsize:
if "com/qihoo/util/QHDialog.class" in fileNameStr:
dex_jiagu = 1
dex_hunxiao = 1
else:
hunxiaoNum = 0
hunxiaoFile = ["/a.class", "/1.class", "/b.class", "/2.class", "a/", "/R.class"]
for hunxiao in hunxiaoFile:
if hunxiao in fileNameStr: hunxiaoNum += 1
dex_hunxiao = 1 if hunxiaoNum > 3 else 0
dex_jiagu = 0
if (os.path.exists(dexFile)):os.remove(dexFile)
if (os.path.exists(jarFile)): os.remove(jarFile)
return dex_jiagu, dex_hunxiao