APK批量反编译到Java

在各种被恶心之后,又继续恶心这东西……


实验需要将大量Android App Java源码分析,之前反编译出来的由于版本问题,导致不少错误,所以需要重修来批量反编译。


用到的工具:

dex2jar (Google code)顾名思义,可以将APK转为Jar包

apktool (Google code)主要是解析APK里面各种资源,汉化组必备利器

jd-core-java (GitHub) 这个将Jar包反编译到Java

(小小吐槽下,jd-core这东西造福大众,不过没发布出来。其作者提到了“Release JD-Core is not a priority for me”,所以GitHub就有人顺应大众给出了个解决方案:“This is hack around the IntelliJ IDE plugin. It fakes the interfaces of the IDE, and provides access to JD-Core.”,给咱提供了批处理接口呀~。~)


大概步骤:

1、通过dex2jar,写个脚本去跑。把脚本翻到解压的dex2jar里面,设置apk的文件路径之后,自动去遍历生成各个apk的jar包,jar包存放在dex2jar文件夹下。(这里没找到输出位置选项,就自己拷贝出来吧……)

Windows下脚本如下:

@echo off
set apkSrcPath=F:\analysis\apkSrc

for %%i in ("%apkSrcPath%\*.apk") do call "d2j-dex2jar.bat" "%%i"


在Ubuntu下脚本如下:

#!/bin/bash
author="BetaBin"
echo $author is the author!


apkPath="../apk/"

for apk in "${apkPath}"*;
do
	#call jd-core
	. d2j-dex2jar.sh "$apk"
done



2、通过apktool,同样在windows下也写了个脚本来批处理。不过由于apktool生成的多余资源实验不需要,所以就另外写了个脚本去删除掉,只剩下AndroidManifest.xml。

生成资源的Windows脚本如下,放置到apktool解压文件夹内,设置apk的文件夹路径,然后跑完就能在该路径下得到资源文件夹了……(这里表示也没找到输出位置设置……)

@echo off
setlocal ENABLEDELAYEDEXPANSION

::Author:BetaBin

set apkSrcPath=F:\analysis\apkSrc

for %%i in ("%apkSrcPath%\*.apk") do (
set tempname=%%i
call "apktool.bat" d -f "%%i" "!tempname:~0,-4!"
)


然后在上面输出文件夹内,我又写了个Python脚本来过滤掉多余资源,只保存xml。(如果脚本放到其他地方,把os.getcwd()替换了吧……我错了,我不该偷懒,该加个变量的……)

#Author:BetaBin
#Function: Clear rubbish files create by apktool

import os
import shutil

for folder in os.listdir(os.getcwd()):
        if os.path.isdir(folder):
                for apkfile in os.listdir(os.getcwd()+ os.sep + folder):
                        if cmp("AndroidManifest.xml", apkfile):
                                rubbish = os.getcwd() + os.sep + folder + os.sep + apkfile
                                print rubbish
                                if os.path.isdir(rubbish):
                                        shutil.rmtree(rubbish)
                                else:
                                        os.remove(rubbish)


3、还有最后一个脚本……也就是利用jd-core-java,来批量反编译。只是这东西“But this wrapper only supports Linux 64-bit.”,所以又得郁闷去配置一台Ubuntu 64-bits来跑下。make之后就可以用了,方法也很简单。直接给出批量脚本如下:(放置到jd-core-java文件夹下,修改输入输出,然后就跑了。)

#!/bin/bash
author="BetaBin"
echo $author is the author!

apkJarPath="../apkJar/"
apkJavaPath="../apkJava/"

for apkjar in "${apkJarPath}"*;
do
	#delete apk jar path's prefix, like "../apkJar/".
	pathPrefixLen="${#apkJarPath}"
	jarName=${apkjar:pathPrefixLen}

	#delete apk jar path's suffix, like "-dex2jar.jar".
	appNameLen="${#jarName}"
	let appNameLen-=12
	appName=${jarName:0:$appNameLen}

	#call jd-core
	java -jar jd-core-java-1.0.jar "$apkjar" "$apkJavaPath/$appName"
done


然后吧……把2和3步骤生成的文件夹合并就可以了。


结束,要是有哪位高手把这些脚本都给统一起来,不胜感激,给我链接让我下份。(我主要是刚刚开始都在windows下弄,后来蹦出个only linux 64bits,直接郁闷了,否则可以一个bat再整合下。不过在linux下也可以整合,我就是懒……反正实验素材只用生成一次……以后还要用再改吧……)





你可能感兴趣的:(Android,安全)