[collect]apk的反编译

本文最后更新于2014年9月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

之前在做题的时候碰到过简单的apk反编译的问题,当时参照着网上的教程实际试了试(都是比较简单的样例,没什么加密、混淆之类的,所以比较简单),这次再回顾回顾,顺便放到blog中来,方便自己日常查看。

测试环境:

  • Win7 Ultimate x64
  • Ubuntu 12.04 x86_x64

反编译工具:

一、Apk反编译得到Java源代码

下载上述反编译工具,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具。

apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件

源码查看工具jdgui,是一个反编译工具,可以直接查看反编译后的jar包源代码。

具体步骤:

首先将apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到dex2jar.bat所在目录dex2jar-0.0.9.9文件夹。

在命令行下定位到dex2jar.bat所在目录,运行命令:

dex2jar.bat    classes.dex

生成:

classes_dex2jar.jar

然后,进入jdgui文件夹双击jd-gui.exe,打开上面生成的jar包classes_dex2jar.jar,即可看到源代码了,如下图:

apk1

HelloAndroid源码在反编译前后的对照如下:

apk2

二、apk反编译生成程序的源代码和图片、XML配置、语言资源等文件

如果是汉化软件,这将特别有用。

首先还是要下载上述反编译工具,其中最新的apktool,请到google code下载:apktool

具体步骤:

下载上述反编译工具包,打开apk2java目录下的apktool1.4.1文件夹,内含三个文件:aapt.exe,apktool.bat,apktool.jar。

注:里面的apktool_bk.jar是备份的老版本,最好用最新的apktool.jar

在命令行下定位到apktool.bat文件夹,输入以下命令:apktool.bat d -f abc123.apk abc123,如下图:

apk3

上图中,apktool.bat 命令行解释:apktool.bat d -f [apk文件] [输出文件夹]

反编译的文件如下(AndroidManifest.xml为例):

apk4

将反编译完的文件重新打包成apk,很简单,输入apktool.bat b abc123(你编译出来文件夹)即可,命令如下:

apk5

打包apk后的文件在目录C:HelloAndroid下,生成了两个文件夹:

build

dist

其中,打包生成的HelloAndroid.apk,在上面的dist文件夹下,Ok

三、 图形化反编译apk(暂未测试)

上述步骤一、二讲述了命令行反编译apk,现在提供一种图形化反编译工具:Androidfby。

首先,下载上述反编译工具包,打开Androidfby目录,双击Android反编译工具.exe,就可以浏览打开要反编译的apk:

apk6

原文地址Android APK反编译详解(附图) – IT-Homer


Android如何防止apk程序被反编译

作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。

Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windowstools下面多了一个proguard文件夹

proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。

下面具体说一说怎么样让SDK2.3下的proguard.cfg文件起作用,先来看看android-sdk-windowstoolslibproguard.cfg的内容:

从脚本中可以看到,混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService,

并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考<proguard_path>/examples中的例子及注释。)

让proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了

完整的default.properties文件应该如下:

大功告成,正常的编译签名后就可以防止代码被反编译了。反编译经过代码混淆的apk得到的代码应该类似于下面的效果,是很难看懂的:

apk7

如果您使用的是2.3之前的SDK版本也没关系,把上面的proguard.cfg文件复制一份放到项目中,然后进行相同的操作即可。

原文地址Android如何防止apk程序被反编译 – IT-Homer

一些有用的参考链接:

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/1287.html

《[collect]apk的反编译》上有16条评论

  1. Android逆向系列之工具篇
    http://www.tasfa.cn/index.php/2016/05/05/android_tools/

    Frida:一款可以绕过越狱检测的工具
    http://www.4hou.com/technology/4675.html

    Frida是一个动态的代码工具包,它是一款基于python + javascript 的hook与调试框架,相比xposed和substrace cydia更加便捷,可以向Windows,Mac,Linux,iOS和Android上的app注入javascript代码片段,并完全访问程序的内存。

    Frida使用和Hook代码整理
    https://www.52pojie.cn/thread-611938-1-1.html

  2. Android逆向工具:非通常方法
    https://xz.aliyun.com/t/2481
    https://www.virusbulletin.com/virusbulletin/2018/04/vb2017-paper-android-reverse-engineering-tools-not-usual-suspects

    摘要
    1.简介
    2. 适用于Android逆向的Docker镜像
    2.1 为什么使用Docker镜像?
    2.2 镜像创建技巧
      2.2.1 Docker 和 GUI
      2.2.2 两个命令
      2.2.3 密码
      2.2.4 Android模拟器
      2.2.5 磁盘空间
    3. JEB2脚本
      3.1 为脚本设置JEB2
      3.2 去混淆脚本目标
      3.3 脚本开发
    4. 调试
      4.1 CodeInspect
      4.2 JEB2
      4.3 结论
    5. HTTPS 流量检查
    6. Radare2
      6.1 Dalvik支持
      6.2 逆向DEX的命令
      6.3 脚本
      6.4 讨论
    7. 结论/要点
    参考

  3. 内网渗透有它就够了,手把手教你破解CobaltStrike3.12
    https://mp.weixin.qq.com/s/SuVrMNhGiTfdOTY1CmGRbw

    修改demo.jar中的example.class并重新编译的过程如下:
    1. 使用jd-gui、luyten等工具把demo.jar包中的class反编译成源码,从中提取得到example.java
    2. 执行 jar xvf demo.jar 解压demo.jar得到jar包的子文件(注意会解压到当前目录),将example.java文件放置到与example.class文件同一目录
    3. 执行 javac -cp a.jar;b.jar;c.jar example.java 重新编译(或者javac -cp demo.jar example.java ),得到新的example.class文件。其中a.jar、b.jar、c.jar是依赖包,一般直接依赖一个原始解压的demo.jar包即可。
    4. 确保编译后的example.class替换了原来的example.class文件(可以通过jd-gui反编译查看)
    5. 执行 jar -uvf demo.jar com/some/path/example.class 更新demo.jar包

    更新jar包中的class文件时,新的class文件目录路径需要与原package路径保持一致。

发表评论

电子邮件地址不会被公开。 必填项已用*标注