反编译APK方法

【转】 Android笔记-反编译APK方法
2011-05-25 14:31
转载自  Edgarcai
最终编辑  Edgarcai
        啊菜 写本篇文章的目的是为了总结,而反编译APK的主要目的在于学习,通过反编译,我们可以养眼下一些优秀的Android应用程序代码。
       
啊菜 在这儿热情提示下:还是尽量不要利用反编译进行汉化或修改,毕竟程序员写个程序不容易啊,多少个奋斗的星夜里才出炉这么个优秀的产品!
网络上有很多反编译android APK的方法,先从反编译的原理讲起:
目前Google Android平台选择Java Dalvik VM的方式编译打包APK的方式是很容易破解和被修改。
      首先APK文件的本质就是一个MIME为ZIP的压缩包,我们修改ZIP或RAR后缀名方式就可以看到内部的文件结构,类似 Sun JavaMe的Jar压缩格式一样,不同的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进DEX文件中,作为托管代码让Android 虚拟机可以识别,同时我们也可以很轻松的进行反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些跟踪工具。
       开始 
反编译之旅
        一、用winrar或zip软件打开apk文件
,得到文档结构图
        二、将classes.dex文件解压出来,然后使用工具反编译成.jar文件,再进一步反编译出java文件
        1.在cmd下进入dex2jar.bat(http://dex2jar.googlecode.com/files/dex2jar-0.0.7.3-SNAPSHOT.zip)所在路径,然后输入“dex2jar.bat XXX”XXX指的是你要反编译的apk中的classes.dex
文件所在路径及名称.
        比如:
         我的dex2jar.bat路径为D:/Android/apk_decode/dex2jar/dex2jar.bat

          classes.dex路径为D:/Android/apk_decode/dex2jar/apk/classes.dex

         命令为:你进入dex2jar.bat路径下后,输入dex2jar.bat apk/classes.dex,这样会生成一个jar
文件。
       2.用WinRAR软件解压出jar文件中的class文件,然后用jad或DJ Java Decompiler反编译工具将.class文件反编译成.java文件

3.不解压出jar中的class文件,直接用JD GUI工具打开jar文件


4.步骤2和3选择其中一个即可,建议用步骤2,步骤3可能出现乱码

   三、上面操作只能得到class文件,下面利用Google提供的apktool得到xml文件

1. 下载apktool,可以去Google官方下载apktool-1.3.2.tar.bz2apktool-install-windows-2.2_r01-3.zip.解压apktool-install-windows.zip到任意文件夹(例如D盘根目录),解压apktool.jar到apktool-install-windows同目录下。

2. Win+R 运行CMD,用cd命令转到apktool-install-windows所在文件夹,输入apktool看看
会列出一些帮助的话就成功了(解释d为加压 第一个路径为你的apk所在的位置。第二个是要输出的位置)

apktool d XXX.apk ABC    反编译XXX.apk到文件夹ABC


3. 在解压后的文件夹中可以得到apk的xml配置文件

       四、将“二”中得到的class文件和“三”中得到的xml文件组合成一个android工程,即可得到完整的apk源码。
       转载请注明来源:
啊菜's BLOG http://hi.baidu.com/edgarcai

专业名词解释:
        APK
        APK是
Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。 
       apk文件和sis一样最终把android sdk编译的工程打包成一个安装程序文件格式为apk。 APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。一个APK文件结构为: META-INF/ Jar文件中常可以看到 res/ 存放资源文件的目录 AndroidManifest.xml 程序全局配置文件 classes.dex Dalvik字节码 resources.arsc 编译后的二进制资源文件总结下我们发现Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows Mobile中的PE文件有区别,这样做对于程序的保密性和可靠性不是很高,通过dexdump命令可以反编译,但这样做符合发展规律,微软的 Windows Gadgets或者说WPF也采用了这种构架方式。在Android平台中dalvik vm的执行文件被打包为apk格式,最终运行时加载器会解压然后获取编译后的androidmanifest.xml文件中的permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的。最终我们平时安装的文件可能不是这个文件夹,而在android rom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。

 

 

原文地址:http://hi.baidu.com/spiderjun/blog/item/ae795a5994f0233d2934f02d.html

 

1 . 把apk拷到apktool根目录下,执行:./apktool d xxx.apk,会生成xxx目录,里面有res目录(各种资源文件),smali目录(类似src目录,里面文件的语法不一样)及AndroidManifest.xml。 [*.apk->*.jar: sh ./dex2jar/dex2jar.sh xxx.apk,生成xxx_dex2jar.jar通过jd-linux看源码] 2 . 什么apk汉化啊,就到res/values里string.xml里修改字符串,或者拷贝一份values目录改为values-zh-rCN,再去里面修改string.xml里英文字符串改为中文,所谓的汉化就是这么简单。另外,有些图片里不是中文的得去改图片,那得用Photoshop了,图片也不能乱改,格式,图片大小(尺寸)得原来的。 3 . 修改smali文件,这个有些难度。比如有些apk安装了后要积分什么的,比如大于100才可以用的,其实这个值是用SharedPreference存放的,也就是存在xml里,,位置:/data/data/[包名]/shared_prefs的某个xml里,文件不多肯定是可以找到的。另外一种方法就是修改.smali文件也可以达到这目的,软件实现肯定是读取积分那个值给它修改一下就可以了,例如 const/16 v0 100 (其实就是 v0 = 100)这个语法有点像汇编,觉得还是比汇编简单,v0 v1 ...是寄存器,之前会跟变量关联的。具体的还是自己看看smali语法。 4 . 打包生成apk,执行:./apktool b xxx,会在xxx里面生成,一个dist目录,里面就是xxx.apk,但不能安装滴,提示(Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]),没有给这个apk签名, 5 . 签名,执行:sh ./dex2jar/d2j-apk-sign.sh ./xxx/dist/xxx.apk 就是给刚才那个apk签名,生成的文件还是xxx.apkapktool根目录下。这样就大功告成啦。 [请看:http://blog.youkuaiyun.com/zhouyuanjing/article/details/7446988]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值