原文衔接:平台玄虚https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05a-platform-overviewAndroid 基础安全测试https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05b-basic-security_testingAndroid 反逆向谨防https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05j-testing-resiliency-against-reverse-engineering桃乃木香奈 黑丝
目次 平台玄虚本节从架构的角度先容Android平台。 掂量了以下五个重要范畴:
Android安全架构 Android应用范例结构 进程间通讯(IPC) Android应用发布 Android应用报复面访谒官方的 Android 开发者文档网站(https://developer.android.com/),不错获取更多联系 Android 平台的详细信息。 Android 安全架构Android 是谷歌基于 Linux 开发的开源平台,它充任挪动操作系统(OS)。如今,该平台是多样当代本事的基础,如手机、平板电脑、可衣着本事、电视和其他"智能"开发。典型的 Android 版块具有一系列预装("内置")的应用范例,并守旧通过 Google Play 商店和其他市集装置第三方应用。
Android 的软件栈由几个不同的层构成。每层都界说了接口并提供特定的管事。
Android 软件栈
在最低层,Android 是基于 Linux 内核的变种。 在内核之上,硬件抽象层(HAL)界说了用于与内置硬件组件进行交互的范例接口。几种HAL 的兑现打包在了分享库模块中,Android 系统需要时就会调用。这是允许应用范例与开发的硬件进行交互的基础,举例,它允许一个内置的电话应用范例使用开发的麦克风和扬声器。
Android 应用范例浅薄使用 Java 编写并编译为 与传统的 Java 字节码有些不同的 Dalvik 字节码。首先将 Java 代码编译为 .class 文献,然后使用 dx 器具将 JVM 字节码调度为 Dalvik 的 .dex 格式,这么就创建了 Dalvik 字节码。
Java vs Dalvik
刻下版块的安卓在 Android 运行时(ART)上践诺此字节码。ART 是安卓原始运行时 Dalvik 捏造机的后继者。 Dalvik 和 ART 之间的重要分离在于字节码的践诺形状。
在Dalvik中,字节码在践诺时调度为机器码,这一过程称为即时(JIT)编译。JIT编译会对性能产生不利的影响:每次践诺应用范例时都必须进行编译。为了提高性能,ART 引入了提前(AOT)编译。顾名念念义,应用会在初度践诺之前进行预编译。预编译的机器代码会用于整个后续的践诺。AOT 将性能提高了两倍,同期谴责了功耗。
Android 应用范例不成径直访谒硬件资源,况兼每个应用范例都运行在我方的沙盒中。这允许对资源和应用范例进行精准的适度:举例,崩溃的应用范例不会影响开发上运行的其他应用范例。同期,Android 运行时会适度分拨给应用范例的最大系统资源数目,防护任何一个应用范例掌握过多的资源。
安卓用户和组尽管 Android 操作系统是基于 Linux,但它并不像其他类 Unix 系统那样兑现用户帐户。在 Android 中 Linux 内查对应用沙盒的多用户守旧:除了少数的例外,每个应用范例都像运行在一个单独的 Linux 用户下,有用地与其他应用和操作系统的剩余部分隔断。
文献 system / core / include / private / android_filesystem_config.h(_r6/xref/system/core/include/private/android_filesystem_config.h)包含了一个系统进程分拨的预界说用户和组的列表。装置其他应用范例时,会添上它们的 UID(userID)。更多详细信息,参阅 Bin Chen 对于 Android 沙箱的博客著作(https://pierrchen.blogspot.com/2016/09/an-walk-through-of-android-uidgid-based.html)。
举例,Android 7.0(API 品级24)界说了以下系统用户:
#define AID_ROOT 0 /* traditional unix root user */ #define AID_SYSTEM 1000 /* system server */ #... #define AID_SHELL 2000 /* adb and debug shell user */ #... #define AID_APP 10000 /* first app user */ ...Android 开发加密
安卓从 Android 2.3.4(API 品级10)最先守旧开发加密,而后发生了一些大的变化。Google 强制整个的开发运行 Android 6.0(API 品级23)或守旧存储加密的更高版块,有些低端开发被豁免,因为这会严重影响性能。鄙人面各节中,你不错找到联系开发加密过火算法的信息。
全盘加密Android 5.0(API 品级 21)及更高版块守旧全盘加密。这种加密使用用户开发密码保护的单个密钥来加密息争密 userdata 分区。面前这种加密已被弃用,并以为应尽可能使用基于文献的加密。全盘加密具有一些舛误,举例,如果用户未输入解锁密码,则重启后将无法接听电话或莫得操作警报。
基于文献加密Android 7.0(API 品级24)守旧基于文献的加密。基于文献的加密允许使用不同的密钥对不同的文献进行加密,以便不错沉寂解密它们。守旧这种加密形状的开发也守旧 Direct Boot 模式,Direct Boot 模式下开发不错在用户未解锁开发时访谒警报或赞成管事等能。
AdiantumAES 在大多数当代 Android 开发上用于存储加密。现实上,AES 照旧成为一种浅薄使用的算法,最新的处理器兑现存专用的指示集来提供硬件加快加密与解密操作,举例带有 Cryptography Extensions 的 ARMv8 或具有AES-NI 彭胀的 x86。然则,并非整个开发都能实时使用 AES 进行存储加密。尤其是运行Android Go 的低端开发。这些开发浅薄使用低端处理器,举例 ARM Cortex-A7,它们莫得硬件加快的 AES。
Adiantum 是由 Google 的 Paul Crowley 和 Eric Biggers 想象的密码结构,用于填补那些不成以至少 50 MiB/s 速率运行 AES 的开发的空缺。Adiantum 仅依赖于加法、移位旋转和异或,整个处理器都守旧这些操作,与使用 AES 比较,低端处理器的加密速率是 AES 的4倍,解密速率是 AES 的5倍。
Adiantum 由其他密码构成: NH:哈希函数。 Poly1305:音书认证代码(MAC)。 XChaCha12:一种流密码。 AES-256:AES的一次调用。Adiantum是一种新的密码,但只消 ChaCha12 和 AES-256 被以为是安全的,它即是安全的。它的想象者莫得创建任何新的加密基元,而是依赖于其他著名的、经过真切计议的基元来创建一个新性能的算法。
Adiantum 适用于 Android 9(API 品级 28)和更高版块。Linux 内核5.0及更高版块守旧该功能,而内核4.19、4.14 和4.9需要修补。Android 不向应用范例开发东说念主员提供使用 Adiantum 的API。这个加密将由 ROM 开发东说念主员或开发供应商但愿在不放胆低端开发性能的情况下提供全磁盘加密时谈判并实施。在撰写本文时,尚无寰球密码库兑现此加密可在 Android 应用范例上使用。应该留神的是,AES 在具有 AES指示集的开发上运行得更快,在这种情况下热烈不建议使用 Adiantum。
Android 安全强化Android 包含许多不同的功能,试图使坏心应用范例更难叛逃出沙盒。由于应用范例在您的开发上有用地运行代码,很紧迫的少量即是,即使应用范例本人不确切但也不错安全地践诺。以下各节解释了哪些缓解按序不错防护应用范例销耗破绽。需要留神的是,操作系统从来都不是 100% 安全的,即使弃取了这些缓解按序,新的破绽也仍会按期被发现。
SELinux安全强化的 Linux(SELinux)使用强制访谒适度(MAC)系统来进一步锁定哪些进程不错访谒哪些资源。每个资源都有一个标签,其体式是 user:role:type:mls_level,它界说了哪些用户不错对其践诺哪种类型的操作。举例,一个进程可能只可读取文献,而另一个进程不错裁剪或删除该文献。这么,通过使用最小特权原则,易受报复的进程更难通过权限进步或内网漫游被破绽诈欺。
联系更多信息,请访谒 Android 安全网站(https://source.android.com/security/selinux)。
ASLR, KASLR, PIE and DEP自 Android 4.1(API 品级 15)以来,地址马上化(ASLR)就已成为 Android 的一部分,它是防护缓冲区溢出报复的范例保护按序,这么不错确保将应用范例和操作系统都加载到马上的内存地址,从而很难获取特定的内存区域或库的正确地址。在 Android 8.0(API 品级26)中,也为内核兑现了这种保护(KASLR)。仅当不错将应用范例加载到内存中的马上位置时才不错使用ASLR保护,这由应用范例的位置无关可践诺文献(PIE)标志指示。从 Android 5.0(API 品级 21)最先,不再守旧未启用 PIE 的原生库。临了,数据践诺保护(DEP)不错防护代码在堆栈和堆上践诺,这也不错用来防护缓冲区溢露马脚。
联系更多信息,请访谒 Android 开发者博客(https://android-developers.googleblog.com/2016/07/protecting-android-with-more-linux.html)。
SECCOMPAndroid 应用范例不错包含用C或C ++编写的本机代码。这些编译的二进制文献不错通过 Java 腹地接口(JNI)绑定与 Android 运行时通讯,也不错通过系统调用与 OS 通讯。某些系统调用没用被兑现,或者不应由普通应用范例调用。由于这些系统调用径直与内核通讯,因此它们是破绽诈欺开发东说念主员的主要方针。在 Android 8(API 品级26)上,Android 引入了对整个基于 Zygote 的进程(即用户应用范例)的 Secure Computing(SECCOMP)过滤器的守旧, 这些过滤器将可用的系统调用限定为 bionic 公开的系统调用。
联系更多信息,请访谒 Android 开发者博客(https://android-developers.googleblog.com/2017/07/seccomp-filter-in-android-o.html)。
Android 上的应用范例与操作系统通讯Android 应用范例通过与提供高档 Java API 的抽象层即 Android 框架层与系统管事进行交互,这些管事大多数是通过旧例的 Java 方法来调用的,并调度为对在后台运行的系统管事的 IPC 调用。系统管事的实例有:
诱导性(Wi-Fi,蓝牙,NFC等) 文献 摄影机 地舆位置(GPS) 麦克风框架层还提供了常见的安全功能,举例加密。
每个新的 Android 版块都会调动API表率。重要的破绽建树和安全补丁浅薄也适用于早期的版块,在撰写本文时,守旧的最旧的 Android 版块是 Android 8.1(API 品级27),刻下的 Android 版块是Android 10(API 品级29)。
值得留神的API版块:
Android 4.2(API 品级16),2012年11月发布 (引入 SELinux) Android 4.3(API 品级18),2013年7月发布(默许启用SELinux) Android 4.4(API 品级19),2013年10月发布(引入了几个新的 API 和 ART) Android 5.0(API 品级21),2014年11月发布(默许使用 ART,并添加了许多其他功能) Android 6.0(API级别23),2015年10月发布(许多新功能和改造,包括在运行时授予详细的权限建树,而不是在装置时代授予全部权限或不提供任何权限) Android 7.0(API 品级24-25),2016年8月发布(ART 上的新 JIT 编译器) Android 8.0(API 品级26-27),2017年8月发布(安全性方面作念了好多改造) Android 9(API 品级28),2018年8月发布(限定麦克风或录像头的后台使用,引入锁定模式,整个应用范例默许 HTTPS) Android 10(API级别29),2019年9月发布(见知气泡,Project Mainline) 普通应用范例的Linux UID / GIDAndroid 诈欺 Linux 用户照管来隔断应用范例。但 这种方法不同于传统 Linux 环境下多个应用范例常由团结用户运行的用户照管用法。安卓为每个 Android 应用范例创建了一个唯独的 UID,并在单独的进程中运行该应用范例。因此,每个应用范例只可访谒我方的资源,此保护由 Linux 内核强制践诺。
浅薄,为应用范例分拨的 UID 在10000和99999之间。Android 应用范例会根据他们的 UID 收到一个用户名。举例,UID 为10188的应用范例收到用户名u0_a188。 如果授予了应用范例请求的权限,则会将相应的组 ID 添加到该应用范例的进程中。举例,底下的应用范例的用户 ID 是10188,它属于组 ID 3003(inet),该组与 android.permission.INTERNET 权限联系。id 大叫的输出如下所示。
$ id uid=10188(u0_a188) gid=10188(u0_a188) groups=10188(u0_a188),3003(inet), 9997(everybody),50188(all_a188) context=u:r:untrusted_app:s0:c512,c768
组ID和权限之间的关系鄙人面的文献中界说:
frameworks/base/data/etc/platform.xml(_r6/xref/frameworks/base/data/etc/platform.xml)
<permission name="android.permission.INTERNET" > <group gid="inet" /> </permission> <permission name="android.permission.READ_LOGS" > <group gid="log" /> </permission> <permission name="android.permission.WRITE_MEDIA_STORAGE" > <group gid="media_rw" /> <group gid="sdcard_rw" /> </permission>应用沙盒
应用范例在 Android 的应用沙盒中践诺,应用沙盒不错将应用范例的数据和代码践诺与开发上的其他应用范例隔断,这种隔断加多了一个安全层。
新应用范例装置后会创建一个根据该应用范例包定名的新目次,在以下旅途:/data/data/[package-name]。此目次保存了应用范例的数据。Linux 目次权限会被建树,以便只可使用应用范例的唯独 UID 来读取和写入目次。
Sandbox
咱们不错通过检讨 /data/data 文献夹中的文献系统权限来证明这少量。举例,咱们不错看到 Google Chrome 和 Calendar 都分拨了一个目次,并在不同的用户帐户下运行:
drwx------ 4 u0_a97 u0_a97 4096 2017-01-18 14:27 com.android.calendar drwx------ 6 u0_a120 u0_a120 4096 2017-01-19 12:54 com.android.chrome
但愿我方的应用范例都使用一个分享沙盒的开发东说念主员不错灭绝沙盒。当两个应用使用疏浚的文凭进行签名并显式分享疏浚的用户 ID(在它们的 AndroidManifest.xml 文献中包含 sharedUserId)时,每个应用都不错访谒对方的数据目次。请参阅以下示例,在 NFC 应用中兑现此看法:
<manifest xmlns:android="" package="com.android.nfc" android:sharedUserId="android.uid.nfc">Zygote
Zygote 进程在 Android 最先化时代启动。 Zygote 是用于启动应用范例的系统管事。Zygote 进程是一个包含应用范例需要的整个中枢库的“基本”进程,其中。启动后,Zygote 掀开套接字 /dev/socket/zygote 并监听来自腹地客户端的诱导。招揽到诱导后,它将派生一个新进程,然后该进程将加载并践诺应用专用代码。
App 人命周期在 Android 中,应用范例进程的生计期由操作系统适度。当启动应用范例组件况兼该应用范例尚未运行任何其他组件时,一个新的 Linux 进程会被创建。当不再需要进程或需要回收内存以运行更紧迫的应用范例时,Android 可能杀死该进程。 进程是否杀死主要和用户与进程交互的现象联系。浅薄,进程可能处于四种现象之一。
前台进程(举例,在屏幕顶部运行的步履或正在运行的播送招揽器)
可见进程是用户顽强到的进程,因此圮绝该过程将对用户体验产生彰着的负面影响。一个例子是运行一个用户在屏幕上可见但在前台不可见的步履。
管事进程是托管使用 startService 方法启动的管事的进程。尽管这些进程对用户来说不是径直看到的,然则它们浅薄是用户眷注的事情(举例,后台蚁集数据的上传或下载),因此,除非莫得实足的内存来保留整个前台和可见进程,系统将恒久保持这些进程运行。
缓存进程是刻下不需要的进程,因此系统不错在需要内存杀死它。应用范例必须兑现对多个事件作念出反应的回调方法。举例,在初度创建应用进程时会调用 onCreate 处理范例,其他回调方法包括 onLowMemory,onTrimMemory 和 onConfigurationChanged。
App BundlesAndroid 应用范例能以两种体式发布:AAndroid Package Kit(APK)文献或Android App Bundle(.aab)。Android App Bundle 提供了应用范例需要的整个资源,但推迟了 APK 的生成及向 Google Play 的签名。App Bundles 是经过签名的二进制文献,包含有应用范例的代码在几个模块中。基本模块包含应用范例的中枢,不错通过多样包含应用范例的新的功能的模块进行彭胀,这在 app bundle 开发者文档(https://developer.android.com/guide/app-bundle)中有进一步的说明。如果您有一个Android App Bundle,最好使用 Google 的bundletool(https://developer.android.com/studio/command-line/bundletool)大叫行器具来构建未签名的APK,以便使用 APK 上的现存器具。你不错通过运行以下大叫从 AAB 文献创建 APK:
$ bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
如果你想创建已签名的 APK,准备部署到测试开发,请使用:
$ bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks --ks=/MyApp/keystore.jks --ks-pass=file:/MyApp/keystore.pwd --ks-key-alias=MyKeyAlias --key-pass=file:/MyApp/key.pwd
咱们建议你同期测试带有和不带有附加模块的 APK,以便了了附加模块是否引入和(或)建树了基本模块的安全问题。
Android Manifest每个应用范例都有一个 Android Manifest 文献,该文献以二进制 XML 格式镶嵌内容。这个文献的范例称呼是 AndroidManifest.xml,它位于应用范例的 Android Package Kit(APK)文献的根目次中。
Manifest 文献态状了应用范例的结构、的组件(步履、管事、内容提供者和 intent 招揽者)和请求的权限。它还包含通用的应用范例的元数据,比如应用范例的图标、版块号和主题。该文献可能会列出其他信息,比如兼容的 API(最小、方针和最大的SDK版块)和不错装置的存储类型(外部或里面)(https://developer.android.com/guide/topics/data/install-location.html)。
底下是一个清单文献的示例,包括包名(惯例是反向的URL,但任何字符串都不错招揽)。它还列出了应用范例版块,联系 SDK,需要的权限,给出了内容提供者,使用 intent 过滤器的播送招揽器和应用范例过火步履的态状:
<manifest package="com.owasp.myapplication" android:versionCode="0.1" > <uses-sdk android:minSdkVersion="12" android:targetSdkVersion="22" android:maxSdkVersion="25" /> <uses-permission android:name="android.permission.INTERNET" /> <provider android:name="com.owasp.myapplication.MyProvider" android:exported="false" /> <receiver android:name=".MyReceiver" > <intent-filter> <action android:name="com.owasp.myapplication.myaction" /> </intent-filter> </receiver> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.Material.Light" > <activity android:name="com.owasp.myapplication.MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> </application> </manifest>
可用清单选项的圆善列表在官方 Android Manifest file 文档(https://developer.android.com/guide/topics/manifest/manifest-intro.html)中。
App 组件Android 应用范例由几个高档组件构成。主要构成有:
步履 碎屑 Intent 播送招揽器 内容提供者和管事整个这些元素都是由 Android 操作系统以 API 中预界说类的体式提供的。
步履Activity 构成了应用范例的可见部分。每个页面都有一个步履,是以一个有三个不同页面的应用范例会兑现三个不同的步履。步履通过剿袭 Activity 类来声明,包含整个用户界面元素:碎屑、视图和布局。
每个步履都需要在 Android 清单中使用以下语法声明:
<activity android:name="ActivityName"> </activity>
未在清单文献中声明的步履不会被骄慢,试图启动它们将激发极端。
和应用范例一样,步履也有我方的人命周期,况兼需要监视系统的变化来处理它们。步履不错处于以下现象:步履、暂停、住手和不步履,这些现象由 Android 操作系统照管。对应的, 步履不错兑现以下事件照管器:
onCreate onSaveInstanceState onStart onResume onRestoreInstanceState onPause onStop onRestart onDestroy应用范例不错不显式地兑现整个的事件照管器,在这种情况下会弃取默许的操作。浅薄,至少 onCreate 照管器会被应用范例开发东说念主者重写,这是大多数用户界面组件声明和最先化的形状。当资源(如蚁集诱导或数据库诱导)必须显式开释,或者当应用范例关闭时必须践诺特定操作时,onDestroy 可能被重写。
碎屑Fragment 暗意步履中的一个行动或用户界面的一部分。Android 在 Honeycomb 3.0 版块 (API 品级11)中引入了碎屑。
碎屑用于封装界面的各个部分,以促进可重用性和适宜不同屏幕大小。碎屑是自治的实体,它们包含了整个需要的组件(它们有我方的布局、按钮等等)。关联词,它们必须与步履集成才智有用:碎屑不成单独存在。它们有我方的人命周期,与兑现它们的步履的人命周期联系联。
因为碎屑有我方的人命周期,是以碎屑类包含不错从头界说和剿袭的事件照管器。这些事件照管器包括 onAttach、onCreate、onStart、onDestroy 和 onDetach。其他一些例子,读者应该参考 Android Fragment 表率(https://developer.android.com/guide/components/fragments)以得回更多细节。
通过剿袭 Android 提供的 Fragment 类,不错随便兑现碎屑:
Java 示例:
public class MyFragment extends Fragment { ... }
Kotlin 示例:
class MyFragment : Fragment() { ... }
碎屑不需要在清单文献中声明,因为它们依赖于步履。
为了照管碎屑,步履不错使用碎屑照管器 (FragmentManager 类)。这个类使得查找、添加、删除和替换联系的碎屑变得很容易。
碎屑照管器不错通过以下形状创建:
Java 示例:
FragmentManager fm = getFragmentManager();
Kotlin 示例:
var fm = fragmentManager
碎屑不一定有用户界面,它们不错成为照管和应用范例用户界面联系的后台操作的一种绵薄而高效的形状。一个片断不错被声明为持久的,这么即使步履被碎裂,系统仍然保持它的现象不变。
进程间通讯咱们照旧了解到,每个 Android 进程都有我方的沙箱地址空间。进程间通讯机制允许应用范例安全地交换信号和数据。Android 的 IPC 不依赖默许的 Linux IPC 器具,而是基于 Binder,即 OpenBinder 的自界说兑现。大多数 Android 系统管事和整个高档 IPC 管事都依赖 Binder。
Binder 这个词有好多不同的含义,包括:
Binder 驱动范例:内核级驱动范例
Binder 合同:用于与 Binder 驱动范例通讯的基于 ioctl 的初级合同
IBinder 接口:Binder 对象兑现的界说细密的行动
Binder 对象:IBinder 接口的通用兑现
Binder 管事:Binder 对象的兑现;举例,位置管事和传感器管事
Binder 客户端:使用 Binder 管事的对象
Binder 框架包括客户机-管事器通讯模子。为了使用 IPC,应用范例在代理对象中调用 IPC方法。代理对象透明地将调用参数打包并将事务发送到 Binder 管事器,Binder 管事器兑现为一个字符驱动范例(/dev/Binder)。管事器持有一个线程池,用于处理传入请求并将音书传递给方针对象。从客户端应用范例的角度来看,整个这些都像是一个旧例的方法调用,但重荷的责任都是由 Binder 框架完成的。
Binder 玄虚
Binder 玄虚图片开头:Android Binder by Thorsten Schreiber(https://www.nds.ruhr-uni-bochum.de/media/attachments/files/2011/10/main.pdf)
允许其他应用范例绑定的管事称为绑定管事,这些管事必须向客户机提供IBinder接口。开发东说念主员使用 Android 接口态状符言语(AIDL)为辛劳管事编写接口。
Servicemanager 是一个系统看护进程,它照管系统管事的注册和查找。它抠门整个注册管事的称呼/Binder对列表。使用 addService 添加管事,使用 android.os.ServiceManager 中的静态方法 getService 通过称呼获取管事:
Java 示例:
public static IBinder getService(String name) { try { IBinder service = sCache.get(name); if (service != null) { return service; } else { return getIServiceManager().getService(name); } } catch (RemoteException e) { Log.e(TAG, "error in getService", e); } return null; }
Kotlin 示例:
companion object { private val sCache: Map<String, IBinder> = ArrayMap() fun getService(name: String): IBinder? { try { val service = sCache[name] return service ?: getIServiceManager().getService(name) } catch (e: RemoteException) { Log.e(FragmentActivity.TAG, "error in getService", e) } return null } }
你不错通过 service list 大叫查询系统管事的列表。
$ adb shell service list Found 99 services: 0 carrier_config: [com.android.internal.telephony.ICarrierConfigLoader] 1 phone: [com.android.internal.telephony.ITelephony] 2 isms: [com.android.internal.telephony.ISms] 3 iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo]Intents
Intent 音书传递是建立在 Binder 之上的异步通讯框架。此框架允许点对点和发布-订阅音书传递。Intent是一个音书传递对象,不错用来请求另一个应用组件的动作。Intent 以几种形状促进组件间的通讯,底下是三个基本用例:
开启步履步履暗意应用范例中的一个界面。你不错通过将 intent 传递给 startActivity 来启动步履的一个新的实例。Intent 态状了步履并捎带必要的数据。
开启管事管事是在后台践诺操作的组件,莫得用户界面。在 Android 5.0(API 品级21)及更高版块中,你不错使用 JobScheduler 启动管事。
传递播送播送是任何应用范例都能招揽到的信息。系统为系统事件传递播送,包括系统指导和充电最先化。你不错通过传递 intent 给 sendBroadcast 或 sendOrderedBroadcast,来将一个播送传递给其他应用范例。
Intent 有两种类型。显式 intent 通过将要启动的组件定名(完全放胆类名)。举例:
Java 示例:
Intent intent = new Intent(this, myActivity.myClass);
Kotlin 示例:
var intent = Intent(this, myActivity.myClass)
隐式 intent 被发送给操作系统,以对一组给定的数据(底下示例中的OWASP网站的URL)践诺一个给定的操作,由系统决定哪个应用范例或类将践诺相应的管事。举例:
Java 示例:
Intent intent = new Intent(Intent.MY_ACTION, Uri.parse("https://www.owasp.org"));
Kotlin 示例:
var intent = Intent(Intent.MY_ACTION, Uri.parse("https://www.owasp.org"))
Intent 过滤器是 Android Manifest 文献中的一个抒发式,它指定组件想要招揽的 intent 类型。举例,通过为步履声明一个 intent 过滤器,你就不错让其他的应用以某种 intent 径直启动你的步履。相同地,如果莫得为步履声明任何 intent 过滤器,步履只可被一个显式 intent 启动。
Android 使用 intent 向应用范例播送音书(如回电或短信)、紧迫的电源信息(如电板电量不及)和蚁集变化(如诱导中断)。额外的数据不错添加到 intent(通过 putExtra/getExtras)。
底下是操作系统发送的 intent 的一个节略列表。整个常量都在 Intent 类中界说,整个这个词列表在官方的 Android 文档中:
ACTION_CAMERA_BUTTON ACTION_MEDIA_EJECT ACTION_NEW_OUTGOING_CALL ACTION_TIMEZONE_CHANGED为了提高安全性和深邃性,腹地播送照管器用于在应用范例中发送和招揽 intent,而不成将 intent 发送到操作系统的其他部分。这对于确保明锐和专有数据不会离开应用范例的规模(举例地舆位置数据)终点有用。
播送招揽器播送招揽器是允许应用范例招揽来自其他应用范例和系统本人的见知的组件。有了它们,应用范例不错对事件(里面的、由其他应用范例发起的或者由操作系统发起的)作出反应,它们浅薄用于更新用户界面、启动管事、更新内容和创建用户见知。
有两种方法不错让系统知说念一个播送招揽器。一种方法是在 Android Manifest 文献中声明它,清单中应该指定播送招揽器和 intent 过滤器之间的关联,以指示招揽器要监听的动作。
一个播送招揽器与 intent 过滤器在清单中的声明例子:
<receiver android:name=".MyReceiver" > <intent-filter> <action android:name="com.owasp.myapplication.MY_ACTION" /> </intent-filter> </receiver>
请留神,在本例中,播送招揽器不包括 android:exported 属性。因为至少界说了一个过滤器,是以默许值将被建树为“true”。如果莫得任何过滤器,它将被建树为“false”。
另一种方法是在代码中动态创建招揽器,招揽器不错使用方法 Context.registerReceiver 注册。
一个动态注册播送招揽器的例子:
Java 示例:
// Define a broadcast receiver BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Intent received by myReceiver"); } }; // Define an intent filter with actions that the broadcast receiver listens for IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.owasp.myapplication.MY_ACTION"); // To register the broadcast receiver registerReceiver(myReceiver, intentFilter); // To un-register the broadcast receiver unregisterReceiver(myReceiver);
Kotlin 例子:
// Define a broadcast receiver val myReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Log.d(FragmentActivity.TAG, "Intent received by myReceiver") } } // Define an intent filter with actions that the broadcast receiver listens for val intentFilter = IntentFilter() intentFilter.addAction("com.owasp.myapplication.MY_ACTION") // To register the broadcast receiver registerReceiver(myReceiver, intentFilter) // To un-register the broadcast receiver unregisterReceiver(myReceiver)
需要留神的是,当一个 intent 被发出时,系统会自动启动一个带有联系已注册招揽器的应用范例。
根据播送玄虚(https://developer.android.com/guide/components/broadcasts),如果不是专门针对应用范例,播送会被以为是“隐式的”。在招揽到一个的隐式播送后,Android 会列出整个在其过滤器中注册了特定动作的应用范例。如果有多个应用范例注册了疏浚的操作,Android 会教唆用户从可用的应用范例列表中进行弃取。
播送招揽器的一个道理功能是不错对它们进行优先级排序;通过这种形状,intent 将根据优先级被传递给整个授权的招揽者。优先级不错通过清单中的 android:priority 属性来分拨,也不错通过 IntentFilter.setPriority 方法编程分拨。然则请留神,具有疏浚优先级的招揽者将以自便限定运行(https://developer.android.com/guide/components/broadcasts.html#sending-broadcasts)。
如果你的应用不应该跨应用范例发送播送,不错使用腹地播送照管器(LocalBroadcastManager)。它们不错用来确保只招揽来自里面应用范例的 intent,而来自其他应用范例的 intent 将被丢弃。这对于提高应用范例的安全性和效果终点有用,因为不触及进程间通讯。然则请留神 LocalBroadcastManager 类已不保举使用(https://developer.android.com/reference/androidx/localbroadcastmanager/content/LocalBroadcastManager.html),谷歌建议使用 LiveData (https://developer.android.com/reference/androidx/lifecycle/LiveData.html)等替代方法。
联系播送招揽器的更多安全留神事项,请参见安全留神事项和最好作念法(https://developer.android.com/guide/components/broadcasts.html#security-and-best-practices)。
隐式播送招揽器限定根据后台优化(https://developer.android.com/topic/performance/background-optimization),针对 Android 7.0(API 品级24)或更高的应用不再招揽 CONNECTIVITY_ACTION 播送,除非使用 Context.registerReceiver() 注册播送招揽器。系统也不再发送 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 播送。
根据后台践诺限定(https://developer.android.com/about/versions/oreo/background.html#broadcasts),针对Android 8.0(API 品级26)及以上的应用,在隐式播送例外情况中列出的以外(https://developer.android.com/guide/components/broadcast-exceptions),不成在其清单中注册隐式播送招揽器。在运行时通过调用 Context.registerReceiver 创建播送招揽器不受此限定的影响。
根据系统播送发生的调动,从Android 9(API 品级28)最先,NETWORK_STATE_CHANGED_ACTION 播送不再接登第户的位置信息或个东说念主身份信息。
内容提供者Android 使用 SQLite 来持续化存储数据:与 Linux 一样,数据存储在文献中。SQLite 是一种轻量级、高效的开源关统共据存储本事,不需要太多的处理才略,这使得它终点适捏机使用。SQLite 有包含特定类(Cursor, ContentValues, SQLiteOpenHelper, ContentProvider, ContentResolver 等等)的圆善可用 API 。SQLite 不看成单独的进程运行的,它是应用范例的一部分。默许情况下,属于给定应用范例的数据库只可由该应用范例访谒。然则,内容提供者提供了一种很棒的来抽象数据源机制(包括数据库和平面文献),它们还提供了一种范例而有用的机制来在应用(包括腹地应用)之间分享数据。要让其他应用范例访谒内容提供者,需要在分享它的应用范例的清单文献中显式地声明内容提供者。只消莫得声明内容提供者,它们就不会被导出,只可由创建它们的应用范例调用。
内容提供者通过 URI 寻址决策兑现的:它们都使用了 content:// 模子。不管源的类型是什么(SQLite数据库、平面文献等),寻址决策都是疏浚的,因此对源进行了抽象,并为开发东说念主员提供了唯独的决策。内容提供者提供了整个旧例的数据库操作:创建、读取、更新、删除。这意味着任安在清单文献中领有适宜权限的应用范例都不错操作其他应用范例的数据。
管事管事是 Android OS 的组件(基于 Service 类),它们在后台践诺任务(数据处理、启动 intent 和见知等),而不提供用户界面。管事是用来历久运行进程的,它们的系统优先级低于步履应用范例,而高于不步履应用范例。因此,当系统需要资源时,它们不太可能被杀死,况兼不错将它们配置为在有实足的可用资源时自动重启,这使得管事终点适宜运行后台任务。请留神,管事和步履一样,都是在主应用范例线程中践诺的。管事不会创建我方的线程,也不会在单独的进程中运行,除非另行指定。
权限由于 Android 应用范例是装置在沙箱中,领先无法访谒用户信息和系统组件(比如录像头和麦克风),Android 为应用范例不错请求的特定任务提供了一套预界说的权限。举例,如果你想让你的应用范例使用手机的录像头,你必须请求 android.permission.CAMERA 权限。在Android 6.0(API 品级23)之前,应用范例请求的整个权限都在装置时授予。从 API 品级23最先,用户只可在应用范例践诺时代应许一些权限请求。
保护品级Android 的权限是根据其提供的保护级别进行排序的,分为四种不同的类别:
Normal:较低的保护级别。 它使应用范例不错访谒隔断的应用范例级功能,而对其他应用范例、用户或系统的风险最小。它是在应用装置过程中授予的,况兼是默许的保护级别。举例:android.permission.INTERNET
Dangerous:此权限允许应用范例践诺可能影响用户秘籍或用户开发正常运行的操作。装置时代可能不会授予此级别的权限,用户必须决定应用范例是否应该有这个权限。举例:android.permission.RECORD_AUDIO
Signature:只消在请求应用范例与声明该权限的应用范例使用疏浚的文凭签名时,才会授予此权限。如果签名匹配,则自动授予权限。举例:android.permission.ACCESS_MOCK_LOCATION
SystemOrSignature:此权限仅授予系统映像中镶嵌的应用范例或使用与声明该权限的应用疏浚的文凭进行签名的应用范例。举例:android.permission.ACCESS_DOWNLOAD_MANAGER
请求权限应用范例不错通过在其清单中包含 `
<uses-permission />` 标签来请求正常、危急和签名保护级别的权限。底下的例子是一个请求读取短信权限的 AndroidManifest.xml 示例:
<manifest xmlns:android="" package="com.permissions.sample" ...> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <application>...</application> </manifest>声明权限
应用范例不错向系统上装置的其他应用范例公开功能和内容。为了限定对我方组件的访谒,不错使用任何 Android 的预界说权限(https://developer.android.com/reference/android/Manifest.permission.html)或界说我方的权限,使用元素 <permission> 声明一个新的权限。底下的例子展示了一个应用范例的权限声明:
<manifest xmlns:android="" package="com.permissions.sample" ...> <permission android:name="com.permissions.sample.ACCESS_USER_INFO" android:protectionLevel="signature" /> <application>...</application> </manifest>
上头的代码界说了一个新的权限 com.permissions.sample.ACCESS_USER_INFO,其保护级别为 Signature。任何受此权限保护的组件只可由疏浚开发者文凭签名的应用范例访谒。
Android组件的强制权限
Android 组件不错使用权限机制来保护它们的接口。不错通过在 AndroidManifest.xml 中的相应组件标签中添加属性 android:permission 来在步履、管事和播送招揽器使用强制权限。
<receiver android:name="com.permissions.sample.AnalyticsReceiver" android:enabled="true" android:permission="com.permissions.sample.ACCESS_USER_INFO"> ... </receiver>
内容提供者有一些不同,它们守旧一组单独的权限,使用内容 URI 来读取,写入和访谒内容提供者。
android:writePermission,android:readPermission:开发东说念主员不错建树单独的读取或写入权限。 android:permission:适度对内容提供者读写的一般权限。 android:grantUriPermissions:如果不错使用内容URI 访谒内容提供者,则为“ true”(访谒暂时绕过其他权限的限定),不然为“ false”。 签名和发布经由一朝应用范例得胜开发,下一步即是发布分享给其他东说念主。关联词,应用范例不成毛糙地添加到商店并分享,它们必须首先签名,该加密签名看成应用范例开发者摈弃的可考据标记。它识别应用范例的作家,并确保应用范例自领先发布以来莫得被修悛改。
签名过程在开发过程中,应用范例使用自动生成的文凭进行签名,此文凭骨子上是不安全的况兼仅用于调试。大多数商店不招揽这种文凭进行发布,因此,必须创建具有更安全的特色的文凭。当一个应用范例装置在 Android 开发上时,包照管器会确保它是用包含在相应 APK 中的文凭进行的签名。如果文凭的公钥与用于开发上任何其他 APK 签名的密钥相匹配,那么新的 APK 可能与已存在的 APK 分享一个 UID。这促进了来自单个供应商的应用范例之间的交互,或者,指定的安全权限 对 Signature 保护级别来说是可能的,这将限定对使用疏浚密钥签名的应用范例的访谒。
APK 签名决策Android 守旧三种应用签名决策。从 Android 9(API level 28)最先,APK 不错通过 APK 签名决策 v3 、APK 签名决策 v2 或 JAR 签名(v1 决策)进行考据。对于 Android 7.0 (API 品级24)及以上版块,不错通过 APK 签名决策 v2 或 JAR 签名(v1决策)对 APK 进行考据。为了向后兼容,APK 不错使用多种签名决策进行签名,以使应用范例在较新的和较旧的 SDK 版块上都运行。旧的平台会忽略 v2 签名,只考据 v1 签名(https://source.android.com/security/apksigning/)。
JAR 签名(v1 决策)应用范例签名的原始版块将签名的 APK 兑现为范例的签名 JAR,它必须包含 META-INF/MANIFEST.MF 中的整个条件,整个文献都必须使用一个寰球文凭签名,这个决策不保护 APK 的某些部分,比如 ZIP 元数据。该决策的舛误是 APK 考据者在应用签名之前需要对不确切的数据结构进行处理,况兼考据者会丢弃数据结构不包含的数据。此外,APK 考据者必须解压整个压缩文献,这需要大都的时分和内存。
APK 签名决策(v2决策)在 APK 签名决策中,对圆善的 APK 进行哈希和签名,然后创建一个 APK 签名分块并插入到 APK 中。在考据时代,v2 决策检验整个这个词 APK 文献的签名。这种体式的 APK 考据速率更快,况兼提供了更全面的防点窜保护。你不错鄙人面看到 v2 决策的 APK 签名考据过程(https://source.android.com/security/apksigning/v2#verification)。
apk 签名考据过程 v2 决策
v3 APK 签名块格式与 v2相 同。v3 将联系受守旧的 SDK 版块和 proof-of-rotation 结构的信息添加到 APK 签名分块中。在 Android 9(API 品级28)及以上版块中,不错根据APK签名决策 v3、v2 或 v1 决策对 APK 进行考据。旧的平台会忽略 v3 签名尝测考据 v2 签名,然后考据v1签名。
签名数据部分中的 proof-of-rotation 属性包含一个单链表,其中每个节点都包含用于为之前版块的应用签名的签名文凭。为了兑现向后兼容性,系统会让每个节点中的文凭为列表中的下一个文凭签名,从而为每个新密钥提供凭证来证明它应该像旧密钥一样确切。单独对 APK 签名照旧不可能了,因为 proof-of-rotation 结构必须使用旧的签名文凭来对新的文凭集签名,而不是一个一个地对它们签名。你不错鄙人面看到APK签名 v3 决策考据过程。(https://source.android.com/security/apksigning/v3)
apk 签名考据过程 v3 决策
Android 使用寰球/专有文凭来签名 Android 应用范例(.apk文献)。文凭包含了大都的信息,就安全性而言,密钥是是最紧迫的信息类型。寰球文凭包含用户的公钥,专有文凭包含用户的私钥。寰球文凭和专有文凭是衔接的。文凭是唯独的不成从头生成,请留神,如果一个文凭丢失了它就无法复原,因此更新任何使用该文凭签名的应用范例将变得不可能。应用范例创建者不错重用可用密钥存储库中现存的专有/寰球密钥对,也不错生成新的密钥对。在 Android SDK 中,使用 keytool 大叫生成一个新的密钥对。底下的大叫创建一个密钥长度为2048位、过期时分为7300天即20年的 RSA 密钥对。生成的密钥对存储在刻下目次中的文献 'myKeyStore.jks' 中):
$ keytool -genkey -alias myDomain -keyalg RSA -keysize 2048 -validity 7300 -keystore myKeyStore.jks -storepass myStrongPassword
安全地存储你的密钥并确保它在整个这个词人命周期中保持奥密性是极其紧迫的。任何得回密钥访谒权限的东说念主都不错将你无法适度的内容(从而添加不安全的特色或使用基于签名的权限访谒分享内容)更新到你的应用范例中。用户对应用范例过火开发者的信任完全基于这些文凭,因此,文凭保护和安全照管对于声誉和客户去留至关紧迫,密钥永远不成与其他个东说念主分享。密钥存储在不错用密码保护的二进制文献中,这么的文献被称为密钥存储库。密钥存储库的密码应该是雄厚的,况兼只消密钥创建者知说念。因此,密钥浅薄存储在开发东说念主员对其访谒受限的专用构建机器上。Android 文凭的有用期必须越过联系应用范例(包括更新版块的应用范例),举例,Google Play 要求文凭至少在2033年10月22日之前保持有用。
签名一个应用范例签名过程的方针是将应用程小引件(.apk)与开发东说念主员的公钥关联起来。为了兑现这少量,开发东说念主员臆想 APK 文献的哈希,并用他们我方的私钥加密它。第三方不错使用作家的公钥解密加密的哈希来考据应用范例的真实性(举例,应用范例确乎来自宣称是发起者的用户),考据它与 APK 文献的真实哈希匹配。
许多集成开发环境(IDE)集成了应用范例签名过程让用户更容易使用。请留神,有些 IDE 在配置文献中以明文存储私钥,请仔细检验,以防其他东说念主大约访谒这些文献并在必要时删除这些信息。通过 Android SDK(API 品级24及以上)提供的“apksigner”器具,不错从大叫行中对应用范例进行签名。它位于 [SDK-Path]/build-tools/[version]。对于 API 24.0.2 及以下版块,不错使用”jarsigner“,它是 Java JDK 的一部分。整个这个词过程的细节不错在 Android 官方文档中找到,底下给出了一个例子来说明这少量。
$ apksigner sign --out mySignedApp.apk --ks myKeyStore.jks myUnsignedApp.apk
在这个示例中,一个未签名的应用范例(“myUnsignedApp.apk”)将使用来自开发东说念主员密钥存储库“myKeyStore.jks”(位于刻下目次中)的私钥进行签名。该应用范例将成为名为“ mySignedApp.apk”的已签名应用范例,并准备发布到商店。
Zipalign在发布之前,应该恒久使用 zipalign 器具来对皆 APK 文献。这个器具在 APK 中对皆整个未压缩的数据(如图像、原始文献和4字节规模),这有助于在应用范例运行时改造内存照管。
在使用 apksigner 签名 APK 文献之前,必须使用 Zipalign。
发布过程因为 Android 生态系统是敞开的,是以不错在职何地点(你我方的网站,任何商店等等)发布应用范例。关联词,Google Play 是最知名、最受信任和最受接待的商店,Google 本人就提供这种管事。亚马逊应用商店是 Kindle 开发的默许确切的商店。如果用户想要从不受信任的开头装置第三方应用范例,他们必须在开发安全建树中明确允许这么作念。
安卓开发上不错通过多种渠说念装置应用:腹地USB、Goolgle 官方应用商店(Google Play Store)或其他商店。
鉴于其他供应商可能会在应用范例真确发布前对其进行审查和批准,谷歌只会扫描已知的坏心软件签名,这将谴责发布过程的最先到公开应用范例可用性之间的时分。
发布一个应用范例终点毛糙,主要操作是使签名 APK 文献可下载。在 Google Play 上,发布从创建账号最先,然后通过专用界面发布应用范例。详细信息不错在 Android 官方文档(https://developer.android.com/distribute/best-practices/launch)中找到。
安卓应用报复层面Android 应用范例报复面由应用范例的整个组件构成,包括发布应用范例和守旧其功能所需的守旧材料。Android应用范例可能容易受到报复如果不这么作念:
通过 IPC 通讯或 URL 决策考据整个输入,见:通过 IPC 测试明锐功能显现测试自界说URL决策
考据用户在输入字段中的整个输入。
考据在 WebView 中加载的内容,见:在 Webview 中测试 JavaScript 践诺测试 WebView 合同处理范例细则是否通过 Webview 公开 Java 对象
安全地与后端管事器通讯,不然易在管事器和挪动应用范例之间受到中间东说念主报复测试蚁集通讯安卓蚁集 API
安全存储整个腹地数据,不从存储中加载不确切的数据,参见:Android 上的数据存储
保护我方免受环境碎裂,如从头打包或其他腹地报复,见:Android反逆向谨防
Android 基础安全测试基础的安卓测试门径到面前为止,你应该对 Android 应用范例的结构和部署形状有了基本的了解。在本章中,咱们将掂量怎么建立一个安全测试环境,并态状您将使用的基本测试经由。本章是后头章节中掂量的更详细的测试方法的基础。您不错在简直整个运行 Windows、Linux 或 Mac OS 的机器上建树一个功能圆善的测试环境。
主机开发至少,你需要 Android Studio(附带 Android SDK)平台器具、一个模拟器和一个应用范例来照管多样 SDK 版块和框架组件。Android Studio 还附带了一个用于创建模拟器映像的 Android 捏造开发(AVD)照管器应用范例。确保你的系统上装置了最新的 SDK 器具和平台器具包。
此外,如果你狡计使用包含原生库的应用范例,你可能想要通过装置 Android NDK来完成主机建树(这在“Android 上的点窜和逆向工程”一章中也会提到)。
建树 Android SDK通过 Android Studio 来照管腹地的 Android SDK 装置。在 Android Studio 中创建一个空技俩并弃取 Tools -> SDK Manager 来掀开 SDK Manager GUI。SDK Platform 选项卡上不错装置多个 API 品级的 SDK。最近的 API 品级为:
Android 10.0(API 品级29) Android 9.0(API 品级28) Android 8.1(API 品级27) Android 8.0(API 品级26)整个 Android 代号、版块号和 API 品级的玄虚不错在 Android 开发者文档中找到。
已装置的 SDK 位于以下旅途:
Windows:
C:\Users\<username>\AppData\Local\Android\sdk
MacOS:
/Users/<username>/Library/Android/sdk
留神:在 Linux 上,你需要弃取一个SDK目次,/opt、/srv 和 /usr/local 是常见的弃取。
建树 Android NDKAndroid NDK 包含原生编译器和器具链的预编译版块。GCC 和 Clang 编译器在传统上都得到了守旧,然则对 GCC 的积极守旧在 NDK第14版收尾了。开发体系缚构和主机操作系统决定适宜的版块,预编译的器具链在 NDK 的 toolchains 目次中,每种架构包含一个相应的子目次。
除了弃取正确的体系缚构之外,你还需要为想要方针 Native API 品级指定正确的 sysroot。sysroot 是一个包含方针系统头文献和库的目次。Native API 因 Android API 品级的不同而不同。每个Android API 品级的 sysroot 目次都不错在 $NDK/platforms/ 中找到。每个API级别目次都包含多样 CPU 和体系缚构的子目次。
建树编译系统的一种可能是将编译器旅途和必要的标记导出为环境变量。不外,为了让事情变得更毛糙,NDK 允许你创建一个所谓的沉寂器具链,这是一个临时的器具链,包含了所需的建树。
要建立一个沉寂的器具链,需要下载 NDK 最新的阐明版块。解压缩 ZIP 文献,切换到 NDK 根目次,运行以下大叫:
$ ./build/tools/make_standalone_toolchain.py --arch arm --api 24 --install-dir /tmp/android-7-toolchain
这将在 /tmp/android-7-toolchain 目次中为Android 7.0(API 品级24)创建一个沉寂的器具链。为了绵薄,不错导出一个指向器具链目次的环境变量(咱们将在示例中使用它)。运行以下大叫或将它添加到 .bash_profile 中或其他启动剧本:
$ export TOOLCHAIN=/tmp/android-7-toolchain测试开发
为了进行动态分析,你需要一个 Android 开发来运行方针应用范例。原则上,你不错在莫得真确的 Android 开发的情况下进行测试,况兼只使用模拟器。关联词,应用范例在模拟器上践诺得相配慢,模拟器可能不会给出真实的闭幕。在真实的开发上进行测试不错使过程愈加顺畅,环境也愈加真实。另一方面,模拟器允许你随便地调动 SDK 版块或创建多个开发。下表列出了每种方法的优舛误。
Property Physical Emulator/Simulator 复原才略 形成软砖老是可能的,但浅薄仍不错刷机,形成黑砖很有数。 模拟器可能会崩溃或损坏,但不错创建一个新的模拟器或复原一个快照。 重置 不错复原到工场建树或刷机。 不错删除和从头创建模拟器。 快照 不可能。 更好地守旧坏心软件分析。 速率 比模拟器快得多。 浅薄比较慢,但正在进行改造。 本钱 可用的开发一般起价200好意思元,你可能需要不同的开发,举例带有或不带有生物识传闻感器的开发。 免费的和交易的处治决策都存在。 root 难度 高度依赖于开发。 浅薄默许 root 模拟器检测难度 不是一个模拟器,模拟器检测不使用 将存在许多伪像,从而不错随便检测到该应用范例正在模拟器中运行。 root 检测难度 荫藏 root 更容易,因为许多 root 检测算法都会检验模拟器属性, 借助Magisk Systemless,root 简直无法检测到。 模拟器简直老是会触发 root 检测算法,这是因为模拟器是为测试许多可发现的伪像而编译的。 硬件交互 通过蓝牙,NFC,4G,Wi-Fi,生物识别,相机,GPS,陀螺仪...随便交互 浅薄相配有限,模拟硬件输入(举例,马上GPS坐标) API 品级守旧 取决于开发和社区。活跃的社区会不休发布更新的版块(比如 LineageOS),而不太流行的开发可能只会收到一些更新。在版块之间切换需要刷机,这是一个乏味的过程。 恒久守旧最新版块,包括 beta 版块。不错随便下载和启动包含特定 API 品级的模拟器。 原生库守旧 原生库浅薄是为 ARM 开发编译的,是以它们会在一个物理开发上责任 一些模拟器运行在 x86 CPU 上,因此它们可能不成运行打包的原生库。 坏心软件危急 坏心软件样本不错感染开发,但如果你不错吊销开发存储并刷机,从而将其复原到出厂建树,这应该不是问题。请留神,有些坏心软件样本会试图诈欺 USB 网桥。 坏心软件样本不错感染模拟器,但模拟器不错毛糙地删除和从头创建。也不错创建快照并比较不同的快照来匡助分析坏心软件。请留神,有凭证存在试图报复 hypervisor 的坏心软件。 在一个真实开发上测试简直任何物理开发都不错用于测试,然则有一些需要谈判的事项。首先,开发需要 root,浅薄通过破绽诈欺或未锁定的指导加载范例来完成此操作。 破绽诈欺并不老是可用的,况兼指导加载范例可能被永恒锁定,或者只消在运营商合同圮绝后才智被解锁。
最好候选开发是为开发者打造的旗舰 Google pixel 开发。这些开发浅薄都带有未锁定的指导加载范例、开源的固件、内核、在线电台和官方操作系统源代码。开发者社区更心爱 Google 开发,因为该操作系统最接近 android 开源技俩。 这些开发浅薄具有最长的守旧窗口,具有2年的 OS 更新和1年的安全更新。
另外,Google 的 Android One 技俩包含的开发将会得到相同的守旧窗口(2年的操作系统更新,1年的安全更新),况兼有接近原生的教导。诚然它领先是一个针对低端开发的技俩,但该技俩照旧发展到包括中端和高端智高手机,其中许多都得到了 modding 社区的积极守旧。
LineageOS技俩守旧的开发亦然测试开发的很好的候选开发。他们有一个活跃的社区,易于死守的刷机和 root 说明,况兼浅薄不错通过 Lineage 装置快速得回最新的 Android 版块。在 OEM 住手发布更新后很长一段时分里,LineageOS 还陆续守旧新的 Android 版块。
当使用 Android 物理开发时,你需要启用开发者模式和开发上的 USB 调试,以便使用 ADB 调试接口。自 Android 4.2(API 品级16)以来,手机建树菜单中开发者选项默许是荫藏的,要激活它,点击对于手机中的版块号部分七次。请留神,版块号字段的位置因开发略有不同。举例,在LG手机上,它是 About phone -> Software information。一朝你这么作念了,开发者选项将骄慢在建树菜单的底部。一朝开发者选项被激活,你不错使用 USB 调试开关启用调试。
在模拟器上调试存在多种模拟器,它们各有优舛误:
免费模拟器:
Android 捏造机开发(AVD)- 官方的Android模拟器,与Android Studio全部发布。
Android X86 - 安卓代码库的 X86 接口
交易模拟器:
Genymotion - 具有许多特色的熟谙仿模拟器,不错看成腹地和基于云的处治决策,提供非交易使用的免费版块。
Corellium - 通过基于云或腹地的处治决策提供自界说开发捏造化。
诚然有其他一些免费的 Android 模拟器,但咱们保举使用 AVD,因为它提供了与其他模拟器比较更适宜测试应用范例的增强功能。在本指南的其余部分中,咱们将使用官方的 AVD 来践诺测试。
AVD 守旧一些硬件仿真,如 GPS、SMS 和畅通传感器。
你不错使用 Android Studio 中的 AVD 照管器启动 Android 捏造开发(AVD),也不错在大叫行中使用 android 大叫启动 AVD 照管器,在 Android SDK 的 tools 目次中不错找到:
$ ./android avd
不错使用一些器具和 VM 在模拟器环境中测试应用范例:
MobSF Nathan(自2016年起未更新) 获取特权访谒Rooting(举例,修改 OS 以便你不错看成 root 用户运行大叫)建议在真实开发上进行测试。这使你大约完全适度操作系统,并允许您绕过应用范例沙盒之类的限定。这些特权又允许你更容易地使用代码注入和函数 hook 等本事。
留神,root 是有风险的,在你陆续之前,需要弄清三个主要后果。Root 可产生以下负面影响:
取消开发保修(在弃取任何行动之前,一定要检验制造商的战术) 开发变砖,即开发无法操作和使用 创建额外的安全风险(因为浅薄会删除内置的破绽缓解按序)你不应该 root 一个存储着私东说念主信息的个东说念主开发,咱们建议购买一个低廉的专用测试开发。许多老的开发,比如谷歌的 Nexus 系列,都不错运行最新的 Android 版块,用来测试终点好。
你需要昭着,root 你的开发最终是你我方的决定,OWASP 不会对任何损坏负责。如果你不细则,在最先 root 过程之前应该寻求群众的建议。
哪些手机不错 root现实上,任何 Android 手机都不错 root。Android OS(在内核级是 Linux OS 的演化)的交易版块针对挪动天下进行了优化。这些版块中,一些特色被删除或禁用了,举例,非特权用户不错成为 root 用户(领有进步的特权)。Root 手机意味着允许用户成为 root 用户,举例,添加一个名为 su 的范例 Linux 可践诺文献,可用于调动为另一个用户帐户。
要 root 一个挪动开发,首先解锁它的启动指导范例,解锁的过程取决于开发制造商。关联词,出于现实的原因,root 某些挪动开发要比其他开发更受接待,尤其是在安全测试方面:Google 开发的,Samsung、LG 和 Motorola 等公司制造的开发最受接待,尤其是因为它们被许多开发东说念主员使用。当指导加载范例被解锁时,开发保证不会失效,谷歌提供了许多器具来守旧 root。XDA 论坛上发布了精选的整个主流品牌开发的 root 指南。
使用 Magisk 得回 root 权限Magisk(“Magic Mask”)是一种 root 你的 Android 开发的方法,它的特殊性在于对系统进行修改的形状。当其他的 root 器具改变系统分区上的现实数据时,Magisk 不会(它被称为“systemless“)。这么就不错荫藏对 root 明锐的应用范例(举例银行或游戏)的修改,况兼在 root 的情况下允许使用官方的 Android OTA 升级
你不错通过阅读 GitHub 上的官方文档来熟悉 Magisk。如果您莫得装置 Magisk,不错在文档中找到装置说明。如果你使用认的确 Android 版块并有谋划升级,Magisk 在 GitHub 上提供了一个教程。
此外,开发东说念主员不错使用 Magisk 的遍及功能创建自界说模块,并将它们提交到官方的 Magisk 模块库,提交的模块不错装置在 Magisk 照管器应用范例中。著名的 Xposed 框架的 systemless 版块(适用于高达27的 SDK 版块)是这些可装置模块之一。
Root 检测Root 检测方法的一个详细列表在“在 Android 上测试反逆向谨防”一章中被忽视。
对于典型的挪动应用范例安全性编译版块,你浅薄但愿测试一个禁用 root 检测的调试版块编译。如果这么的编译无法用于测试,你不错使用多样方法禁用 root 检测,这将在本书后头先容。
Android 开发上保举的器具本指南中使用了许多器具和框架来评估 Android 应用范例的安全性。鄙人一节中,你将了解更多一些大叫和道理的使用案例,请参阅官方文档了解联系下列器具的装置说明:
APK Extractor:不需要 root 即可索要 APK 的应用范例。
Frida server:Frida 的管事器,适用于开发东说念主员、逆向工程东说念主员和安全计议东说念主员的动态器具套件。联系更多信息见底下的 Frida 部分。
Drozer代理:drozer 的代理,该框架使您不错搜索应用范例和开发中的安全破绽。联系更多信息见底下的 Drozer 部分。
Busybox:Busybox 将多个常见的 Unix 实用范例组合成一个小的可践诺文献。浅薄,所包含的实用范例比其功能皆全的同类范例 GNU 具有更少的弃取,但足以在袖珍或镶嵌式系统上提供圆善的环境。Busybox 不错装置在 root 开发上,通过从 Google Play 商店不错下载 Busybox 应用范例。你也不错径直从 Busybox 网站下载二进制文献。下载后,运行 adb push busybox / data / local / tmp 传输文献笔直机上。在 Busybox FAQ 中不错找到联系怎么装置和使用 Busybox 的快速玄虚。
XposedXposed 是一个“无需调动 APK 即可调动系统和应用范例行动的模块框架。”从本事上讲,它是Zygote的彭胀版块,在启动新进程时会导出用于运行 Java 代码的 API。在新实例化的应用范例高下文中运行 Java 代码不错剖析、hook 和重写属于该应用范例的 Java 方法。Xposed 使用反射来检测和修改正在运行的应用范例,修改会应用到内存中,况兼仅在进程的运行时持久保存,并未修改应用范例二进制文献。
要使用 Xposed,首先需要像 XDA-Developers Xposed framework hub 上解释的那样,在一个 root 开发上装置 Xposed 框架。模块不错通过 Xposed 装置范例装置,通过 GUI 掀开和关闭它们。
留神:谈判到 SafetyNet 很容易检测到 Xposed 框架的毛糙装置,咱们建议使用 Magisk 来装置 Xposed。这么,带有 SafetyNet 认证的应用范例会具有更高的使用 Xposed 模块进行测试的契机。
Xposed 已与 Frida 进行了比较。 在 root 开发上运行 Frida server 时,最终你将得到一个相同有用的建树。当你要进行动态检测时,这两个框架都十分有用。当 Frida 使应用范例崩溃时,你不错尝试在 Xposed 上使用访佛的方法。接下来,访佛于大都的 Frida 剧本,你不错随便地使用 Xposed 的宽广的模块,举例前边掂量的绕过 SSL pinning 模块(JustTrustMe 和 SSLUnpinning)。Xposed 还包括其他模块,举例 Inspeckage,它使你大约进行应用范例更多的深度测试。最紧迫的是,你还不错创建我方的模块,以修改 Android 应用范例的常用安全机制。
Xposed 也不错通过底下的剧本装置在模拟器上:
#!/bin/sh echo "Start your emulator with 'emulator -avd NAMEOFX86A8.0 -writable-system -selinux permissive -wipe-data'" adb root && adb remount adb install SuperSU\ v2.79.apk #binary can be downloaded from adb push root_avd-master/SuperSU/x86/su /system/xbin/su adb shell chmod 0755 /system/xbin/su adb shell setenforce 0 adb shell su --install adb shell su --daemon& adb push busybox /data/busybox #binary can be downloaded from https://busybox.net/ # adb shell "mount -o remount,rw /system && mv /data/busybox /system/bin/busybox && chmod 755 /system/bin/busybox && /system/bin/busybox --install /system/bin" adb shell chmod 755 /data/busybox adb shell 'sh -c "./data/busybox --install /data"' adb shell 'sh -c "mkdir /data/xposed"' adb push xposed8.zip /data/xposed/xposed.zip #can be downloaded from https://dl-xda.xposed.info/framework/ adb shell chmod 0755 /data/xposed adb shell 'sh -c "./data/unzip /data/xposed/xposed.zip -d /data/xposed/"' adb shell 'sh -c "cp /data/xposed/xposed/META-INF/com/google/android/*.* /data/xposed/xposed/"' echo "Now adb shell and do 'su', next: go to ./data/xposed/xposed, make flash-script.sh executable and run it in that directory after running SUperSU" echo "Next, restart emulator" echo "Next, adb install XposedInstaller_3.1.5.apk" echo "Next, run installer and then adb reboot" echo "Want to use it again? Start your emulator with 'emulator -avd NAMEOFX86A8.0 -writable-system -selinux permissive'"
请留神,在撰写本文时,Xposed 无法在 Android 9(API 品级28)上运行。然则在2019年它以 Edxposed 的名字被非认真地移植,守旧Android 8-10(API 品级26至29),你不错在 EdXposed 的 Github 仓库中找到代码和用法示例。
主机上保举的器具为了分析Android应用范例,你应该在你的主机上装置以下器具。请在官方文档中检讨以下器具或框架的装置说明,咱们将在指南中提到它们。
Adbadb(Android Debug Bridge),随 Android SDK 全部提供,诱导腹地开发环境和已诱导的 Android 开发。你浅薄会使用它在模拟器或通过 USB 或 Wi-Fi 诱导的开发上测试应用范例。使用 adb devices 大叫不错列出诱导的开发,践诺时并加上 -l 参数不错检索联系这些开发的更多细节。
$ adb devices -l List of devices attached 090c285c0b97f748 device usb:1-1 product:razor model:Nexus_7 device:flo emulator-5554 device product:sdk_google_phone_x86 model:Android_SDK_built_for_x86 device:generic_x86 transport_id:1
adb 提供了其他有用的大叫,比如 adb shell 在方针开发上启动交互式的 shell,以及 adb forward 将特定主机端口上的流量转发到诱导开发上的不同端口。
$ adb forward tcp:<host port> tcp:<device port>
$ adb -s emulator-5554 shell root@generic_x86:/ # ls acct cache charger config ...
请留神,如果诱导了多个开发,则必须使用 -s 参数界说方针开发的序列号(如上一代码片断所示)。
AngrAngr 是一个用于分析二进制文献的 Python 框架。它对于静态和动态象征分析都是有用的。换句话说:给定一个二进制和一个请求现象,Angr将尝试到达阿谁现象,使用体式化的方法(一种用于静态代码分析的本事)来找到一条旅途,以及强制践诺。使用 angr 来得回请求的现象浅薄比手动调试和搜索通往所需现象的旅途要快得多。Angr 使用VEX 中间言语进行操作,并带有 ELF/ARM 二进制文献加载范例,因此终点适宜处理原生代码,举例原生 Android 二进制文献。
Angr 允许使用大都插件来进行反汇编、范例检测、象征践诺、适度流分析、数据依赖分析、反编译等等。
自从版块8,Angr 是基于 Python3 并不错使用 pip 装置在*nix操作系统、macOS 和 Windows 上:
$ pip install angr
angr 的一些依赖项包含 Python 模块 Z3 和 PyVEX 的派生版块,这将遮盖原始版块。如果你将这些模块用于其他用途,则应该使用 Virtualenv 创建一个专用的捏造环境。另外,你也不错使用提供的 docker 容器。联系更多细节,请参阅装置指南。
在 Angr 的 Gitbooks 页面上有全面的文档,包括装置指南、教程和使用示例,还提供了圆善的 API 参考。
你不错通过 Python REPL(如 iPython)使用angr,也不错编写方法剧本。尽管 angr 的学习弧线有些笔陡,然则尽管 angr 的学习弧线有些笔陡,然则当你想要通过强制的形状得到一个可践诺文献的给定现象,咱们如故建议你使用它。请见“逆向工程和点窜”一章的“象征践诺”部分,不错看成一个很好的例子来说明它是怎么责任的。
ApktoolApktool 用于解压 Android 应用范例包(APK)。毛糙地用范例 unzip器具解压 APK 会留住一些不可读的文献。AndroidManifest.xml 被加密成二进制 XML 格式,文本裁剪器无法读取。此外,应用范例资源仍然被打包到一个存档文献中。
当使用默许大叫行参数运行时,apktool 会自动将 Android 清单文献解密为为基于文本的 XML 格式并索要文献资源(它还会将 .DEX 文献反汇编为 smali 代码——这个特色咱们将在本书后头先容)。
$ apktool d base.apk I: Using Apktool 2.1.0 on base.apk I: Loading resource table... I: Decoding AndroidManifest.xml with resources... I: Loading resource table from file: /Users/sven/Library/apktool/framework/1.apk I: Regular manifest package... I: Decoding file-resources... I: Decoding values */* XMLs... I: Baksmaling classes.dex... I: Copying assets and libs... I: Copying unknown files... I: Copying original files... $ cd base $ ls -alh total 32 drwxr-xr-x 9 sven staff 306B Dec 5 16:29 . drwxr-xr-x 5 sven staff 170B Dec 5 16:29 .. -rw-r--r-- 1 sven staff 10K Dec 5 16:29 AndroidManifest.xml -rw-r--r-- 1 sven staff 401B Dec 5 16:29 apktool.yml drwxr-xr-x 6 sven staff 204B Dec 5 16:29 assets drwxr-xr-x 3 sven staff 102B Dec 5 16:29 lib drwxr-xr-x 4 sven staff 136B Dec 5 16:29 original drwxr-xr-x 131 sven staff 4.3K Dec 5 16:29 res drwxr-xr-x 9 sven staff 306B Dec 5 16:29 smali
解压缩的文献是:
AndroidManifest.xml:解密的 Android Manifest 文献,不错在文本裁剪器中掀开和裁剪该文献。 apktool.yml:包含联系 apktool 输出信息的文献 original:包含 MANIFEST.MF 文献的文献夹,MANIFEST.MF 文献包含联系 JAR 文献中存在的文献的信息 res:包含应用范例资源的目次 smali:包含反汇编的 Dalvik 字节码的目次还不错使用 apktool 将已解密的资源从头打包回二进制 APK/JAR。见本章后头的“探索应用范例包”一节和”Android 上的点窜和逆向工程“一章中“重打包”一节,了解更多信息和实例。
ApkxApkx 是流行的免费 DEX 调度器和 Java 反编译器的 Python 包装器。它自动索要、调度和反编译 apk,装置形状如下:
$ git clone https://github.com/b-mueller/apkx $ cd apkx $ sudo ./install.sh
这会将 apkx 复制到 /usr/local/bin。请参阅“逆向工程和点窜”一章的“反编译Java代码”一节,了解更多联系用法的信息。
Burp SuiteBurp Suite 是一个用于挪动和 web 应用范例安全性测试的集成平台。它的器具不错无缝地协同责任,以守旧整个这个词测试过程,从领先的报复面映射和分析到发现和诈欺安全破绽。Burp Proxy 看成 Burp Suite 的 web 代理管事器,它被定位为浏览器和 web 管事器之间的中间东说念主。Burp Suite 允许您羁系、检验和修改传入和传出的原始 HTTP 流量。
建树 Burp 代理您的流量终点毛糙。咱们假设您有一个 android 开发和责任站诱导到 Wi-Fi 蚁集,该蚁集允许客户端到客户端通讯。
PortSwigger 提供了对于怎么建树Android 开发来使用 Burp 和怎么将 Burp 的 CA 文凭装置到 Android 开发的教程。
DrozerDrozer 是一个 Android 安全评估框架,如果第三方应用范例与其他应用范例的 IPC 端点和底层操作系统进行了交互,你不错搜索应用范例和开发中的安全破绽。
使用 drozer 的上风在于它大约自动践诺多个任务,况兼不错通过模块进行彭胀。这些模块终点有匡助况兼涵盖了不同的类别,其中包括扫描器类别,该类别使你不错使用毛糙的大叫扫描已知的颓势,举例模块 scanner.provider.injection 不错检测系统中装置的整个应用范例的内容提供者中的 SQL 注入 。 如果不使用 drozer,则毛糙的任务(举例列出应用范例的权限)需要几个门径,包括反编译 APK 和手动分析闭幕。
装置 Drozer你不错参考 drozer GitHub 页面(对于 Linux 和 Windows,macOS 请参考这篇博客著作)和 drozer 的网站了解必备条件和装置说明。
drozer 在 Unix、Linux 和 Windows 上的装置说明在 drozer Github 页面中有解释。对于macOS,这篇博客演示了整个的装置说明。
使用 Drozer在最先使用 drozer 之前,还需要在 Android开发上运行 drozer 代理。从 GitHub 发布页面下载最新的 drozer 代理,并用 adb install drozer.apk 装置它。
一朝装置完成,你不错通过运行 adb forward tcp:31415 tcp:31415 和 drozer console connect 启动一个会话到模拟器或 USB 诱导的开发。这被称为径直模式,你不错在用户指南的“最先一个会话”一节中看到圆善的说明。另一种弃取是在基础设施模式下运行Drozer,在这种模式下,你运行一个 Drozer 管事器,它不错处理多个适度台和代理,并在它们之间路由会话。你不错在用户指南的“基础设施模式”一节中找到如安在此模式下建树 drozer 的详细信息。
面前您不错最先分析应用范例了。一个好的滥觞是列举一个应用范例的报复面,不错通过以下大叫很容易地完成:
$ dz> run app.package.attacksurface <package>
相同,如果莫得 drozer,这将需要几个门径。 app.package.attacksurface 模块列出了步履,播送招揽者,内容提供者和导出的管事,因此它们是寰球的况兼不错通过其他应用范例进行访谒。 一朝细则了报复面,就不错通过 drozer 与 IPC 端点进行交互,而无需编写单独的沉寂应用范例,某些任务会需要它,比如与内容提供者通讯。
举例,如果应用范例的导出步履裸露了明锐信息,咱们不错使用 Drozer 模块 app.activity.start 来调用它:
$ dz> run app.activity.start --component <package> <component name>
前边的大叫将启动步履,但愿裸露一些明锐信息。Drozer 有针对每一种 IPC 机制的模块,如果你想尝试带有特意易受报复的应用范例的模块,请下载 InsecureBankv2,该应用范例演示了与 IPC 端点联系的常见问题。请密切留神扫描器类别中的模块,因为它们对于自动检测系统包中的破绽终点有用,特殊是如果你使用的是手机公司提供的 ROM。在以前甚而使用 drozer 识别出过 Google 系统软件包中的 SQL 注入破绽。
其他的 Drozer 大叫这里有一个非详备的大叫列表,你不错用来最先探索 Android:
# List all the installed packages $ dz> run app.package.list # Find the package name of a specific app $ dz> run app.package.list –f (string to be searched) # See basic information $ dz> run app.package.info –a (package name) # Identify the exported application components $ dz> run app.package.attacksurface (package name) # Identify the list of exported Activities $ dz> run app.activity.info -a (package name) # Launch the exported Activities $ dz> run app.activity.start --component (package name) (component name) # Identify the list of exported Broadcast receivers $ dz> run app.broadcast.info -a (package name) # Send a message to a Broadcast receiver $ dz> run app.broadcast.send --action (broadcast receiver name) -- extra (number of arguments) # Detect SQL injections in content providers $ dz> run scanner.provider.injection -a (package name)其他的 Drozer 资源
你可能会发现其他有用信息的资源有:
Official drozer User Guide. drozer GitHub page drozer Wiki FridaFrida 是一个免费和开源的动态代码器具包,它允许你在腹地应用范例中践诺 JavaScript 剧本,在通用测试指南的“点窜与逆向工程”一章中照旧先容了。
Frida 通过 Java API 守旧与 Android Java 运行时的交互。你大约在hook 和调用进程的 Java 和原生函数,以及它的原生库。你的 JavaScript 剧本对内存有完全的访谒权限,举例读取或写入任何结构化数据。
底下是 Frida api 提供的一些任务,在 Android 上是联系的或独家的:
实例化 Java 对象并调用静态和非静态类方法(Java API )。
替换Java方法兑现(Java API )。
通过扫描 Java 堆陈设特定类的步履实例(Java API )。
扫描进程内存中出现的字符串(Memory API )。
羁系原生函数调用以在函数进口和出口运行我方的代码(Interceptor API)。
记着,在Android上,你还不错从装置 Frida 时提供的内置器具中获益,包括 Frida CLI(frida)、frida-ps、frida-ls-devices 和 frida-trace。
Frida 通常被拿来和 Xposed 进行比较,然则这种比较并不公说念,因为这两个框架的想象方针是不同的。看成一个应用范例安全测试东说念主员,了解这少量很紧迫,这么你就不错知说念在什么情况下使用哪个框架:
Frida 是沉寂的,你所需要作念的即是从方针 Android 开发中的已知位置运行 frida-server 二进制文献(请参阅底下的“装置Frida”)。这意味着,与 Xposed 比较,它莫得真切装置在方针 OS 中。
逆向一个应用范例是一个反复的过程。由于上少量的影响,在测试时,你得回了更短的反馈轮回,因不需要(软)重启来应用钩子或毛糙地更新钩子。同期在兑现更持久的钩子时,你可能更心爱使用 Xposed。
你不错在进程运行时代的任何时候动态注入和更新 Frida JavaScript 代码(访佛于 iOS 上的 Cycript)。这么,不错通过让 Frida 来 spwan 你的应用范例践诺所谓的早期检测,或者你可能更心爱附加到一个参加特定现象的正在运行的应用范例。
Frida 大约处理 Java 以及原生代码(JNI),允许你修改它们。苦难的是,这恰是 Xposed 的局限性,坚苦原生代码守旧。
值得留神的是,到 2019 岁首,Xposed 还不成在 Android 9(API 品级28)上运行。
装置 Frida要在腹地装置 Frida,只需运行:
$ pip install frida-tools
参考装置页面了解更多细节。
下一步即是在你的 Android 开发上建树 Frida:
如果您的开发莫得 root,你也不错使用Frida,请参考“逆向工程和点窜”章节的“非 root 开发的动态分析”。 如果你有一个已 root 的开发,只需死守官方说明或底下的教唆。除非另有说明,咱们假设在这里是 root 开发。从 Frida 发布页下载 frida-serve 二进制文献。确保为你的 Android 开发或模拟器的架构下载了正确的 frida-server 二进制文献:x86,x86_64,arm 或 arm64。确保管事器版块(至少是主版块号)与腹地 Frida 装置版块匹配。PyPI浅薄装置最新版块的 Frida。如果不细则装置的版块,不错使用 Frida 大叫行器具检验:
$ frida --version
或者你不错运行以下大叫来自动检测 Frida 版块并下载正确的 frida-server 二进制文献:
$ wget https://github.com/frida/frida/releases/download/$(frida --version)/frida-server-$(frida --version)-android-arm.xz
复制 frida-server 到开发上并运行它:
$ adb push frida-server /data/local/tmp/ $ adb shell "chmod 755 /data/local/tmp/frida-server" $ adb shell "su -c /data/local/tmp/frida-server &"在 Android 上使用 Frida
跟着 frida-server 的运行,你面前应该不错使用以下大叫得回正在运行的进程的列表(用 -U 选项指示 Frida 使用一个已诱导的 USB 开发或模拟器):
$ frida-ps -U PID Name ----- -------------------------------------------------------------- 276 adbd 956 android.process.media 198 bridgemgrd 30692 com.android.chrome 30774 com.android.chrome:privileged_process0 30747 com.android.chrome:sandboxed 30834 com.android.chrome:sandboxed 3059 com.android.nfc 1526 com.android.phone 17104 com.android.settings 1302 com.android.systemui (...)
或使用 -Uai 参数组合限定列表,以获取诱导的 USB 开发(-U)上刻下装置的(-i)整个应用范例(-a):
$ frida-ps -Uai PID Name Identifier ----- ---------------------------------------- ------------------------------ 766 Android System android 30692 Chrome com.android.chrome 3520 Contacts Storage com.android.providers.contacts - Uncrackable1 sg.vantagepoint.uncrackable1 - drozer Agent com.mwr.dz
这将骄慢整个应用范例的称呼和标志符,如果面前正在运行,还将骄慢它们的 PID。在列表中搜索你的应用范例,并留神 PID 或其称呼/标志符,从面前起你将使用其中一个来援用你的应用范例。建议使用这些应用的标志符,因为在每次运行应用范例时 PID 都会改变。举例,以 com.android.chrome 为例,你面前不错在整个 Frida 器具上使用此字符串,如在 Frida CLI,frida-trace 或 Python 剧本上。
使用 frida-trace 追踪原生库要追踪特定的(底层)库调用,你不错使用 frida-trace 大叫行器具:
$ frida-trace -U com.android.chrome -i "open"
这会在 __handlers __ / libc.so/open.js 中生成一些 JavaScript 代码,Frida 将其注入到进程中。该剧本将追踪对 libc.so 中的 open 函数的整个调用。你不错使用 Frida JavaScript API 根据需要修改生成的剧本。
苦难的是,尚不守旧追踪 Java 类的高档方法(但将来可能会)。
Frida CLI 和 Java API使用 Frida CLI 器具(Frida)与 Frida 交互责任。它挂接到一个进程,并为你提供 Frida API 的大叫行界面。
$ frida -U com.android.chrome
通过 -l 选项,你不错使用 Frida CLI 加载剧本,举例,加载 myscript.js:
$ frida -U -l myscript.js com.android.chrome
Frida 还提供了一个 Java API,这对处理 Android 应用范例特殊有匡助,它允许你径直使用 Java 类和对象。底下是一个剧本,用于重写 Activity 类的 onResume 函数:
Java.perform(function () { var Activity = Java.use("android.app.Activity"); Activity.onResume.implementation = function () { console.log("[*] onResume() got called!"); this.onResume(); }; });
上头的剧本调用 Java.perform 以确保您的代码在 Java VM 的环境中践诺。它通过 Java.use 实例化一个 android.app.Activity 类的包装器,并重写 onResume 函数。新的 onResume 函数兑现打印见知到适度台,并在步履每次处于复原现象时通过调用 this.onResume 来调用原本的 onResume 方法。
Frida 还允许你搜索并使用堆上的实例化对象。以下剧本搜索 android.view.View 对象的实例,并调用其 toString 方法,闭幕打印到适度台:
setImmediate(function() { console.log("[*] Starting script"); Java.perform(function () { Java.choose("android.view.View", { "onMatch":function(instance){ console.log("[*] Instance found: " + instance.toString()); }, "onComplete":function() { console.log("[*] Finished heap search") } }); }); });
输出会像这么:
[*] Starting script [*] Instance found: android.view.View{7ccea78 G.ED..... ......ID 0,0-0,0 #7f0c01fc app:id/action_bar_black_background} [*] Instance found: android.view.View{2809551 V.ED..... ........ 0,1731-0,1731 #7f0c01ff app:id/menu_anchor_stub} [*] Instance found: android.view.View{be471b6 G.ED..... ......I. 0,0-0,0 #7f0c01f5 app:id/location_bar_verbose_status_separator} [*] Instance found: android.view.View{3ae0eb7 V.ED..... ........ 0,0-1080,63 #102002f android:id/statusBarBackground} [*] Finished heap search
你还不错使用 Java 的反射功能。要列出 android.view.View 类的寰球方法,你不错在 Frida 中为此类创建一个包装器,并从该包装器的 class 属性调用 getMethods:
Java.perform(function () { var view = Java.use("android.view.View"); var methods = view.class.getMethods(); for(var i = 0; i < methods.length; i++) { console.log(methods[i].toString()); } });
这将在末端打印很长的方法列表:
public boolean android.view.View.canResolveLayoutDirection() public boolean android.view.View.canResolveTextAlignment() public boolean android.view.View.canResolveTextDirection() public boolean android.view.View.canScrollHorizontally(int) public boolean android.view.View.canScrollVertically(int) public final void android.view.View.cancelDragAndDrop() public void android.view.View.cancelLongPress() public final void android.view.View.cancelPendingInputEvents() ...Frida Binding
为了彭胀剧本编写体验,Frida 提供了与Python,C,NodeJS 和 Swift 等编程言语的绑定。
以 Python 为例,首先要留神的是不需要更多的装置门径。使用 import frida 启动 Python 剧本,就不错最先了。请参阅底下的剧本,该剧本仅运行先前的 JavaScript 代码段:
# frida_python.py import frida session = frida.get_usb_device().attach('com.android.chrome') source = """ Java.perform(function () { var view = Java.use("android.view.View"); var methods = view.class.getMethods(); for(var i = 0; i < methods.length; i++) { console.log(methods[i].toString()); } }); """ script = session.create_script(source) script.load() session.detach()
在这种情况下,运行 Python 剧本(python3 frida_python.py)与上一个示例具有疏浚的闭幕:它会打印 android.view.View 类的整个方法到末端。然则,你可能但愿使用 Python 中的数据。使用 send 代替 console.log 会将数据以 JSON 格式从 JavaScript 发送到 Python 上。请阅读以下示例中的扫视:
# python3 frida_python_send.py import frida session = frida.get_usb_device().attach('com.android.chrome') # 1. we want to store method names inside a list android_view_methods = [] source = """ Java.perform(function () { var view = Java.use("android.view.View"); var methods = view.class.getMethods(); for(var i = 0; i < methods.length; i++) { send(methods[i].toString()); } }); """ script = session.create_script(source) # 2. this is a callback function, only method names containing "Text" will be appended to the list def on_message(message, data): if "Text" in message['payload']: android_view_methods.append(message['payload']) # 3. we tell the script to run our callback each time a message is received script.on('message', on_message) script.load() # 4. we do something with the collected data, in this case we just print it for method in android_view_methods: print(method) session.detach()
这有用地过滤了方法,只打印包含字符串“Text”的方法:
$ python3 frida_python_send.py public boolean android.view.View.canResolveTextAlignment() public boolean android.view.View.canResolveTextDirection() public void android.view.View.setTextAlignment(int) public void android.view.View.setTextDirection(int) public void android.view.View.setTooltipText(java.lang.CharSequence) ...
临了,由你决定在什么地点处理数据,或然候,用 JavaScript 来作念会比较绵薄,而在其他情况下,Python 将是最好的弃取。天然,你也不错使用 script.post 将音书从 Python 发送到 JavaScript 上。联系发送和招揽音书的更多信息,请参考 Frida 文档。
HouseHouse 是一个用于 Android 应用运行时的挪动应用分析器具包,由 NCC 小组开发和抠门,用 Python 编写。
它诈欺 root 开发上运行的 Frida server 或重打包到 Android 应用范例中的 Frida gadget。House 的看法是通过绵薄的 web GUI 提供一种毛糙的方法来原型化 Frida 剧本。
House 的装置说明和操作指南不错在 Readme of the Github repo 中找到。
MagiskMagisk(“Magic Mask”)是一种 root 你的 Android 开发的方法,它的特殊性在于对系统进行修改的形状。当其他的 root 器具改变系统分区上的现实数据时,Magisk 不会(它被称为“systemless“)。这么就不错荫藏对 root 明锐的应用范例(举例银行或游戏)的修改,况兼在 root 的情况下允许使用官方的 Android OTA 升级
你不错通过阅读 GitHub 上的官方文档来熟悉 Magisk。如果您莫得装置 Magisk,不错在文档中找到装置说明。如果你使用认的确 Android 版块并有谋划升级,Magisk 在 GitHub 上提供了一个教程。
MobSFMobSF 是一个自动化的、一体化的挪动应用范例审计框架,它也守旧 Android APK 文献。启动 MobSF 最毛糙的方法是通过 Docker。
$ docker pull opensecurity/mobile-security-framework-mobsf $ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
或通过运行以下大叫在主机上腹地装置并启动它:
# Setup git clone https://github.com/MobSF/Mobile-Security-Framework-MobSF.git cd Mobile-Security-Framework-MobSF ./setup.sh # For Linux and Mac setup.bat # For Windows # Installation process ./run.sh # For Linux and Mac run.bat # For Windows
一朝你启动并运行了 MobSF,你就不错通过在浏览器中掀开 :80。只消将你想要分析的APK拖放到上传区域,MobSF就会最先责任。
在 MobSF 完成了它的分析之后,你将收到一页对于整个被践诺的测试的玄虚。页面被分割成多个部分,提供了一些对于应用范例报复名义的初步教唆。
骄慢如下内容:
对于应用范例过火二进制文献的基本信息。
一些选项:检讨 AndroidManifest.xml 文献。检讨应用范例的 IPC 组件。
签名者文凭。
应用范例的权限。 骄慢已知颓势的安全分析,举例是否启用了应用范例备份。 应用范例二进制文献使用的库列表和已解压缩的APK中整个文献的列表。 坏心软件分析,检验坏心网址。更多细节请参考 MobSF 文档。
ObjectionObjection 是一个“由 Frida 提供的运行时挪动探索器具包”,它的主要方针是允许通过直不雅的界面在未 root 开发上进行安全性测试。
通过为你提供通过将 Frida gadget 注入应用范例从头打包的器具,Objection 兑现了这一方针。通过这种形状,你不错将从头打包的应用范例配置到未 root 开发上让不会与应用范例交互,如前一节所述。
然则,Objection 还提供了一个 REPL,允许你与应用范例交互,使你大约践诺应用范例不错践诺的任何操作。在技俩的主页上不错找到圆善的 Objection 功能列表,这里有一些道理的:
从头打包应用范例来包含 Frida gadget 为常用方法禁用 SSL pinning 访谒应用范例存储以下载或上载文献 践诺自界说 Frida 剧本 列出步履、管事和播送招揽器 最先步履在未 root 开发上践诺高档动态分析的才略是使 Objection 终点有用的特色之一。一个应用范例可能包含高档 RASP 适度,不错检测你的 root 方法,注入 frida-gadget 可能是绕过这些适度的最毛糙的方法。此外,包含的 Frida 剧本使快速分析应用范例或绕过基本的安全适度变得终点容易。
临了,如果你确乎不错访谒一个 root 开发,Objection 不错径直诱导到运行中的 Frida server 来提供整个功能,而不需要从头打包应用范例。
装置 Objection正如 Objection's Wiki 中态状的那样,不错通过 pip 径直装置。
$ pip3 install objection
如果你的开发照旧逃狱了,你面前就不错和开发上运行的任何应用范例进行交互了,你不错跳到底下的“使用 Objection”部分。
然则,如果但愿在未 root 开发上进行测试,首先需要在应用范例中包含 Frida gadget。 Objection Wiki 详细态状了需要的门径,然则在作念了正确的准备之后,你将大约通过调用 Objection 大叫来给 APK 打补丁:
$ objection patchapk --source app-release.apk
然后,需要使用 adb 装置修悛改的应用范例,正如“基本测试操作——装置应用范例”中解释的那样。
使用 Objection最先使用 Objection 依赖于你是否给 APK 打了补丁,或是你是否使用运行了 Frida-server 的 root 开发。运行一个打过补丁的 APK,Objection 将自动找到附加的开发和搜索一个正在监听的 Frida gadget。然则,在使用 frida-server 时,你需要显式地告诉 frida-server 要分析哪个应用范例。
# Connecting to a patched APK objection explore # Find the correct name using frida-ps $ frida-ps -Ua | grep -i telegram 30268 Telegram org.telegram.messenger # Connecting to the Telegram app through Frida-server $ objection --gadget="org.telegram.messenger" explore
一朝参加了 Objection REPL,你就不错践诺任何可用的大叫,以下是一些最有用的方法的玄虚:
# Show the different storage locations belonging to the app $ env # Disable popular ssl pinning methods $ android sslpinning disable # List items in the keystore $ android keystore list # Try to circumvent root detection $ android root disable
更多对于使用 Objection REPL 的信息不错在 Objection Wiki 上找到。
radare2radare2(r2)是一个流行的开源逆向工程框架,用于反汇编、调试、打补丁和分析二进制文献,该框架可编写剧本,守旧多种架构和文献格式,包括 Android 和 iOS 应用范例。对 Android 守旧 Dalvik DEX(odex, multidex),ELF(可践诺文献,.so, ART)和 Java(JNI 和 Java 类)。它还包含了几个有用的剧本,不错在挪动应用范例分析时代匡助您,它提供了底层的反汇编和安全的静态分析,在传统器具失败时终点有用。
radare2 兑现了一个丰富的大叫行界面(CLI),你不错在上头践诺上述任务。然则,如果你不是很习尚使用 CLI 进行逆向工程,你不错谈判使用 Web UI(通过 -H 参数)或者更绵薄的 Qt 和 C++ GUI 版块 Cutter。请记着对于 CLI,更具体地说是它的可视化模式和剧本功能(r2pipe),是 radare2 遍及功能的中枢,实足值得学习怎么使用它。
装置 radare2请参考 radare2 的官方装置说明。咱们热烈建议恒久从 GitHub 版块装置 radare2,而不是通过 APT 等常见的包照管器。Radare2正处于终点活跃的开发阶段,这意味着第三方存储库通常会过期。
使用 radare2radare2 框架包含一组袖珍实用范例,不错在 r2 shell 中使用,也不错看成沉寂的 CLI 器具使用。这些器具包括 rabin2,rasm2,rahash2,radiff2,rafind2,ragg2,rarun2,rax2,天然还有 r2,这是主要的一个。
举例,你不错使用 rafind2 径直从一个加密的Android 清单文献(AndroidManifest.xml)中读取字符串:
# Permissions $ rafind2 -ZS permission AndroidManifest.xml # Activities $ rafind2 -ZS activity AndroidManifest.xml # Content providers $ rafind2 -ZS provider AndroidManifest.xml # Services $ rafind2 -ZS service AndroidManifest.xml # Receivers $ rafind2 -ZS receiver AndroidManifest.xml
或者使用 rabin2 来得回对于二进制文献的信息:
$ rabin2 -I UnCrackable-Level1/classes.dex arch dalvik baddr 0x0 binsz 5528 bintype class bits 32 canary false retguard false class 035 crypto false endian little havecode true laddr 0x0 lang dalvik linenum false lsyms false machine Dalvik VM maxopsz 16 minopsz 1 nx false os linux pcalign 0 pic false relocs false sanitiz false static true stripped false subsys java va true sha1 12-5508c b7fafe72cb521450c4470043caa332da61d1bec7 adler32 12-5528c 00000000
输入 rabin2 -h 检讨整个的选项:
$ rabin2 -h Usage: rabin2 [-AcdeEghHiIjlLMqrRsSUvVxzZ] [-@ at] [-a arch] [-b bits] [-B addr] [-C F:C:D] [-f str] [-m addr] [-n str] [-N m:M] [-P[-P] pdb] [-o str] [-O str] [-k query] [-D lang symname] file -@ [addr] show section, symbol or import at addr -A list sub-binaries and their arch-bits pairs -a [arch] set arch (x86, arm, .. or <arch>_<bits>) -b [bits] set bits (32, 64 ...) -B [addr] override base address (pie bins) -c list classes -cc list classes in header format -H header fields -i imports (symbols imported from libraries) -I binary info -j output in json ...
使用 r2 实用范例访谒 r2 shell,你不错像加载任何其他二进制一样加载 DEX 二进制文献:
$ r2 classes.dex
输入 r2 -h 以检讨整个可用选项。一个非经常用的参数是 -A,它在加载方针二进制文献后触发分析。然则,应该对小的二进制文献严慎使用,因为它终点耗尽时分和资源。你不错在“Android上的点窜和逆向工程”一章中了解更多。
一朝参加了 r2 shell,你还不错访谒其他 radare2 实用范例提供的函数。举例,运行 i 将打印二进制文献的信息,就像 rabin2 -I 所作念的那样。
要打印整个字符串,在 r2 shell 中使用 rabin2 -Z 或大叫 iz(或更毛糙的 izq)。
[0x000009c8]> izq 0xc50 39 39 /dev/com.koushikdutta.superuser.daemon/ 0xc79 25 25 /system/app/Superuser.apk ... 0xd23 44 44 5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc= 0xd51 32 32 8d127684cbc37c17616d806cf50473cc 0xd76 6 6 <init> 0xd83 10 10 AES error: 0xd8f 20 20 AES/ECB/PKCS7Padding 0xda5 18 18 App is debuggable! 0xdc0 9 9 CodeCheck 0x11ac 7 7 Nope... 0x11bf 14 14 Root detected!
在大多数情况下,你不错在大叫中附加特殊选项,举例 q 不错使大叫不太冗长,或者 j 不错用 JSON 格式提供输出(使用 〜{} 暗意JSON字符串)。
[0x000009c8]> izj~{} [ { "vaddr": 3152, "paddr": 3152, "ordinal": 1, "size": 39, "length": 39, "section": "file", "type": "ascii", "string": "L2Rldi9jb20ua291c2hpa2R1dHRhLnN1cGVydXNlci5kYWVtb24v" }, { "vaddr": 3193, "paddr": 3193, "ordinal": 2, "size": 25, "length": 25, "section": "file", "type": "ascii", "string": "L3N5c3RlbS9hcHAvU3VwZXJ1c2VyLmFwaw==" },
你不错使用 r2 大叫 ic 打印类名过火方法。(类信息)
[0x000009c8]> ic ... 0x0000073c [0x00000958 - 0x00000abc] 356 class 5 Lsg/vantagepoint/uncrackable1/MainActivity :: Landroid/app/Activity; 0x00000958 method 0 pC Lsg/vantagepoint/uncrackable1/MainActivity.method.<init>()V 0x00000970 method 1 P Lsg/vantagepoint/uncrackable1/MainActivity.method.a(Ljava/lang/String;)V 0x000009c8 method 2 r Lsg/vantagepoint/uncrackable1/MainActivity.method.onCreate (Landroid/os/Bundle;)V 0x00000a38 method 3 p Lsg/vantagepoint/uncrackable1/MainActivity.method.verify (Landroid/view/View;)V 0x0000075c [0x00000acc - 0x00000bb2] 230 class 6 Lsg/vantagepoint/uncrackable1/a :: Ljava/lang/Object; 0x00000acc method 0 sp Lsg/vantagepoint/uncrackable1/a.method.a(Ljava/lang/String;)Z 0x00000b5c method 1 sp Lsg/vantagepoint/uncrackable1/a.method.b(Ljava/lang/String;)[B
你不错使用 r2 大叫 ii 打印导入的方法。(导入信息)
[0x000009c8]> ii [Imports] Num Vaddr Bind Type Name ... 29 0x000005cc NONE FUNC Ljava/lang/StringBuilder.method.append(Ljava/lang/String;) Ljava/lang/StringBuilder; 30 0x000005d4 NONE FUNC Ljava/lang/StringBuilder.method.toString()Ljava/lang/String; 31 0x000005dc NONE FUNC Ljava/lang/System.method.exit(I)V 32 0x000005e4 NONE FUNC Ljava/lang/System.method.getenv(Ljava/lang/String;)Ljava/lang/String; 33 0x000005ec NONE FUNC Ljavax/crypto/Cipher.method.doFinal([B)[B 34 0x000005f4 NONE FUNC Ljavax/crypto/Cipher.method.getInstance(Ljava/lang/String;) Ljavax/crypto/Cipher; 35 0x000005fc NONE FUNC Ljavax/crypto/Cipher.method.init(ILjava/security/Key;)V 36 0x00000604 NONE FUNC Ljavax/crypto/spec/SecretKeySpec.method.<init>([BLjava/lang/String;)V
检验二进制文献时,一种常见的方法是搜索、导航到它并使之可视化,以便解释代码。使用 radare2 查找内容的方法之一是使用特定大叫过滤输出,即使用 ~ 加上重要字(~+ 暗意大小写不解锐)对它们进行 grep。举例,咱们可能知说念应用范例正在考据一些东西,咱们不错检验 radare2 整个的 flag,望望咱们在那处找到与“考据”联系的东西。
当加载一个文献时,radare2 会标记它大约找到的整个东西,这些标记的称呼或援用称为 flag,你不错通过大叫 f 来访谒它们。
在这个案例中,咱们使用重要字”verify“来 grep flag。
[0x000009c8]> f~+verify 0x00000a38 132 sym.Lsg_vantagepoint_uncrackable1_MainActivity.method. \ verify_Landroid_view_View__V 0x00000a38 132 method.public.Lsg_vantagepoint_uncrackable1_MainActivity. \ Lsg_vantagepoint_uncrackable1 _MainActivity.method.verify_Landroid_view_View__V 0x00001400 6 str.verify
看起来咱们在 0x00000a38 处找到了一个方法(标记了两次),在 0x00001400 处找到了一个字符串。让咱们通过使用它的标志来导航(寻找)到阿谁方法:
[0x000009c8]> s sym.Lsg_vantagepoint_uncrackable1_MainActivity.method. \ verify_Landroid_view_View__V
天然,您还不错使用 r2 的反汇编功能,并用 pd 大叫(或者 pdf,如果你知说念你照旧位于一个函数中)打印反汇编闭幕。
[0x00000a38]> pd
r2 大叫浅薄招揽选项(见 pd?),举例,你不错通过在大叫 pd N 后头附加数字(“N”)来限定骄慢的操作码。
你可能但愿通过输入 V 参加所谓的可视模式,而不是只是将反汇编输出到适度台。
默许情况下,你将看到十六进制视图。通过键入 p,你不错切换到不同的视图,如反汇编视图:
Radare2 提供了一种图形模式,它对于追踪代码流终点有用,你不错在可视模式下输入V:
这只是一些 radare2 大叫的一部分,用来最先从 Android 二进制文献中获取一些基本信息。Radare2 终点遍及,在 Radare2 大叫文档中不错找到许多大叫。Radare2 将在整个这个词指南顶用于不同的看法,如逆向代码、调试或践诺二进制分析。咱们还将结合使用其他框架,特殊是Frida(更多信息,请参阅 r2frida 一节)。
联系 radare2 在Android上的详细使用,特殊是在分析原生库时,请参考“Android 上的点窜和逆向工程”一章。你可能还想读一下 radare2 的官方册本。
r2fridar2frida 是一个允许 radare2 诱导 Frida 的技俩,有用地将 radare2 遍及的逆向工程才略与 Frida 的动态分析器具包结合在全部。R2frida 允许你:
通过 USB 或 TCP 将 radare2 附加到任何腹地进程或辛劳 frida-server。 从方针进程读/写内存。 将映射、象征、导入、类和方法等Frida信息加载到 radare2 中。 从 Frida 调用 r2 大叫,因为它将 r2pipe 接口公开到了 Frida Javascript API 中。 装置 r2frida请参考 r2frida 的官方装置说明。
使用 r2frida跟着 frida-server 运行,你面前应该大约使用pid、spawn path、主机和端口或开发 id 诱导到它。举例,附加到 PID 1234:
$ r2 frida://1234
联系怎么诱导 frida-server 的更多示例,请参阅 r2frida 的 README 页面中的使用部分。
诱导之后,你应该会看到带有开发id的r2教唆符。r2frida 大叫必须以 \ 或 =!最先。举例,你不错使用大叫 \i 检索方针信息:
[0x00000000]> \i arch x86 bits 64 os linux pid 2218 uid 1000 objc false runtime V8 java false cylang false pageSize 4096 pointerSize 8 codeSigningPolicy optional isDebuggerAttached false
要在内存中搜索特定重要字,你不错使用搜索大叫 \/:
[0x00000000]> \/ unacceptable Searching 12 bytes: 75 6e 61 63 63 65 70 74 61 62 6c 65 Searching 12 bytes in [0x0000561f05ebf000-0x0000561f05eca000] ... Searching 12 bytes in [0xffffffffff600000-0xffffffffff601000] hits: 23 0x561f072d89ee hit12_0 unacceptable policyunsupported md algorithmvar bad valuec 0x561f0732a91a hit12_1 unacceptableSearching 12 bytes: 75 6e 61 63 63 65 70 74 61
要以 JSON 格式输出搜索闭幕,只需在前边的搜索大叫中添加 j(就像在 r2 shell 中所作念的那样)。这不错在大多数大叫中使用:
[0x00000000]> \/j unacceptable Searching 12 bytes: 75 6e 61 63 63 65 70 74 61 62 6c 65 Searching 12 bytes in [0x0000561f05ebf000-0x0000561f05eca000] ... Searching 12 bytes in [0xffffffffff600000-0xffffffffff601000] hits: 23 {"address":"0x561f072c4223","size":12,"flag":"hit14_1","content":"unacceptable \ policyunsupported md algorithmvar bad valuec0"},{"address":"0x561f072c4275", \ "size":12,"flag":"hit14_2","content":"unacceptableSearching 12 bytes: 75 6e 61 \ 63 63 65 70 74 61"},{"address":"0x561f072c42c8","size":12,"flag":"hit14_3", \ "content":"unacceptableSearching 12 bytes: 75 6e 61 63 63 65 70 74 61 "}, ...
要列出已加载的库,请使用大叫 \il 并使用 radare2 的里面 grep 大叫 〜 过滤闭幕。 举例,以下大叫将列出与重要字 keystore,ssl 和 crypto 匹配的已加载库:
[0x00000000]> \il~keystore,ssl,crypto 0x00007f3357b8e000 libssl.so.1.1 0x00007f3357716000 libcrypto.so.1.1
访佛地,通过特定的重要字列出导出表并过滤闭幕:
[0x00000000]> \iE libssl.so.1.1~CIPHER 0x7f3357bb7ef0 f SSL_CIPHER_get_bits 0x7f3357bb8260 f SSL_CIPHER_find 0x7f3357bb82c0 f SSL_CIPHER_get_digest_nid 0x7f3357bb8380 f SSL_CIPHER_is_aead 0x7f3357bb8270 f SSL_CIPHER_get_cipher_nid 0x7f3357bb7ed0 f SSL_CIPHER_get_name 0x7f3357bb8340 f SSL_CIPHER_get_auth_nid 0x7f3357bb7930 f SSL_CIPHER_description 0x7f3357bb8300 f SSL_CIPHER_get_kx_nid 0x7f3357bb7ea0 f SSL_CIPHER_get_version 0x7f3357bb7f10 f SSL_CIPHER_get_id
使用大叫 db 列出或建树断点。这在分析/修改内存时是有用的:
[0x00000000]> \db
临了请记着,您也不错使用 \ 运行 Frida JavaScript 代码,加上剧真称呼即可:
[0x00000000]> \. agent.js
你不错在他们的 Wiki 技俩中找到更多对于怎么使用 r2frida 的示例。
基本测试操作访谒开发 Shell在测试应用范例时,最常见的事情之一即是访谒开发 shell。在这一节中,咱们将看到如安在有或莫得 USB 线情况下从你的主机上辛劳访谒 Android Shell,以及在腹地开发访谒。
辛劳 Shell为了从你的主机诱导到 Android 开发的 shell,adb 浅薄是你弃取的器具(除非你心爱使用辛劳 SSH 访谒,举例通过 Termux)。
对于本节,咱们假设你照旧正确地启用了开发者模式和 USB 调试,正如“在真实开发上进行测试”中所解释的那样。一朝你通过 USB 诱导了 Android 开发,你不错通过运行以下大叫访谒辛劳开发的 shell:
$ adb shell
按 Control + D 或输入 exit 退出
如果你的开发是 root 的或你正在使用模拟器,一朝你处在辛劳 shell 中,你不错通过运行 su 得回 root 访谒权限:
$ adb shell bullhead:/ $ su bullhead:/ # id uid=0(root) gid=0(root) groups=0(root) context=u:r:su:s0
只消当你使用模拟器时,才不错使用大叫 adb root 从头启动 adb,这么下次参加 adb shell 时,你就照旧领有 root 权限了。这也允许在责任站和 Android 文献系统之间双向传输数据,甚而不错访谒只消 root 用户不错访谒的位置(通过 adb push/pull)。联统共据传输的更多信息,请参阅底下“主机-开发数据传输”一节。
诱导多个开发如果你有不啻一个开发,记着在你的整个 adb 大叫上包括 -s 参数,后跟开发序列号(举例 adb -s emulator-5554 shell 或 adb -s 00b604081540b7c6 shell)。你不错使用以下大叫得到整个诱导的开发的列表和他们的序列号:
$ adb devices List of devices attached 00c907098530a82c device emulator-5554 device通过 Wi-Fi 诱导一个开发
你也不错不使用 USB 线访谒你的 Android 开发。为此,你必须将你的主机和安卓开发诱导到团结个 Wi-Fi 蚁集,然后按照底下的门径进行:
用 USB 线将开发诱导到主机,并建树方针开发在端口5555上监听 TCP/IP 诱导:adb tcpip 5555。
断开与方针开发的USB诱导线,运行 adb connect <device_ip_address>。运行 adb devices 检验该开发面前是否可用。
用 adb shell 掀开 shell。
然则请留神,这么作念会让你的开发对处于团结蚁集并知说念你的开发 IP 地址的任何东说念主敞开。你可能更心爱使用 USB 诱导。
举例,在一个 Nexus 开发上,你不错在设Settings -> System -> About phone -> Status -> IP address 找到 IP 地址,或者参加 Wi-Fi 菜单,在你诱导的蚁集上点击一下。
在 Android 开发者文档中不错看到圆善的说明和留神事项。
通过 SSH 诱导开发如果股东,还不错启用 SSH 访谒。一个绵薄的选项是使用 Termux,你不错随便地配置它来提供 SSH 访谒(使用密码或公钥身份考据),并使用大叫 sshd 启动它(默许在端口8022上启动)。为了通过 SSH 诱导到 Termux,只需运行大叫 ssh -p 8022 <ip_address>(其中 ip_address 是现实的辛劳开发IP)。这个选项还有一些额外的自制,它允许在端口8022上通过 SFTP 访谒文献系统。
开发上的 Shell 应用与辛劳 shell 比较,浅薄使用开发上的 shell(末端模拟器))可能终点单调乏味,但对于调试,举例蚁集问题或检验某些配置来说,它很绵薄。
Termux 是一个用于 Android 的末端模拟器,它提供了一个 Linux 环境,不错径直使用或不使用 root,况兼不需要建树。装置额外的包是一项琐碎的任务,然则它有我方的 APT 包照管器(与其他末端模拟器应用范例比较的不同之处)。你不错使用大叫 pkg search <pkg_name> 来搜索特定的包,并使用 pkg install <pkg_name> 来装置包。你不错径直从 Google Play 装置 Termux。
主机开发数据传输使用 adb你不错使用 adb pull <remote> <local> 和 adb push <local> <remote> 大叫将文献复制到开发或从开发中复制。它们的用法终点毛糙,举例,底下的操作将把 foo.txt 从刻下目次(腹地)复制到 sdcard 文献夹(辛劳):
$ adb push foo.txt /sdcard/foo.txt
这种方法浅薄在你知说念你想要复制什么和复制到那处从那处复制时使用,也守旧批量文献传输,举例你不错从 Android 开发复制整个这个词目次到你的责任站。
$ adb pull /sdcard /sdcard/: 1190 files pulled. 14.1 MB/s (304526427 bytes in 20.566s)使用 Android Studio 开发文献浏览器
Android Studio 有一个内置的开发文献资源照管器,你不错通过 View -> Tool Windows -> Device File Explorer 掀开它。
如果你使用的是一个 root 开发,那么面前不错最先浏览整个这个词文献系统了。关联词,当使用未 root 开发访谒应用范例沙箱时,除非应用范例是可调试的,不然不会责任,即使那样,你也会被“扣留”在应用范例沙箱中。
使用 objection当你在一个特定的应用范例上责任况兼想要复制你可能在它的沙箱中遭遇的文献时,这个选项终点有用(留神你只可访谒方针应用范例大约访谒的文献)。这种方法不需要将应用建树为可调试的,在使用 Android Studio 的开发文献浏览器时需要这么作念。
首先,如“保举器具-Objection”中所述,以 Objection 的形状诱导到应用范例。然后,像往常一样在末端上使用 ls 和 cd 浏览可用文献:
$ frida-ps -U | grep -i owasp 21228 sg.vp.owasp_mobile.omtg_android $ objection -g sg.vp.owasp_mobile.omtg_android explore ...g.vp.owasp_mobile.omtg_android on (google: 8.1.0) [usb] # cd .. /data/user/0/sg.vp.owasp_mobile.omtg_android ...g.vp.owasp_mobile.omtg_android on (google: 8.1.0) [usb] # ls Type ... Name --------- ... ------------------- Directory ... cache Directory ... code_cache Directory ... lib Directory ... shared_prefs Directory ... files Directory ... app_ACRA-approved Directory ... app_ACRA-unapproved Directory ... databases Readable: True Writable: True
一朝你有一个文献你想下载,你不错运行 file download <some_file>。这将下载该文献到你的责任目次,相同的形状,你不错使用 file upload 上传文献。
...[usb] # ls Type ... Name ------ ... ----------------------------------------------- File ... sg.vp.owasp_mobile.omtg_android_preferences.xml Readable: True Writable: True ...[usb] # file download sg.vp.owasp_mobile.omtg_android_preferences.xml Downloading ... Streaming file from device... Writing bytes to destination... Successfully downloaded ... to sg.vp.owasp_mobile.omtg_android_preferences.xml
舛误是,在撰写本文时,objection 还不守旧批量文献传输,因此你只可复制单个文献。不外,在某些情况下,如果你照旧在使用 objection 探索应用范例,并找到了一些道理的文献,这少量如故很有用的。不需要记下文献的圆善旅途并使用 adb pull <path_to_some_file>,你不错径直 file download <some_file> 下载文献。
使用 Termux如果你有一个 root 开发,况兼装置了 Termux 以及在其上正确配置了 SSH 访谒权限,那么在端口8022上应该照旧运行了一个 SFTP(SSH 文献传输合同)管事器,你可从末端访谒它:
$ sftp -P 8022 root@localhost ... sftp> cd /data/data sftp> ls -1 ... sg.vantagepoint.helloworldjni sg.vantagepoint.uncrackable1 sg.vp.owasp_mobile.omtg_android
或者毛糙地通过使用守旧 SFTP 的客户端(如FileZilla):
检讨 Termux Wiki 以了解更多联系辛劳文献访谒方法的信息。
获取息争压应用范例从开发中索要APK文献有几种方法。根据应用范例是寰球的如故专有的,你需要决定哪种方法是最毛糙的。
获取息争压应用范例从开发中索要 APK 文献有几种方法。你需要根据应用范例是寰球的如故专有的,决定哪种方法是最毛糙的。
其他应用范例商店最毛糙的弃取之一是从 Google Play Store 的寰球应用范例镜像的网站下载 APK。然则,请记着,这些站点不是官方站点,况兼不成保证该应用范例莫得从头打包或包含坏心范例。一些著名网站托管 APK,并以不修改应用范例而著明,甚而列出了应用范例的 SHA-1 和 SHA-256 校验和:
APKMirror APKPure留神,你不成适度这些网站,你不成保证他们在畴昔作念什么,在莫得其他弃取时再使用它们。
使用 gplaycligplaycli 是一个基于 Python 的 CLI 器具,用于从 Google Play Store 搜索、装置和更新 Android 应用范例。按照装置门径操作就不错运行它了,gplaycli提供了几个选项,请参考其匡助(-h)以得回更多信息。
如果你不细则一个应用范例的包名(或 AppID),你不错践诺一个重要字搜索 APK (-s):
$ gplaycli -s "google keep" Title Creator Size Last Update AppID Version Google Keep - notes and lists Google LLC 15.78MB 4 Sep 2019 com.google.android.keep 193510330 Maps - Navigate & Explore Google LLC 35.25MB 16 May 2019 com.google.android.apps.maps 1016200134 Google Google LLC 82.57MB 30 Aug 2019 com.google.android.googlequicksearchbox 301008048
留神在使用 gplaycli 时的应用区域(Google Play)限定,为了访谒限定在你的国度的应用范例,你不错使用其他应用范例商店,比如“其他应用范例商店”中态状的那些。
接下来,你不错通过指定 APK 的 AppID 来下载(-d)弃取的APK(添加 -p 骄慢程度条,添加 -v 骄慢信息):
$ gplaycli -p -v -d com.google.android.keep [INFO] GPlayCli version 3.26 [Python3.7.4] [INFO] Configuration file is ~/.config/gplaycli/gplaycli.conf [INFO] Device is bacon [INFO] Using cached token. [INFO] Using auto retrieved token to connect to API [INFO] 1 / 1 com.google.android.keep [################################] 15.78MB/15.78MB - 00:00:02 6.57MB/s/s [INFO] Download complete
com.google.android.keep.apk 文献将下载到你刻下的目次中。正如你所想象的,这种方法是一种终点绵薄的下载 APK 的的方法,特殊是在自动化方面。
你不错使用我方的 Google Play 凭证或令牌,默许情况下,gplaycli 将使用里面提供的令牌。
从开发中索要应用范例包保举的方法是从开发获取应用范例包包,因为咱们不错保证应用范例包莫得被第三方修悛改。要从一个 root 或非 root 开发获取应用范例,不错使用以下方法:
使用 adb pull 取回 APK,如果你不知说念包名,第一步是列出开发上装置的整个应用范例:
$ adb shell pm list packages
一朝找到了应用范例的包名,就需要通过它在系统中存储的圆善旅途来下载它。
$ adb shell pm path <package name>
有了 APK 的圆善旅途后,面前不错毛糙地使用 adb pull 来索要它。
$ adb pull <apk path>
APK将下载到你的责任目次中。
另外,还有一些像 APK Extractor 这么的应用范例不需要 root,甚而不错通过你心爱的方法分享所索要的 APK。如果你不心爱通过蚁集诱导开发或建树 adb 来传输文献,那么这将终点有用。
装置应用范例使用 adb install 在模拟器或诱导的开发上装置 APK。
adb install path_to_apk
留神,如果你有原始的源代码况兼使用 Android Studio,则不需要这么作念,因为 Android Studio 会为你完成应用的打包和装置过程。
信息网罗分析应用范例的一个基本门径是网罗信息,这不错通过检验责任站中的应用范例包或辛劳访谒开发上的应用范例数据来完成。在后头的章节中,你会发现更高档的本事,但面前,咱们将集聚在基础上:得回整个已装置应用的列表,探索应用范例包,访谒开发上的应用范例数据目次。这应该会给你一些对于这个应用范例的配景信息,甚而不需要对它进行逆向工程或践诺更高档的分析。咱们将回复以下问题:
包中包含哪些文献? 应用范例使用哪些原生库? 应用范例界说哪些应用范例组件?有哪些管事或内容提供者? 应用范例是可调试的吗? 应用范例是否包含蚁集安全策略? 装置时应用范例是否创建新文献? 列出已装置应用范例当方针是装置在开发上的应用范例时,你首先要弄了了你想要分析的应用范例的正确包名。你不错通过 pm(Android软件包照管器)或使用 frida-ps 来检索已装置的应用范例:
$ adb shell pm list packages package:sg.vantagepoint.helloworldjni package:eu.chainfire.supersu package:org.teamsik.apps.hackingchallenge.easy package:org.teamsik.apps.hackingchallenge.hard package:sg.vp.owasp_mobile.omtg_android
你不错添加参数只骄慢第三方应用范例(-3)和它们的 APK 文献的位置(-f),随后使用 adb pull 可进行下载:
$ adb shell pm list packages -3 -f package:/data/app/sg.vantagepoint.helloworldjni-1/base.apk=sg.vantagepoint.helloworldjni package:/data/app/eu.chainfire.supersu-1/base.apk=eu.chainfire.supersu package:/data/app/org.teamsik.apps.hackingchallenge.easy-1/base.apk=org.teamsik.apps.hackingchallenge.easy package:/data/app/org.teamsik.apps.hackingchallenge.hard-1/base.apk=org.teamsik.apps.hackingchallenge.hard package:/data/app/sg.vp.owasp_mobile.omtg_android-kR0ovWl9eoU_yh0jPJ9caQ==/base.apk=sg.vp.owasp_mobile.omtg_android
这与运行 adb shell pm path <app_package_id> 访佛。
$ adb shell pm path sg.vp.owasp_mobile.omtg_android package:/data/app/sg.vp.owasp_mobile.omtg_android-kR0ovWl9eoU_yh0jPJ9caQ==/base.apk
使用 frida-ps -Uai 获取已诱导 USB 开发((-U)上刻下装置(-i)的整个应用范例(a):
$ frida-ps -Uai PID Name Identifier ----- ---------------------------------------- --------------------------------------- 766 Android System android 21228 Attack me if u can sg.vp.owasp_mobile.omtg_android 4281 Termux com.termux - Uncrackable1 sg.vantagepoint.uncrackable1 - drozer Agent com.mwr.dz
留神,这也骄慢了刻下正在运行的应用范例的PID。记下标志符和 PID(如果有的话),以后会用到它们。
探索应用范例包一朝网罗了方针应用范例的包名,你将但愿最先网罗联系它的信息。首先检索 APK,如“基本测试操作——获取和索要应用范例”中所解释的那样。
APK 文献现实上是 ZIP 文献,不错使用一个范例的 unarchiver 进行解压:
$ unzip base.apk $ ls -lah -rw-r--r-- 1 sven staff 11K Dec 5 14:45 AndroidManifest.xml drwxr-xr-x 5 sven staff 170B Dec 5 16:18 META-INF drwxr-xr-x 6 sven staff 204B Dec 5 16:17 assets -rw-r--r-- 1 sven staff 3.5M Dec 5 14:41 classes.dex drwxr-xr-x 3 sven staff 102B Dec 5 16:18 lib drwxr-xr-x 27 sven staff 918B Dec 5 16:17 res -rw-r--r-- 1 sven staff 241K Dec 5 14:45 resources.arsc
底下是被解压的文献:
AndroidManifest.xml:包含应用范例包名,方针和最低 API 品级,应用范例配置,应用范例组件,权限等的界说。
META-INF:包含应用范例的元数据MANIFEST.MF:存储应用范例资源的哈希CERT.RSA:应用范例的文凭CERT.SF:MANIFEST.MF 文献中的资源列表和相应行的 SHA-1 摘录
assets:包含应用范例资源(Android 应用范例中使用的文献,举例 XML 文献,JavaScript 文献和图片)的目次,AssetManager 不错检索该目次
classes.dex:以 DEX 文献格式编译的类,Dalvik 捏造机/ Android Runtime 不错运行。 DEX 是 Dalvik 捏造机的 Java 字节码, 针对袖珍开发进行了优化
lib:包含构成 APK 的第三方库的目次。
res:包含尚未编译为 resources.arsc 的资源目次 resources.arsc:包含预编译资源的文献,举例用于布局的XML文献由于使用范例 unzip 器具解压会留住一些不可读的文献,如 AndroidManifest.xml,你最好使用 apktool 解压APK,正如“保举器具- apktool”中所述,解压闭幕如下:
$ ls -alh total 32 drwxr-xr-x 9 sven staff 306B Dec 5 16:29 . drwxr-xr-x 5 sven staff 170B Dec 5 16:29 .. -rw-r--r-- 1 sven staff 10K Dec 5 16:29 AndroidManifest.xml -rw-r--r-- 1 sven staff 401B Dec 5 16:29 apktool.yml drwxr-xr-x 6 sven staff 204B Dec 5 16:29 assets drwxr-xr-x 3 sven staff 102B Dec 5 16:29 lib drwxr-xr-x 4 sven staff 136B Dec 5 16:29 original drwxr-xr-x 131 sven staff 4.3K Dec 5 16:29 res drwxr-xr-x 9 sven staff 306B Dec 5 16:29 smaliAndroid 清单文献
Android 清单文献是信息的主要开头,它包含了好多道理的信息,比如包名、权限、应用范例组件等等。
这里是一些信息和相应的重要字的非详备列表,你不错很容易地通过检验文献或使用 grep -i <keyword> AndroidManifest.xml在 AndroidManifest 搜索。
App权限:permission(见“Android 平台 API”)
Backup llowance:android:allowBackup(见“android上的数据存储”)
应用范例组件:activity,service, provider,receiver(见“Android 平台 API”和“Android 上的数据存储”)
可调试标志:debuggable(参见“Android应用范例的代码质料和编译建树”)
请参阅前边提到的章节来了解更多对于怎么测试这些要点的信息。
应用范例二进制文献如上文“探索应用范例包”所示,应用范例的二进制文献(classes.dex)不错在应用范例包的根目次中找到。它是一个所谓的 DEX(Dalvik 可践诺文献)文献,包含编译后的Java代码。由于它的特色,在一些调度之后,你将大约使用反编译器来生成 Java 代码。咱们还看到了运行 apktool 青年景的 smali 文献夹。它以一种叫作念 smali 的中间言语包含了反汇编的 Dalvik 字节码,这是 Dalvik 可践诺文献的一种东说念主类可读的暗意。
联系怎么 DEX 文献逆向工程的更多信息,请参考“Android上的点窜和逆向工程”一章中的“检验反编译 Java 代码”一节。
原生库你不错检讨 APK 中的 lib 文献夹:
$ ls -1 lib/armeabi/ libdatabase_sqlcipher.so libnative.so libsqlcipher_android.so libstlport_shared.so
或者使用 objection:
...g.vp.owasp_mobile.omtg_android on (google: 8.1.0) [usb] # ls lib Type ... Name ------ ... ------------------------ File ... libnative.so File ... libdatabase_sqlcipher.so File ... libstlport_shared.so File ... libsqlcipher_android.so
到面前为止,这是你不错得回的对于原生库的整个信息,除非你最先对它们进行逆向工程,即使用不同于逆向应用范例二进制文献的方法来完成,因为代码不成反编译只可反汇编。联系怎么对这些库进行逆向工程的更多信息,请参考“Android上的点窜和逆向工程”一章中的“检验原生反汇编代码”一节。
其他的应用范例资源浅薄望望 APK 根目次中能否找到其他的资源和文献是很值得的,因为或然它们会包含额外的好东西,如密钥存储库、加密的数据库、文凭等。
访谒应用范例数据目次一朝你装置了应用范例,还有更多的信息需要探索,像 objection 就会派上用场了。
当使用 objection 时,你不错检索不同类型的信息,其中 env 将骄慢应用范例的整个目次信息。
$ objection -g sg.vp.owasp_mobile.omtg_android explore ...g.vp.owasp_mobile.omtg_android on (google: 8.1.0) [usb] # env Name Path ---------------------- --------------------------------------------------------------------------- cacheDirectory /data/user/0/sg.vp.owasp_mobile.omtg_android/cache codeCacheDirectory /data/user/0/sg.vp.owasp_mobile.omtg_android/code_cache externalCacheDirectory /storage/emulated/0/Android/data/sg.vp.owasp_mobile.omtg_android/cache filesDirectory /data/user/0/sg.vp.owasp_mobile.omtg_android/files obbDir /storage/emulated/0/Android/obb/sg.vp.owasp_mobile.omtg_android packageCodePath /data/app/sg.vp.owasp_mobile.omtg_android-kR0ovWl9eoU_yh0jPJ9caQ==/base.apk
在这些信息咱们不错找到:
里面数据目次(又称沙盒目次),在 /data/data/[package-name]或 /data/user/0/[package-name]
外部数据目次在 /storage/emulated/0/Android/data/[package-name] 或 /sdcard/Android/data/[package-name]
应用范例包的旅途在 /data/app/
里面数据目次用于存储运行时创建的数据,基本结构如下:
...g.vp.owasp_mobile.omtg_android on (google: 8.1.0) [usb] # ls Type ... Name --------- ... ------------------- Directory ... cache Directory ... code_cache Directory ... lib Directory ... shared_prefs Directory ... files Directory ... databases Readable: True Writable: True
每个文献夹都有我方的看法:
cache:此位置用于数据缓存,举例,在此目次中找到 WebView 缓存。
code_cache:这是文献系统的应用范例特定缓存目次的位置,想象用于存储缓存代码。对于运行 Android 5.0(API 品级21)或更高版块的开发,当应用或整个这个词平台升级时,系统将删除存储在该位置的整个文献。
lib:此文献夹存储用 C/C++ 写的原生库,这些库可能有几个文献彭胀名之一,包括 .so 和 .dll(x86守旧)。此文献夹包含应用范例具有原生库平台的子目次,包括a. armeabi:整个基于 ARM 处理器编译的代码b. armeabi-v7a:仅适用于整个基于版块7及更高版块的 ARM 处理器编译的代码c. arm64-v8a:整个仅基于版块8及更高版块的 ARM 64位处理器编译的代码d. x86:仅适用基于 x86 处理器编译的代码e. x86_64:仅适用基于 x86_64 处理器编译的代码f. mips:基于 MIPS 处理器编译的代码
shared_prefs:此文献夹包含一个XML文献,该文献存储通过 SharedPreferences API 保存的值。
file:此文献夹存储应用创建的旧例文献。
数据库:此文献夹存储应用范例在运行时生成的 SQLite 数据库文献,举例用户数据文献。
关联词,应用范例可能不仅在这些文献夹中存储更多的数据,还会在父文献夹(/data/data/[package-name])中存储更多数据。
联系安全存储明锐数据的更多信息和最好实践,请参阅“测试数据存储”一章。
监控系统日记在Android上,你不错通过使用 Logcat 很容易地检讨系统音书的日记,Logcat有两种践诺形状:
Logcat 是 Android Studio 中 Dalvik 调试监视器管事器(DDMS)的一部分。 如果应用范例以调试模式运行,则日记输出将骄慢在 Android Monitor 的 Logcat 选项卡上。 你不错通过在 Logcat 中界说模式来过滤应用范例的日记输出。
你不错使用 adb 践诺 Logcat 来持久化存储日记输出:
$ adb logcat > logcat.log
使用以下大叫,不错在作用域内对应用范例的日记输出进行 grep,只需插入包名。天然,你的应用范例需要运行,以便 ps 大约得回它的 PID。
$ adb logcat | grep "$(adb shell ps | grep <package-name> | awk '{print $2}')"建树蚁集测试环境基本的蚁集监控/嗅探
通过 tcpdump、netcat (nc) 和 Wireshark 不错实时辛劳嗅探整个 Android 流量。首先,确保你的手机上有最新版块的 Android tcpdump,以下是装置门径:
$ adb root $ adb remount $ adb push /wherever/you/put/tcpdump /system/xbin/tcpdump
如果践诺 adb root 复返失误 adbd cannot run as root in production builds,如下装置 tcpdump:
$ adb push /wherever/you/put/tcpdump /data/local/tmp/tcpdump $ adb shell $ su $ mount -o rw,remount /system; $ cp /data/local/tmp/tcpdump /system/xbin/ $ cd /system/xbin $ chmod 755 tcpdump
你可能会遭遇失误 mount: '/system' not in /proc/mounts。
在这种情况下,你不错使用 $ mount -o rw,remount / 来替代 $ mount -o rw,remount /system; 一瞥。
记着:要使用 tcpdump,你需要手机有 root 权限。
践诺 tcpdump,望望是否有用。一朝传入了一些包,不错按 CTRL+c 住手 tcpdump。
$ tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes 04:54:06.590751 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply 04:54:09.659658 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply 04:54:10.579795 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply ^C 3 packets captured 3 packets received by filter 0 packets dropped by kernel
要辛劳嗅探 Android 手机的蚁集流量,首先践诺 tcpdump 并通过管说念将其输出到 netcat(nc):
$ tcpdump -i wlan0 -s0 -w - | nc -l -p 11111
上头的 tcpdump 大叫触及到
监听wlan0接口, 以字节为单元界说拿获的大小(快照长度)以获取整个内容(-s0)和 写入文献(-w)。咱们传递 -而不是文献名,这将使 tcpdump 写入范例输出中。通过使用管说念 (|),咱们将 tcpdump 的整个输启航送到 netcat,netcat 会在端口11111上掀开一个监听器。你浅薄需要监视 wlan0 接口。如果你需要另一个接口,请使用大叫 $ ip addr 列出可用的选项。
要访谒端口 11111,你需要通过 adb 将该端口转发到你的开发上。
$ adb forward tcp:11111 tcp:11111
底下的大叫通过 netcat 将你诱导到转发的端口,并通过管说念诱导到 Wireshark。
$ nc localhost 11111 | wireshark -k -S -i -
Wireshark 应该立即启动(-k)。它会诱导到转发端口,通过 netcat 从范例输入(-i -)中得回整个数据,你应该能看到来自 wlan0 接口的整个手机流量。
你不错使用 Wireshark 以可读的格式骄慢拿获的流量,弄了了使用了哪些合同以及它们是否未加密。拿获整个流量(TCP 和 UDP)终点紧迫,因此你应该践诺测试应用范例的整个功能并对其进行分析。
Wireshark 和 tcpdump
Firebase 云音书传递(FCM)是 Google 云音书传递(GCM)的后继产物,是 Google 提供的一项免费管事,可让你在应用范例管事器和客户端应用范例之间发送音书。管事器和客户端应用范例通过 FCM/GCM 诱导管事器进行通讯,可处理下贱和上游音书。
下贱音书(推送见知)从应用管事器发送到客户端应用范例;上游音书从客户端应用范例发送到管事器。
FCM 适用于 Android、iOS 和 Chrome。FCM面前提供了两种诱导管事器合同:HTTP 和 XMPP。如官方文档中所述,这些合同的兑现形状不同,底下的示例演示怎么羁系这两个合同。
测试门径准备您需要在你的手机上配置 iptables 或使用 bettercap 来羁系流量。
FCM 不错使用 XMPP 或 HTTP 与谷歌后端通讯。
HTTPFCM 使用端口5228、5229和5230进行 HTTP 通讯,浅薄只使用端口5228。
为 FCM 使用的端口配置腹地端口转发,底下的例子适用于 macOS:$ echo " rdr pass inet proto tcp from any to any port 5228-> 127.0.0.1 port 8080 rdr pass inet proto tcp from any to any port 5229 -> 127.0.0.1 port 8080 rdr pass inet proto tcp from any to any port 5230 -> 127.0.0.1 port 8080 " | sudo pfctl -ef -羁系代理必须监听上头端口转发规则中指定的端口(端口8080)。 XMPP
对于 XMPP 通讯,FCM 使用端口5235(Production)和5236(Testing)。
为 FCM 使用的端口配置腹地端口转发,底下的例子适用于 macOS:$ echo " rdr pass inet proto tcp from any to any port 5235-> 127.0.0.1 port 8080 rdr pass inet proto tcp from any to any port 5236 -> 127.0.0.1 port 8080 " | sudo pfctl -ef -羁系请求
羁系代理必须监听上头端口转发规则中指定的端口(端口8080)。
启动应用范例并触发一个使用 FCM 的函数,你应该能在监听代理中看到 HTTP 音书。
看成额外的安全层,推送见知不错使用 Capillary 加密。Capillary 是一个简化从基于 Java 的应用范例管事器向 Android 客户端发送端到端(E2E)加密推送音书的库。
建树羁系代理有几个器具守旧对依赖 HTTP(S) 合同的应用范例进行蚁集分析。最紧迫的器具是所谓的羁系代理,OWASP ZAP 和 Burp Suite Professional 是最有名的。一个羁系代理给测试东说念主员一个中间东说念主的位置。这个位置对于读取和修改整个应用范例请乞降端点反应终点有用,用于测试授权、会话、照管等。
为一个捏造开发建树羁系代理在一个 Android 捏造开发(AVD)上建树一个 Web 代里底下的过程,为 Android Studio 3.x 附带的 Android 模拟器建树 HTTP 代理:
建树代理监听腹田主机,举例端口8080。在模拟器建树中配置HTTP代理:a. 点击模拟器菜单栏中的三个点b. 掀开建树菜单c. 单击 Proxy 选项d. 在主机名字段中输入“127.0.0.1”,在端标语字段中输入代理端口(举例,“8080”)e. 点击应用
面前应该是通过主机上的代理路来由 HTTP 和 HTTPS 请求。如果莫得,试着关闭或掀开飞机模式。
在启动 AVD 时,还不错在大叫行上使用模拟器大叫配置 AVD 的代理。底下的示例启动 AVD Nexus_5X_API_23,并将代理建树为 127.0.0.1 和端口8080。
$ emulator @Nexus_5X_API_23 -http-proxy 127.0.0.1:8080在捏造开发上装置一个 CA 文凭
装置 CA 文凭的一种毛糙方法是将文凭推送到开发上,并通过安全建树将其添加到文凭存储中。举例,你不错按以下形状装置 PortSwigger (Burp)CA 文凭:
启动 Burp 并使用主机上的 web 浏览器导航到 burp/,然后单击“CA Certificate”按钮下载 cacert.der。 改变文献后缀 .der 为 .cer。 将文献推送到模拟器$ adb push cacert.cer /sdcard/点击 Settings -> Security -> Install from SD Card 滑倒底部点击 cacert.cer
然后系统会教唆你证明文凭的装置(如果你还莫得装置过,系统还会要求建树开发 PIN)。
对于 Android 7.0 (API 品级24)及以上版块,死守“绕过蚁集安全配置”一节中态状的疏浚过程。
为一个真实开发建树羁系代理首先必须评估可用的蚁集建树选项。用于测试的挪动开发和运行监听代理的机器必须诱导到团结个 Wi-Fi 蚁集,使用(现存的)接入点或创建一个 ad-hoc 无线蚁集。
配置好蚁集并在测试机器和挪动开发之间建立诱导之后,还需要践诺几个门径。
代理必须配置为指向羁系代理。
羁系代理的 CA 文凭必须添加到 Android 开发文凭存储中的确切文凭中。用于存储 CA 文凭的菜单的位置可能取决于 Android 版块和Android OEM 对建树菜单的修改。
如果叶子文凭的有用期延长了一定时分(对于Chrome,则为39个月),一些应用范例可能会骄慢 NET::ERR_CERT_VALIDITY_TOO_LONG 失误。如果使用默许的 Burp CA 文凭,就会发生这种情况,因为 Burp Suite 颁发的叶文凭与其 CA 文凭具有疏浚的有用性。你不错通过创建我方的 CA 文凭并将其导入到 Burp Suite 来绕过这个问题,这在 nviso.be 上的一篇博客著作中有解释。
完成这些门径并启动应用范例后,请求应该会骄慢在羁系代理中。
在 secure.force.com 上你不错找到在 Android 开发上建树 OWASP ZAP 的视频。
其他一些分离:从 Android 8.0(API 品级26)最先,当 HTTPS 流量通过另一个诱导时,应用范例的蚁集行动会发生变化。而从 Android 9(AP 品级28)最先,在握手过程中出现失误时,SSLSocket 和 SSLEngine 在失误处理方面的行动将略有不同。
如前所述,从 Android 7.0(API 品级24)最先,Android OS 默许不再信任用户 CA 文凭,除非在应用范例中指定,鄙人一节中,咱们将解释绕过 Android 安全适度的两种方法。
绕过蚁集安全配置从 Android 7.0(API 品级24)最先,蚁集安全配置允许应用自界说它们的蚁集安全建树,通过界说应用范例信任哪些 CA 文凭。
为了兑现应用范例的蚁集安全配置,需要创建一个名为 network_security_config.xml 的新 xml 资源文献。这在谷歌 Android 代码库中有详细的解释。
创建之后,应用范例还必须在清单文献中包含一个条件,以指向新的蚁集安全配置文献。
<?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:networkSecurityConfig="@xml/network_security_config" ... > ... </application> </manifest>
蚁集安全配置使用一个 XML 文献,应用范例在其中指定哪些 CA 文凭将被信任。有许多绕过蚁集安全配置的方法,底下将对此进行态状,参阅在 Android P 上的蚁集安全配置安全分析指南了解更多信息。
将用户文凭添加到蚁集安全配置中蚁集安全配置有不同的配置,不错通过 src 属性添加非系统文凭的颁发机构:
<certificates src=["system" | "user" | "raw resource"] overridePins=["true" | "false"] />
每个文凭不错是下列中的一种:
一个“raw resource”ID,指向包含 X.509 文凭的文献
预装置的系统 CA 文凭的“system”
用户添加的CA文凭的“user”应用范例信任的 CA 文凭不错是系统信任的CA,也不错是用户信任的 CA。浅薄你照旧在 Android 中添加了羁系代理的文凭看成附加 CA。因此咱们将要点关注“user”建树,该建树允许你通过以下蚁集安全配置强制 Android 应用范例信任此文凭:
<network-security-config> <base-config> <trust-anchors> <certificates src="https://bbs.kanxue.com/system" /> <certificates src="https://bbs.kanxue.com/user" /> </trust-anchors> </base-config> </network-security-config>
要兑现这个新建树,你必须死守以下门径:
使用反编译器具如 apktool 反编译应用范例:$ apktool d <filename>.apk
通过创建包含 <certificates src="https://bbs.kanxue.com/user">的蚁集安全配置,使应用范例信任用户文凭
在反编译应用范例时,参加 apktool 创建的目次,并使用 apktool 重编译应用范例,新的 apk 将在 dist 目次中
$ apktool b你需要从头打包应用范例,正如“逆向工程和点窜”一章的“重打包”部分所解释的那样。联系从头打包过程的更多细节,你也不错参考 Android 开发者文档,它从举座上解释了这个过程。
请留神,即使这种方法终点毛糙,它的主要舛误是你必须对想要评估的每个应用范例应用此操作,这是额外的测试支出。
请记着,如果您正在测试的应用范例有额外的强化按序,比如考据应用范例签名,那么你可能无法再启动该应用范例。看成重打包的一部分,你将使用我方的密钥签名应用范例,因此签名变化将导致这么的检验立即圮绝范例。你需要识别和禁用这些检验通过在从头打包的应用范例修改他们或使用 Frida 动态分析。
使用 Android-CertKiller 的 python 剧本不错自动践诺上述门径。这个剧本不错从装置的 Android 应用范例中索要APK,对其进行反编译,使其可调试,添加允许用户文凭的新的蚁集安全配置,编译并签名新的 APK,并通过 SSL Bypass 装置新的 APK。
python main.py -w *************************************** Android CertKiller (v0.1) *************************************** CertKiller Wizard Mode --------------------------------- List of devices attached 4200dc72f27bc44d device --------------------------------- Enter Application Package Name: nsc.android.mstg.owasp.org.android_nsc Package: /data/app/nsc.android.mstg.owasp.org.android_nsc-1/base.apk I. Initiating APK extraction from device complete ------------------------------ I. Decompiling complete ------------------------------ I. Applying SSL bypass complete ------------------------------ I. Building New APK complete ------------------------------ I. Signing APK complete ------------------------------ Would you like to install the APK on your device(y/N): y ------------------------------------ Installing Unpinned APK ------------------------------ Finished使用 Magisk 在系统信任的 CA 中添加代理文凭
为了幸免为每个应用范例配置蚁集安全配置,咱们必须强制开发招揽代理的文凭看成系统信任的文凭之一。
有一个 Magisk 模块,它将自动将整个用户装置的 CA 文凭添加到系统信任的 CA 列表中。
在 Github 发布页面下载最新版块的模块,将下载的文献推送到开发上,点击 + 按钮导入到 Magisk 照管器的“Module”视图中。临了,从头启动 Magisk Manager 以使调动成效。
从面前最先,通过这个 Magisk 模块,用户在“建树”,“安全性和位置”,“加密和凭据”,“从存储装置”(位置可能有所不同)装置的任何 CA 文凭都会自动由此推送到系统的信任存储中。 从头启动并考据 CA 文凭是否在“建树”,“安全和位置”,“加密和凭据”,“受信任的凭据”中列出(位置可能有所不同)。
手动在系统信任的 CA 中添加代理文凭或者,您也不错手动死守以下门径,以达到疏浚的闭幕:
使 / 系统分区可写,这可能只在 root 开发上进行。运行 'mount' 大叫以确保 / 系统分区是可写的:mount -o rw,remount /system。如果该大叫失败,尝试运行以下大叫 mount -o rw,remount -t ext4 /system
准备代理的 CA 文凭以匹配系统文凭格式,以 der 格式导出代理文凭(这是 Burp Suite 的默许格式),然后运行以下大叫:
$ openssl x509 -inform DER -in cacert.der -out cacert.pem $ openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1 mv cacert.pem <hash>.0临了,复制 <hash>.0 文献参加 /system/etc/security/cacerts 目次,然后运行以下大叫:
chmod 644 <hash>.0
通过死守上述门径,你不错让任何应用范例信任代理的文凭,这允许羁系其流量,天然,除非应用范例使用 SSL pinning。
潜在贫穷应用范例浅薄兑现一些安全适度,这些适度使得对应用范例践诺安全检验变得愈加贫瘠,举例 root 检测和文凭固定。生机情况下,你将得回启用和禁用这些适度的两个应用范例版块,这允许你分析适度的正确兑现,然后不错陆续使用不太安全的版块进行进一步测试。
天然,这并不老是可能的,你可能需要对启用了整个安全适度的应用范例践诺黑盒评估。底下的部分将向您展示怎么绕过针对不同应用范例的文凭固定。
无线蚁齐集的客户端隔断一朝你建树了一个羁系代理况兼有了一个中间东说念主的位置,你可能仍然不成看到任何东西。这可能是由于应用范例中的限定(参见下一节),但也可能是由于你所诱导的 Wi-Fi 中所谓的客户端隔断。
无线客户端隔断是一种安全特色,它阻碍无线客户端彼此通讯。此功能对搭客和 BYOD SSID 很有用,它加多了安全级别,以限定诱导到无线蚁集的开发之间的报复和挟制。
如果咱们需要测试的Wi-Fi具有客户端隔断奈何办?
你不错在 Android 开发上配置代理指向 127.0.0.1:8080,通过 USB 诱导办机到条记本电脑,使用 adb 作念一个反向端口转发:
$ adb reverse tcp:8080 tcp:8080
一朝你完成了这个操作,Android 手机上整个的代理流量将会在127.0.0.1上转到8080端口,它将融会过 adb 重定向到条记本电脑上的127.0.0.1:8080,你将会在 Burp 中看到流量。使用此手段,还不错在具有客户端隔断的 Wi-Fi 中测试和羁系流量。
Non-Proxy Aware Apps一朝你建树了一个羁系代理况兼有了一个中间东说念主位置,你可能仍然不成看到任何东西,这主如果由于以下原因:
这款应用使用了一个访佛 Xamarin 的框架,它莫得使用Android操作系统的代理建树。
你正在测试的应用范例检测了建树的代理,不允许进行任何通讯。
在这两种场景中,你都需要额外的门径临了才智看到流量,鄙人面的部分中,咱们将态状两种不同的处治决策,bettercap 和 iptables。
还不错使用在你适度下的接入点来重定向通讯,但这将需要额外的硬件,咱们面前主要关注软件层面的处治决策。
对于这两个处治决策,你需要在 Burp 激活“守旧不可见代理”,在代 Proxy Tab/Options/Edit 界面。
iptables不错在 Android 开发上使用 iptables 将整个通讯重定向到监听代理,底下的大叫将把端口80重定向到在端口8080上你运行的代理:
$ iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination <Your-Proxy-IP>:8080
考据 iptables 建树并检验 IP 和端口。
$ iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere anywhere tcp dpt:5288 to:<Your-Proxy-IP>:8080 Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain natctrl_nat_POSTROUTING (0 references) target prot opt source destination Chain oem_nat_pre (0 references) target prot opt source destination
如果你想重置 iptables 配置,不错刷新规则:
$ iptables -t nat -Fbettercap
阅读“测试蚁集通讯”一章和“模拟中间东说念主报复”测试用例,不错了解运行 bettercap 的进一步准备和说明。
运行代理的机器和 Android 开发必须诱导到团结个无线蚁集。使用以下大叫启动 bettercap,将底下的 IP 地址(X.X.X.X)替换为 Android 开发的 IP 地址。
$ sudo bettercap -eval "set arp.spoof.targets X.X.X.X; arp.spoof on; set arp.spoof.internal true; set arp.spoof.fullduplex true;" bettercap v2.22 (built for darwin amd64 with go1.12.1) [type 'help' for a list of commands] [19:21:39] [sys.log] [inf] arp.spoof enabling forwarding [19:21:39] [sys.log] [inf] arp.spoof arp spoofer started, probing 1 targets.代理检测
一些挪动应用范例试图检测是否建树了代理。如果是建树了,他们会以为这是坏心的,不成正常责任。
为了绕过这种保护机制,您不错建树 bettercap 或配置不需要在 Android 手机上建树代理的 iptables。咱们之前莫得提到的第三种弃取是使用 Frida,在 Android 上不错通过查询 ProxyInfo 类并检验 getHost() 和 getPort() 方法来检测是否建树了系统代理。可能还有其他多样方法来完成疏浚的任务,以及你需要反编译 APK,以识别现实的类和方法名。
底下您不错找到一个 Frida 剧本的模板源代码,它将匡助你重写用于考据是否建树了代理的方法,并恒久复返 false(在本例中称为 isProxySet)。即使面前配置了代理,应用范例面前也会以为莫得建树,因为函数复返 false。
setTimeout(function(){ Java.perform(function (){ console.log("[*] Script loaded") var Proxy = Java.use("<package-name>.<class-name>") Proxy.isProxySet.overload().implementation = function() { console.log("[*] isProxySet function invoked") return false } }); });文凭绑定
一些应用范例会兑现 SSL Pinning,这将阻碍应用范例将你的羁系文凭看成有用文凭招揽,这意味着将不成监视应用范例和管事器之间的通讯。
联系静态和动态禁用 SSL Pinning 的信息,请参考“测试蚁集通讯”一章中的“绕过 SSL Pinning”。
援用 Signing Manually (Android developer documentation) - https://developer.android.com/studio/publish/app-signing#signing-manually Custom Trust - https://developer.android.com/training/articles/security-config#CustomTrust Basic Network Security Configuration - https://codelabs.developers.google.com/codelabs/android-network-security-config/#3 Security Analyst’s Guide to Network Security Configuration in Android P - https://www.nowsecure.com/blog/2018/08/15/a-security-analysts-guide-to-network-security-configuration-in-android-p/ Android developer documentation - https://developer.android.com/studio/publish/app-signing#signing-manually Android 8.0 Behavior Changes - https://developer.android.com/about/versions/oreo/android-8.0-changes Android 9.0 Behavior Changes - https://developer.android.com/about/versions/pie/android-9.0-changes-all#device-security-changes Codenames, Tags and Build Numbers - https://source.android.com/setup/start/build-numbers Create and Manage Virtual Devices - https://developer.android.com/studio/run/managing-avds.html Guide to rooting mobile devices - https://www.xda-developers.com/root/ API Levels - https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels AssetManager - https://developer.android.com/reference/android/content/res/AssetManager SharedPreferences APIs - https://developer.android.com/training/basics/data-storage/shared-preferences.html Debugging with Logcat - https://developer.android.com/tools/debugging/debugging-log.html Android's APK format - https://en.wikipedia.org/wiki/Android_application_package Android remote sniffing using Tcpdump, nc and Wireshark - https://blog.dornea.nu/2015/02/20/android-remote-sniffing-using-tcpdump-nc-and-wireshark/ Wireless Client Isolation - https://documentation.meraki.com/MR/Firewall_and_Traffic_Shaping/Wireless_Client_Isolation Tools adb - https://developer.android.com/studio/command-line/adb Androbugs - https://github.com/AndroBugs/AndroBugs_Framework Android NDK Downloads - https://developer.android.com/ndk/downloads/index.html#stable-downloads Android Platform Tools - https://developer.android.com/studio/releases/platform-tools.html Android Studio - https://developer.android.com/studio/index.html Android tcpdump - https://www.androidtcpdump.com/ Android-CertKiller - https://github.com/51j0/Android-CertKiller Android-SSL-TrustKiller - https://github.com/iSECPartners/Android-SSL-TrustKiller angr - https://github.com/angr/angr APK Extractor - https://play.google.com/store/apps/details?id=com.ext.ui APKMirror - https://apkmirror.com APKPure - https://apkpure.comapktool - https://github.com/iBotPeaches/Apktool apkx - https://github.com/b-mueller/apkx Burp Suite Professional - https://portswigger.net/burp/ Burp-non-HTTP-Extension - https://github.com/summitt/Burp-Non-HTTP-Extension Capillary - https://github.com/google/capillary Device File Explorer - https://developer.android.com/studio/debug/device-file-explorer Drozer - https://labs.f-secure.com/tools/drozer/ FileZilla - https://filezilla-project.org/download.php Frida - https://www.frida.re/docs/android/ Frida CLI - https://www.frida.re/docs/frida-cli/ frida-ls-devices - https://www.frida.re/docs/frida-ls-devices/ frida-ps - https://www.frida.re/docs/frida-ps/ frida-trace - https://www.frida.re/docs/frida-trace/ gplaycli - https://github.com/matlink/gplaycli House - https://github.com/nccgroup/house InsecureBankv2 - https://github.com/dineshshetty/Android-InsecureBankv2 Inspeckage - https://github.com/ac-pm/Inspeckage JAADAS - https://github.com/flankerhqd/JAADAS JustTrustMe - https://github.com/Fuzion24/JustTrustMe Magisk Modules repository - https://github.com/Magisk-Modules-Repo Magisk Trust User Certs module - https://github.com/NVISO-BE/MagiskTrustUserCerts/releases Mitm-relay - https://github.com/jrmdev/mitm_relay MobSF - https://github.com/MobSF/Mobile-Security-Framework-MobSF Nathan - https://github.com/mseclab/nathan Objection - https://github.com/sensepost/objection OWASP ZAP - https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project QARK - https://github.com/linkedin/qark/ R2frida - https://github.com/nowsecure/r2frida/ Radare2 - https://rada.re/r/ SDK tools - https://developer.android.com/studio/index.html#downloads SSLUnpinning - https://github.com/ac-pm/SSLUnpinning_Xposed Termux - https://play.google.com/store/apps/details?id=com.termux Wireshark - https://www.wireshark.org/ Xposed - https://www.xda-developers.com/xposed-framework-hub/ Android 反逆向谨防Root 检测测试(MSTG-RESILIENCE-1)玄虚在反逆向方面,root 检测的方针是让应用范例在一个 root 开发上运行愈加贫瘠,这反过来就欺压了一些逆向工程师心爱使用的器具和本事。和大多数其他谨防按序一样,root 检测本人并不是很有用,然则在整个这个词应用范例中漫衍兑现多个 root 检测不错提高整个这个词防点窜决策的有用性。
对于 Android,咱们对“root 检测”的界说更浅薄一些,包括自界说 ROM 检测,即细则该开发是现存的 Android 版块如故自界说版块。
常见的 Root 检测方法鄙人一节中,咱们将列出一些常见的 root 检测方法,你会在 OWASP 挪动测试指南的 crackme 示例中发现其中一些方法的兑现。
Root 检测也不错通过像 RootBeer 这么的库兑现。
SafetyNetSafetyNet 是一个 Android API,它提供一组管事并根据软件和硬件信息创建开流配置文献。然后将该配置文献与已通过 Android 兼容性测试的可招揽开发模子列表进行比较。Google 建议将该功能用作“看成防销耗系和谐部分的一个附加深度谨防信号”。
SafetyNet 的确切责任形状莫得得到很好的记载,况兼可能随时改变。当你调用这个 API 时,SafetyNet 会下载一个二进制包,包含谷歌提供的开发考据代码,然后通过反射动态践诺该代码。John Kozyrakis 在《SafetyNet:谷歌的Android点窜检测》中指出,SafetyNet 也尝试检测开发是否已 root,但具体是怎么细则的还不了了。
要使用 API,应用范例不错调用 SafetyNetApi.attest 方法(复返带有认证闭幕的 JWS 音书),然后检验以下字段:
ctsProfileMatch:如果为“ true”,则开流配置文献与Google列出的开发之一匹配。
basicIntegrity:如果为“ true”,则可能未对运行该应用范例的开发进行点窜。
nonces:使反应与请求相匹配。
timestampMs:检验自你发出请求并得回反应以来经过了多万古分,延长的反应可能标明步履可疑。
apkPackageName,apkCertificateDigestSha256,apkDigestSha256:提供联系 APK 的信息,该信息用于考据调用应用范例的身份,如果 API 无法可靠地细则 APK 信息,则短缺这些参数。
以下是示例认证闭幕:
{ "nonce": "R2Rra24fVm5xa2Mg", "timestampMs": 9860437986543, "apkPackageName": "com.package.name.of.requesting.app", "apkCertificateDigestSha256": ["base64 encoded, SHA-256 hash of the certificate used to sign requesting app"], "apkDigestSha256": "base64 encoded, SHA-256 hash of the app's APK", "ctsProfileMatch": true, "basicIntegrity": true, }ctsProfileMatch Vs basicIntegrity
SafetyNet 认证 API 领先提供了一个名为 basicIntegrity 的单一值,以匡助开发东说念主员细则开发的圆善性。跟着API的发展,谷歌引入了一种新的、更严格的检验方法,其闭幕以一个名为 ctsProfileMatch 的值骄慢,该值允许开发东说念主员更细密地评估运行其应用范例的开发。
从广义上讲,basicIntegrity 给你一个对于开发过火 API 的一般圆善性的信号。许多 root 开发 basicIntegrity 会失败,模拟器、捏造开发和有点窜迹象的开发(如 API hook)亦然如斯。
另一方面,ctsProfileMatch 会给你一个对于开发兼容性的更严格的信号,只消通过谷歌认证的未修改开发才智通过 ctsProfileMatch。ctsProfileMatch 会失败的开发包括:
basicIntegrity 失败的开发 具有解锁的指导加载范例的开发 具有自界说系统镜像(自界说 ROM)的开发 制造商未央求或未通过 Google 认证的开发 开发的系统映像径直从 Android 开源范例源文献编译 系统映像看成测试版或开发者预览范例(包括Android测试版范例)的一部分分发的开发 使用 SafetyNetApi.attest 的建议使用加密安全的马上函数在管事器上创建一个大的(16字节或更长的)马上数,以使坏心用户无法重用得胜的认证闭幕来替代不得胜的闭幕
仅当 ctsProfileMatch 值为真时,才信任 APK 信息(apkPackageName, apkCertificateDigestSha256 和 apkDigestSha256)。
应该使用安全诱导将整个这个词 JWS 反应发送到管事器以进行考据。不建议在应用范例中径直践诺考据,因为在这种情况下不成保证考据逻辑本人莫得被修改。
verify 方法只考据 JWS 音书是否由 SafetyNet 签名,它不成考据判决的有用载荷是否适宜你的预期。尽管这个管事看起来很有用,但它只是为测试看法而想象的,况兼它有终点严格的使用配额,每个技俩每天只消10000个请求,不会根据请求加多。因此,您应该参考 SafetyNet 考据示例,并在管事器上以不依赖于 Google 管事器的形状兑现数字签名考据逻辑。
当发出认证请求时,SafetyNet 认证 API 为你提供一个开发现象的快照。一个得胜的认证并不一定意味着该开发在以前就照旧通过了认证,或者在将来就融会过认证,建议有谋齐截种策略以进行餍足用例所需的最少数目的认证。
以防护意外中达到你的 SafetyNetApi.attest配额并得回 attestation 失误,你应该编译一个系统来监视你对 API 的使用,并在达到配额之前发出警戒,这么你不错提高配额。你还应该准备自制情理于超出配额而导致的认证失败,并幸免在这种情况下结巴整个用户。如果你接近于达到配额,或者预期短期的峰值可能会导致你越过配额,那么不错提交此表单,请求短期或历久加多 API 密钥的配额,这个过程以及额外的配额都是免费的。
请死守此清单,以确保你已完成将 SafetyNetApi.attest API 集成到应用范例中所需的每个门径。
范例检测文献存在检验也许最浅薄使用的范例检测方法是检验浅薄会在 root 开发上发现的文献,举例常见的 root 应用范例的包文献过火联系文献和目次,包括以下内容:
白俄罗斯美女15p撸网/system/app/Superuser.apk /system/etc/init.d/99SuperSUDaemon /dev/com.koushikdutta.superuser.daemon/ /system/xbin/daemonsu
检测代码还通常查找在开发 root 后装置的二进制文献,这些搜索包括检验 busybox 和试图掀开在不同的位置 su 二进制文献:
/sbin/su /system/bin/su /system/bin/failsafe/su /system/xbin/su /system/xbin/busybox /system/sd/xbin/su /data/local/su /data/local/xbin/su /data/local/bin/su
检验 su 是否在 PATH 中也不错起作用:
public static boolean checkRoot(){ for(String pathDir : System.getenv("PATH").split(":")){ if(new File(pathDir, "su").exists()) { return true; } } return false; }
不错很容易地在 Java 和原生代码中兑现文献检验。底下的 JNI 示例(改编自 rootinspector)使用 stat 系统调用检索对于文献的信息,如果该文献存在,则复返“1”。
jboolean Java_com_example_statfile(JNIEnv * env, jobject this, jstring filepath) { jboolean fileExists = 0; jboolean isCopy; const char * path = (*env)->GetStringUTFChars(env, filepath, &isCopy); struct stat fileattrib; if (stat(path, &fileattrib) < 0) { __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NATIVE: stat error: [%s]", strerror(errno)); } else { __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NATIVE: stat success, access perms: [%d]", fileattrib.st_mode); return 1; } return 0; }践诺 su 和其他大叫
细则 su 是否存在的另一种方法是尝试通过 Runtime.getRuntime.exec 方法践诺它。如果 su 不在旅途上,就会抛出 IOException。相同的方法不错用来检验在 root 开发上通常发现的其他范例,比如 busybox 和浅薄指向它的象征衔接。
检验运行的进程supersu 是面前最流行的 root 器具,它运行一个名为 daemonsu 的身份考据看护进程,因此这个进程的出现是 root 开发的另一个标志。不错使用 ActivityManager.getRunningAppProcesses 和 manager.getRunningServices API 桃乃木香奈 黑丝,ps 大叫和浏览 /proc 目次陈设正在运行的进程。底下是一个在 rootinspector 中兑现的例子:
public boolean checkRunningProcesses() { boolean returnValue = false; // Get currently running application processes List<RunningServiceInfo> list = manager.getRunningServices(300); if(list != null){ String tempName; for(int i=0;i<list.size();++i){ tempName = list.get(i).process; if(tempName.contains("supersu")