[collect]apk的反编译


之前在做题的时候碰到过简单的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的内容:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

从脚本中可以看到,混淆中保留了继承自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文件应该如下:

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.

# Project target.
target=android-9
proguard.config=proguard.cfg

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

apk7

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

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

一些有用的参考链接:
,

《 “[collect]apk的反编译” 》 有 22 条评论

  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路径保持一致。
    `

  4. 如何破解微信聊天数据库
    https://mp.weixin.qq.com/s/CRR0IltM25YNP337f8DbRQ
    `
    关键步骤:

    1.root手机
    2.反编译微信App最新版本7.0.3,分析信息存储和加密原理
    3.获取手机IMEI(International Mobile Equipment Identity)
    4.获取UIN(User Information)
    5.计算MD5,数据库密码为MD5(IMEI + UIN)取前7位
    6.使用SQLCipher数据库工具读取EnMicroMsg.db
    `

  5. 闲谈Java逆向工程
    http://scz.617.cn/misc/201909121350.txt

    无意中看到一个blog:
    https://www.cnblogs.com/hac425/

    捋了一遍,发现小伙子很能折腾,嗯,这种肯定不能是小姑娘。推荐给诸君,不局限
    于Java逆向工程,他涉猎面较广。就Java逆向工程实践而言,推荐他的这几篇:

    ==
    使用sa-jdi.jar dump内存中的class
    https://www.cnblogs.com/hac425/p/9416705.html

    破解jeb mips 2.3.3 – [2017-11-2]
    https://www.cnblogs.com/hac425/p/9416950.html
    https://bbs.pediy.com/thread-222503.htm
    https://drive.google.com/open?id=1PJ5T3IgvYBhtq9_uAqQlpepjLA4uHPdA
    (jeb_2.3.3_demo_cracked.zip)

    破解jeb 2.3.7 demo
    https://www.cnblogs.com/hac425/p/9416948.html

  6. hac425这几篇提到Java逆向工程中的几大技术手段:

    Serviceability Agent(SA)
    BTrace
    Javassist
    动态调试(他用的是IntelliJ IDEA,可以用别的)
    ClassFileTransformer

    SA有很多能力,我给个学习指南:

    ====
    1) 利用SA查看JIT之后的汇编代码
    2) 利用SA在内存中寻找bytecode
    3) 利用SA、cdb定位bytecode对应的解释执行代码
    4) sun.jvm.hotspot.CLHSDB
    5) sun.jvm.hotspot.HSDB
    6) 已知JIT后代码的地址,反查Java信息
    ====

    放狗搜,这都是成熟技术。

    BTrace在这里:

    https://github.com/btraceio/btrace
    https://github.com/btraceio/btrace/wiki

    VisualVM在这里:

    https://visualvm.github.io/index.html
    https://visualvm.github.io/gettingstarted.html

    Javassist在这里:

    http://jboss-javassist.github.io/javassist/

    Getting Started with Javassist
    http://www.javassist.org/tutorial/tutorial.html

  7. 一种无法被Dump的jar包加密保护解决方案
    https://mp.weixin.qq.com/s/EdDLqrZQfFsOGZdEK7qXNg
    `
    0x00:为什么需要保护?保护后性能如何?

    0x01:市面上常见的加密保护方案
    1.远程调用Java程序
    2.自定义ClassLoader
    3.代码混淆
    4.转换成本地代码

    0x02:整体加密保护方案架构
    0x03:class文件格式与反汇编引擎浅析
    0x04:LLVM IR介绍

    0x05:技术实现细节分析
    1.读取Jar包中的class文件进行转换IR
    2.编译运行

    0x06:总结
    没有绝对的安全,只能说,这种加密方案,使逆向和破解都更难,相对于上面介绍的几种保护方案,这种方案在反调式、反Dump、抗逆向方面扩展能力会比较强,比如:指令混淆,字符串加密,VM等,没有最好的方案,只有最适合的方案。

    这种方案是失去了java原来跨平台的特性,还有一点不足的地方就是对GC的支持不好,所以这也是将来须要重点更进的地方。

    但是好在现在LLVM可以很好的支持不同平台的最终代码生成。
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注