Android 原生程序开发与逆向分析
- Android 平台上的软件复杂多样,仅通过 Android SDK 使用 Java 编写程序已不能满足开发者需求,如:音频、视频播放软件解码器的编写涉及 CPU 的高性能运算;在一些平台开发的游戏,若是采用 C、C++ 编写的,可能因为涉及不同代码的移植问题面临重写所有代码的情况;用传统的 Java 编写的程序易遭逆向破解,需要新的代码保护手段等
- 为解决上述问题,Google 基于 Java 的 JNI 特性提供了 Android NDK(Native Development Kit)
- Android NDK
- 直译:Android 原生开发套件
- 是一款强大的工具,可将原生 C、C++ 代码的强大功能和 Android 应用的图形界面结合,解决软件跨平台问题
- 能使一些应用程序通过 JNI 调用与 CPU 打交道,从而使其性能得到提升
- 能将程序的核心功能封装到基于原生开发套件的模块中,大大提升软件安全性
原生程序开发
- 逆向分析和正向开发最大的区别:
- 正向开发:开发人员通常会长时间用同一种或两三种语言开发,语言的使用场合不会发生太大变化
- 逆向分析:开发人员会接触各种类型和各种系统平台的软件,不同的软件在不同的平台上运行,使用不同的语言开发
- 一个成熟的逆向工程师,要具备快速学习全新编程语言的能力,和在分析过程中遇到问题时持之以恒的毅力和耐心
- 在分析使用 Swift、Objective-C、Go 这类语言开发的程序时,逆向工程师首先要快速了解语言的特性和语法,熟悉语言在不同功能场景下常用的 API 接口,理解程序运行时的内存模型,然后寻找合适的分析工具,进行下一步的分析。要想掌握 Android 平台原生程序的逆向分析技术,要对 Android 原生程序的开发流程有所了解
- Android 平台,除了可用 NDK Toolchain 开发原生程序,还可用第三方提供的开发套件及其他语言开发原生程序。用得较多的第三方开发套件:
- Qt 库:一款跨平台的开源界面库。最大的特点是跨平台和用 C++ 开发,具有高度的可适配性和较高的运行性能,为众多桌面平台商业软件开发的首选库。用 Qt 开发 Android 原生程序要配合使用 Android SDK 和 Android NDK
- Xamarin Studio:一款跨平台的编程 IDE,支持用 C# 开发跨平台界面程序,其中包括 Android。类似的 IDE 有 Vistual Studio(微软),也支持用 C# 开发 Android 原生程序
- Kivy:一款跨平台的开源界面库。支持用 Python 为主流的操作系统开发跨平台的界面程序,包括 Android。类似的界面库有 sl4a,也支持在 Android 上用 Python 开发 APK
- Crystax-NDK:一款第三方扩展的 NDK 开发套件,不仅提供更多常用的 C/C++ 库,还支持用 Objective-C 编写 Android 原生程序
- React Native:由 Facebook 开发并开源的一款跨平台程序开发库。具备用 JavaScript 开发跨平台软件的能力,能让 Web 前端开发人员轻松编写 Android 平台界面程序
- 此处仅围绕 Android NDK 中用 C、C++ 开发的原生程序学习
原生程序工程
- AS 没提供无界面原生程序的开发入口。AS 中的原生程序开发建立在 Android 常规程序开发的基础上。若只想开发 Android 原生程序,可用 Android NDK 命令行模式
- AS 创建原生程序工程:
-
如此创建的工程与常规的没有原生支持的工程区别如