为什么要学Android开发
缘起:从xxx话查看器说起
在2016年,一款名为《悄悄话查看器》的App 出名了,感兴趣的可以移步:
被舍友耍了之后,我很好奇它怎么办到的,当时是我是个只会编写 Java基础的程序小菜鸡。
大神爆出apk的源码,可以移步:
我很惊讶:别人写好的Android程序,竟然可以 反编译出来!!!
照着网上的一些教程,下载了 Android Killer 等逆向工具,看到了 易语言 写的代码。
凭借着 微弱的Java语言基础,大致看懂了 悄悄话的
Android逆向初探
用工具打开apk,过一会就可以看到完整的项目工程结构,就是这么简单吗?
如果事情就这么简单,开发Android App的程序员干嘛不直接开源!!
带着兴趣,我尝试了几款 热门的App,如QQ, Alipay,当我看到了“反编译失败”,意识到,这样的工具并不是万能的~~
这一阶段我对安全没什么概念,也没有继续深入下去。
Android逆向入门
由于学习需要,需要对某App的 一部分 通信协议进行分析,具体过程略,这一过程接触到了基本的工具:apktools, jd-gui, apk-ide,最初的 Android-Killder 由于好久没更新,没有这些工具好用。
通过掉某App的逆向经历,我建立起如下概念(很浅显的认知,欢迎大神来纠正):
- 为什么Java可以写Android程序?
- 首先Java程序运行需要JVM,但 JVM 体量庞大,Android 为此定制了 一套 Java 虚拟机
- Android 4.4.4及之前是 Dalvik
- 从 5.0开始 为 ART机制
- 有了 类似JVM的虚拟机,当然可以运行 Java代码
- 其次,Android 系统封装了 很多API,可以供 开发者选择,类似于用 Windows API 开发win32程序
- 最后,通过官方构建工具,将代码编译、打包成 apk,安装后即可运行
- 首先Java程序运行需要JVM,但 JVM 体量庞大,Android 为此定制了 一套 Java 虚拟机
- 逆向的原理是什么?
- 机器运行需要机器码,转化为人类较容易理解的语言就是 汇编语言
- 在 Java 程序中体现为,Java编译成字节码文件,交给JVM运行,而 dex 是专门为 Android 设计的一种字节码格式
- apk本质上就是个压缩文件,可用解压缩工具打开,可以看到1个或更多的 dex 文件
- 逆向就是根据dex文件还原出 Java代码
- 一般流程:dex文件通过 apktools 转化为 smali 文件,用 jd-gui 可以查看对应的 Java代码
即使没有Android开发经验,看一些关键代码还是没问题的。
Android逆向遇到的问题
最大的问题 没有正向开发经验,如 shared_prefs 的使用,sqlite 数据库、okhttp,rxjava、各种设计模式,反射(reflect)等。
代码整体给我的感觉是:结构很清晰完整,但由于不懂相关代码开发原理,即使拿到了代码,也不清楚从哪里下手,在混乱中摸索会抓不住重点。
另外在 分析过程中,查阅的很多资料,大多源自 Android开发技术贴。
这种状态下,急需正向开发经验……
学到什么程度
看代码能看懂
- 掌握基本的开发逻辑
- 界面方面能看就行
- 重点关注 IO、数据传递 等功能相关的 API 如何调用
- 了解最基本的开发模式
可以开发一些小工具
- base64,各类对称加密 等小工具,在 Android平台 可对数据进行 初步处理
- 进阶:自己开发 抓包工具,并进行 解析
- xposed 开发
如何学习
书籍:第一行代码
在本科阶段,就听说了这本神书
今年四月份,郭霖大神 这本书的 第三版 正式发布。
但这本书用 Kotlin 语言进行重写,Kotlin也是基于JVM的语言,兼容Java,Google在大会上将它视为官方语言。
经过实际测试,用Kotlin开发的 helloworld 反编译后也是 Java代码,暂且理解为:Kotlin 简化了 Java开发吧。但最后可以转为 Java 逻辑。
那么问题来了:有没有可以显示 Kotlin 代码的 apk逆向工具?目前我没找到,或许以后有。
我的目的是为了更好的从事 Android逆向,因此打算 从 第二版 读起,边学习边逆向,体会实际代码 跟 逆向代码的区别
第二版是基于 Android 7.0 设备,不算很老,等掌握后,再来学习 Android 8,9,10的新特性
有了一些逆向经验,学起来也不费劲吧……
视频
暂不考虑,
行动
计划永远是计划,行动起来才是主要的!!!
模式:一边学,同时在 csdn 做笔记