APK批量反编译到Java

本编转自于http://blog.csdn.net/betabin/article/details/10263951

用到的工具:

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下脚本如下:

[plain]  view plain copy
  1. @echo off  
  2. set apkSrcPath=F:\analysis\apkSrc  
  3.   
  4. for %%i in ("%apkSrcPath%\*.apk") do call "d2j-dex2jar.bat" "%%i"  


在Ubuntu下脚本如下:

[plain]  view plain copy
  1. #!/bin/bash  
  2. author="BetaBin"  
  3. echo $author is the author!  
  4.   
  5.   
  6. apkPath="../apk/"  
  7.   
  8. for apk in "${apkPath}"*;  
  9. do  
  10.     #call jd-core  
  11.     . d2j-dex2jar.sh "$apk"  
  12. done  



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

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

[plain]  view plain copy
  1. @echo off  
  2. setlocal ENABLEDELAYEDEXPANSION  
  3.   
  4. ::Author:BetaBin  
  5.   
  6. set apkSrcPath=F:\analysis\apkSrc  
  7.   
  8. for %%i in ("%apkSrcPath%\*.apk") do (  
  9. set tempname=%%i  
  10. call "apktool.bat" d -f "%%i" "!tempname:~0,-4!"  
  11. )  


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

[python]  view plain copy
  1. #Author:BetaBin  
  2. #Function: Clear rubbish files create by apktool  
  3.   
  4. import os  
  5. import shutil  
  6.   
  7. for folder in os.listdir(os.getcwd()):  
  8.         if os.path.isdir(folder):  
  9.                 for apkfile in os.listdir(os.getcwd()+ os.sep + folder):  
  10.                         if cmp("AndroidManifest.xml", apkfile):  
  11.                                 rubbish = os.getcwd() + os.sep + folder + os.sep + apkfile  
  12.                                 print rubbish  
  13.                                 if os.path.isdir(rubbish):  
  14.                                         shutil.rmtree(rubbish)  
  15.                                 else:  
  16.                                         os.remove(rubbish)  


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

[plain]  view plain copy
  1. #!/bin/bash  
  2. author="BetaBin"  
  3. echo $author is the author!  
  4.   
  5. apkJarPath="../apkJar/"  
  6. apkJavaPath="../apkJava/"  
  7.   
  8. for apkjar in "${apkJarPath}"*;  
  9. do  
  10.     #delete apk jar path's prefix, like "../apkJar/".  
  11.     pathPrefixLen="${#apkJarPath}"  
  12.     jarName=${apkjar:pathPrefixLen}  
  13.   
  14.     #delete apk jar path's suffix, like "-dex2jar.jar".  
  15.     appNameLen="${#jarName}"  
  16.     let appNameLen-=12  
  17.     appName=${jarName:0:$appNameLen}  
  18.   
  19.     #call jd-core  
  20.     java -jar jd-core-java-1.0.jar "$apkjar" "$apkJavaPath/$appName"  
  21. done  


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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值