一文看懂混淆代码——Java Decompiled过程和代码阅读

本文不是讲解传统源码的阅读, 而是『别人的APK源码』该怎么阅读。

项目背景

此前,由于工作的原因,反编译竞品SDK,通过逆向的手段修复其源码并编译运行。

前端之下,本无秘密。相对于前端源码,Android APK源码并不是那么容易获取。由于Android这样一个开发的系统和使用java编写应用使得源码的获取成为现实。本文不过多介绍如果脱壳dex,或者动态调试apk,着重聊一下如何阅读jadx APK/DEX/JAR之后的『源码』。

反编译概念

什么是反编译?
Executable->Human Readable:机器可执行转变为程序员可读。后面通过APK打包过程分析打包产物从打包产物到可读产物
注:apk反编译生成的一般为Smali或java decompiled(后简称jd)代码。

Android源码的打包过程

原官网较为完整的打包过程:


image.png

APK打包流程

  1. 打包资源文件,生成R.java文件
    通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)

  2. 处理aidl文件,生成相应的Java文件

  3. 编译项目源代码,生成class文件
    通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件,生成的class文件位于工程中的bin/classes目录下。

  4. 转换所有的class文件,生成classes.dex文件
    dx工具生成可供Android系统Dalvik虚拟机执行的classes.dex文件,该工具位于android-sdk/platform-tools 目录下。
    任何第三方的libraries和.class文件都会被转换成.dex文件。
    dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。

  5. 打包生成APK文件
    通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk

  6. 对APK文件进行签名
    一旦APK文件生成,它必须被签名才能被安装在设备上。
    通过Jarsigner工具,对上面的apk进行debug或release签名
    在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android
    Studio中直接run以后跑在手机上的就是使用的debug.keystore。另一种就是用于发布正式版本的keystore。

  7. 对签名后的APK文件进行对齐处理
    通过zipalign工具,将签名后的apk进行对齐处理。
    对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。

考虑到Gradle作为主要构建工具,官方后来缩减版(可以看谷歌的变化之快):
典型 Android 应用模块的构建流程

image.png

构建过程中的产物

  • resources.arsc 二进制
  • .class
    debug/release javac -g字节码是否可调试
  • .jar
  • .dex 相比jar结构更紧凑
  • AAR 可执行文件dex和资源文件的集合记录文件

反编译的过程和工具

APK文件结构(通过解压缩查看)

image.png

Apks are nothing more than a zip file containing resources and assembled java code

$ unzip testapp.apk
Archive: testapp.apk
inflating: AndroidManifest.xml
inflating: classes.dex
extracting: res/drawable-hdpi/ic_launcher.png
inflating: res/xml/literals.xml
inflating: res/xml/references.xml
extracting: resources.arsc

无法查看目录中资源文件
查看 AndroidManifest.xml、resource.arsc编译后的二进制文件,后面讲解怎么查看APK、dex和反编译后端资源文件。

AAR文件结构

注意:lib中jar文件依然存在,在APK打包时候会合入.dex中。

以下,介绍一些java decompiled的工具。

Apktool
apktool工具官网的介绍 :

editing or viewing a compiled file is next to impossible. That is where Apktool >comes into play.

由于apktool实在太常用,甚至有许多人以为是官网给出的打包工具。

$ apktool d testapp.apk//apk 、jar
I: Using Apktool 2.0.0 on testapp.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: 1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
$
image.png

很多APK通过apktool的bug加壳之后不能反编译。

  • 通过分析和修改smali文件,再通过apktool重新打包、签名之后生成apk从而达到修改的目的。
    $ apktool b foo.jar.out
    # builds foo.jar.out folder into foo.jar.out/dist/foo.jar file
  • Framework Files 厂商定制
  • Smali Debugging 调试
    SmaliDebugging has been marked as deprecated in 2.0.3, and removed in 2.1. Please check SmaliIdea for a debugger.

dex2jar
功能:将 dex 文件还原成为 jar 文件;d2j-dex2jar.sh dex文件名
将 dex 文件还原成为 smali 文件;d2j-dex2smali.bat dex文件名

jd-gui

功能:查看 dex 文件还原成为 jar 文件代码;将 jar 文件中所有的 class 文件转换成为 java 文件
2015 年开始就停止了维护

jadx
功能:可直接浏览 Apk、dex、jar
带全局搜索功能,很好用,通过保存全部可以获得所以反编译的java代码。

enjarify
Google 出品
环境:Python3
可直接将 apk 文件还原成为 jar 文件,也可以和 dex2jar 一样,直接操作某个dex

ClassyShark
Google 出品
功能:可直接浏览 Apk,支持对.dex, .aar, .so,.apk, .jar, .class等文件的操作,查看统计、依赖等
优点:轻量
感兴趣请阅读以下参考
http://www.jianshu.com/p/8e8b88ea2197
https://github.com/borisf/classyshark-user-guide
背景故事很有趣。

image.png

网络抓包分析工具

7反编译思路和总结

1.思路:

  • 反编译获取魔蝎Android全部代码->调试和重构增强可读性->断点调试JS分析前端控制逻辑->获取全部抓取策略和细节
  • 代码可调试 尝试调试JAR包
  • 通过抓取分析具体流程 控制逻辑很复杂,前端为核心

2.修复java代码过程(不同工具反编译字节码得到java文件不相同)

  • 匿名内部类闭包、自引用(this)、匿名类嵌套匿名类(超难解)、引用父类成员或方法与当前所在类同名


    image.png
  • 运行时类型丢失、泛型类型被擦除、资源和字符串常量化等


    image.png
  • 局部变量声明丢失


    image.png
  • 反编译失败型(比较少,往往是第一个入口类)


    image.png
  • 位置错落型


    image.png

太多不一一列举,感兴趣的可以试着反编译看一下。
上面介绍的主要是一些jd方面的技术。jd之后的代码可以简单理解混淆后的代码,因为JVM的代码优化和逆向的语法问题使得代码不能完全运行,只要修复还是可以还原的(针对非大型项目)。代码量太多(超过5W行)只能慢慢阅读逆向代码了。阅读代码代码时需要注意this指针,同包下不需要导入的特性,可以快速定位类和方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容