咱们现在日常日子中都运用手机,它们的运用现已开展到了一个至关重要的水平,以至于人们常常将手机列为除了食物和水之外不可或缺的三样东西之一。手机几乎处理了一切使命,从办理银行账户和出资到游览预订、购物和健康预约。
为了履行这些使命,手机具有移动运用程序。这些运用程序处理了大部分您的数据,并帮助您履行使命。
因为这些现代移动运用程序处理敏感用户信息,履行要害使命,并提供对互联网上很多资源的访问,因此处理的数据安全性和履行的操作也需求得到改进。
移动运用程序浸透测验人员测验移动运用程序的安全性以发现缝隙。为了找到缝隙,测验人员需求了解运用程序的内部作业原理和逻辑。这些细节能够在运用程序的源代码中找到。但是,在黑盒浸透测验的情况下,浸透测验人员并不总是能够得到源代码。在黑盒浸透测验期间,浸透测验人员所具有的仅仅运用程序包,即Android运用程序包(APK)或iOS运用商铺包(IPA)文件。在这种情况下,为了了解运用程序的作业原理,他们需求解压运用程序包并获得源代码。
逆向工程是拆解物体以研讨其内部设计、代码、逻辑等的技能。逆向工程移动运用程序是指拆解/解构运用程序以提醒其代码和内部逻辑、组件等的进程。
在本章中,咱们将包括以下首要内容:
- 逆向工程根底知识
- Android运用程序根底知识
- iOS运用程序根底知识
咱们将学习逆向工程的根底知识以及移动运用程序是怎么构建的。在咱们深入了解现代运用程序的逆向工程使命之前,了解这些根底知识是很重要的。
技能要求:
完成相关的实践练习需求运用 Android Studio 和 Xcode。Xcode 是苹果公司的集成开发环境(IDE),用于开发 macOS、iOS、iPadOS、watchOS 和 tvOS 的软件。Android Studio 是谷歌的 Android 操作系统的官方集成开发环境。苹果笔记本电脑/台式机(Mac)能够装置并运转 Xcode 和 Android Studio,而运转 Windows 或 Linux 的其他笔记本电脑/台式机只能支持 Android Studio。
更多信息,请参阅以下链接:
- Android Studio: developer.android.com/studio
- Xcode: developer.apple.com/xcode/
逆向工程根底知识
首先让咱们了解逆向工程的基本原理,为什么需求逆向工程以及触及的进程。
正如本章前面提到的,逆向工程是拆解一个对象以研讨其内部设计、代码和逻辑的技能。 当开发人员构建一个移动运用时,他们会挑选一种编程言语(根据方针平台 – Android、iOS 或两者都有),编写他们想要的功能的代码,并增加资源,如图像、证书等。然后将代码编译以创立运用程序包。
在逆向工程相同的运用程序时,逆向工程师将运用程序包拆解为组件和代码。 在逆向工程中常常运用的一些术语如下:
- 反编译:这是将文件从低级言语翻译为高级言语的进程。履行反编译的东西称为反编译器。反编译器接收一个二进制程序文件,并将该程序转换为更高等级的结构化言语。下图说明晰反编译进程:
- 拆解:这是将机器码(在方针代码二进制文件中)转换为人类可读的助记符表明称为汇编言语的进程。履行拆解的东西称为反汇编器,因为它履行的是与汇编器相反的操作。下图说明晰拆解进程:
一个简略的二进制文件在反汇编东西 Hopper 中进行反汇编后如下所示:
- 调试:这是一种技能,允许用户在运转时检查和修正程序的状态。下图说明晰调试进程:
了解逆向工程中运用的不同办法和办法论非常重要。咱们将在本书的后续章节中运用一切这些概念。 现在咱们现已了解了逆向工程的根底知识,让咱们探索一下移动运用程序,也就是 Android 和 iOS 运用程序是怎么开发的。咱们现在将深入研讨移动运用程序根底知识背后的组件、结构和概念。
Android运用程序根底知识
原生Android运用首要运用Java或Kotlin编写。Android SDK东西将代码与任何数据和资源文件编译成APK或Android运用程序包。编译后的运用程序以特定格局存储,其扩展名为.apk。换句话说,Android包是一个包括多个运用程序文件和元数据的存档文件。
兴趣小知识 :将APK文件的文件扩展名改为.zip,并运用unzip翻开。您将能够检查其内容。
以下是APK的首要组成部分:
-
AndroidManifest.xml:运用程序清单文件,包括运用程序详细信息,如称号、版别、引用的库以及XML格局中的组件详细信息。Android操作系统依赖于该文件的存在,以识别与运用程序和相关文件有关的相关信息。
-
Dalvik可履行文件(classes.dex文件)。
-
META-INF:
- MANIFEST.MF(清单文件)
- CERT.RSA(运用程序的证书)
- CERT.SF(带有MANIFEST.MF文件中相应行的SHA-1摘要的资源列表)
-
lib:包括特定于一系列处理器的编译代码,如下所示:
- armeabi:一切根据ARM的处理器的编译代码
- armeabi-v7a:一切根据ARMv7及以上的处理器的编译代码
- x86:x86处理器的编译代码
- mips:MIPS处理器的编译代码
-
res:未编译为resources.arsc的资源。
-
assets:包括运用程序财物。
-
resources.arsc:预编译资源。
重要提示 :Android设备中的Java代码不在Java虚拟机(JVM)中运转。相反,它以Dalvik可履行(DEX)字节码格局编译。DEX文件包括最终由Android Runtime履行的代码。
让咱们看看怎么为Android创立一个简略的“Hello World”运用程序,然后解压缩它以检查其组件:
- Android运用程序运用Android Studio开发。请从developer.android.com/studio下载并装置最新版别的Android Studio。
- 让咱们挑选“新项目”选项,然后挑选“空活动”选项:
- 在接下来的屏幕上,依照以下截图中显现的方式填写一切细节。您能够随意挑选称号:
-
点击“完成”后,将为默许的活动/屏幕运用程序创立一个新项目。
-
您现在能够尝试在任何连接的Android设备上或虚拟Android模拟器上运转该运用程序。关于后者,请从AVD菜单创立一个虚拟Android设备。
-
一旦运用程序成功运转,咱们将尝试从Android Studio中提取此运用程序的运用程序包。
-
要从Android Studio获取APK,请转到“构建|构建Bundle(s)/APK(s)|构建APK(s)”菜单选项。生成后,导航到“定位”选项中提到的文件夹,并仿制APK。
-
仿制APK后,将文件的扩展名更改为.zip:
- 运用任何存档东西解压文件并提取其内容:
# unzip MARE-Chapter-1.zip
供参阅,成果如下:
- 让咱们剖析APK内部的组件,并与此处的列表进行比较(Android运用程序根底知识)。
以下图示显现了对Android运用程序进行正向和逆向工程的进程:
Android 运用首要运用 Java 和 Kotlin 进行开发。无论根据 Java 还是 Kotlin,Android 包的内部结构都是相同的。因此,逆向工程运用程序的办法也是相同的。
咱们现在现已了解了 Android 运用程序的根底知识。iOS 运用程序也被打包成特定的格局,并具有特定的结构。现在让咱们来了解 iOS 运用程序的根底知识。
iOS 运用程序根底知识
类似于 Android,iOS 运用程序也以特定的压缩格局称为 IPA,或许 iOS 运用商铺包。iOS 运用程序包也能够经过将扩展名更改为 ZIP 来重命名,然后能够提取组件,尽管 iOS 运用程序包的组件与 Android 运用程序包的不同。
iOS 运用首要运用 Objective-C 和 Swift 构建,这两种言语都能够运用诸如 Hopper 或 Ghidra 的反汇编器进行反汇编。在 Objective-C 运用中,办法经过动态函数指针调用,在运转时经过称号解析。这些称号完整地存储在二进制文件中,使得反汇编代码更易读。与 Android 不同的是,在 iOS 中,运用程序代码被编译为能够运用反汇编器进行剖析的机器代码。
以下是 iOS 运用程序包的首要组件:
- Info.plist:类似于 APK 中的 Android 清单文件,此信息属性列表文件包括键值对,用于指定运用程序的要害运转时装备信息。iOS 操作系统依赖于此文件的存在,以识别有关运用程序及其相关文件的相关信息。
- 可履行文件:在设备上运转的文件,包括运用程序的主入口点和静态链接到运用程序方针的代码。
- 资源文件:可履行文件所需的文件,关于运用程序正确运转是必需的。这或许包括图像、nib 文件、字符串文件和装备文件。
以下图示说明晰 iOS 架构概览:
让咱们看看怎么为iOS创立一个简略的“Hello World”运用程序,然后解压它并检查其组件:
-
iOS 运用程序是运用 Xcode 开发的。在 Mac 上经过 App Store 下载最新版别的 Xcode。
-
在接下来的屏幕上,挑选默许的运用程序模板作为您的新项目:
-
在接下来的屏幕上,提供一个产品称号(您喜爱的任何称号),挑选一个团队,并提供一个组织标识符。要从 Xcode 创立和导出 IPA,您需求具有苹果开发者许可证。
-
挑选在您的计算机上保存项目的位置。 Xcode 现在将创立一个简略的“Hello World”运用程序,而且您将在 Xcode 窗口中看到以下默许代码:
-
现在您能够尝试在内置的 iOS 模拟器上运转此运用程序。为此,请挑选一个可用的模拟器(只需点击顶部栏中的模拟器称号,列表将翻开),如下图所示:
运用程序应在所选模拟器上运转:
-
现在,让咱们从这个 Xcode 项目中导出 IPA。为此,请从模拟器选项中挑选“任何 iOS 设备(arm64)”选项。
-
然后,转到“产品|存档”,并挑选“分发运用程序”选项:
-
在接下来的屏幕上,挑选“开发”,并在随后的屏幕大将选项坚持默许设置。
-
最终,您将能够将 IPA 与其他一些编译的项目文件一同导出:
- 一旦导出 IPA 文件,只需将文件的扩展名更改为 .zip 即可:
- 运用任何东西解压文件并提取其内容:
# unzip MARE-Chapter-1.zip
以下截图显现了供参阅的成果:
- 进入 Payload 目录,然后进入 MobileAppReverseEngg-App-1.app 文件:
# cd Payload
# cd MobileAppReverseEngg-App-1.app
- 让咱们剖析 IPA 内部的组件,并将其与此处的列表(iOS 运用程序根底知识)进行比较:
以下图示说明晰逆向工程 iOS 运用程序的进程:
看一下图 1.3,了解在 Hopper 反汇编器中,一个反汇编二进制文件的样子。