<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>逆向工程 Cookbook</title><link>https://overkazaf.github.io/reverse_engineering/</link><description>Android 与 Web 逆向工程实战手册</description><generator>Hugo 0.147.7 &amp; FixIt v0.4.0-alpha.3-20251224074056-4fec1cda</generator><language>zh-CN</language><managingEditor>overkazaf@gmail.com (+5)</managingEditor><webMaster>overkazaf@gmail.com (+5)</webMaster><lastBuildDate>Sat, 27 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://overkazaf.github.io/reverse_engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>Android 版本安全特性演进与逆向影响</title><link>https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/android_version_security_evolution/</link><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/android_version_security_evolution/</guid><description>&lt;h1 class="heading-element" id="android-版本安全特性演进与逆向影响">&lt;span>Android 版本安全特性演进与逆向影响&lt;/span>
 &lt;a href="#android-%e7%89%88%e6%9c%ac%e5%ae%89%e5%85%a8%e7%89%b9%e6%80%a7%e6%bc%94%e8%bf%9b%e4%b8%8e%e9%80%86%e5%90%91%e5%bd%b1%e5%93%8d" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>Android 系统从 5.0 到 15，每一个大版本都引入了大量安全特性。这些安全增强不仅影响了普通开发者的开发方式，更直接改变了逆向工程师的分析策略和工具选择。不了解目标设备的 Android 版本特性，往往是逆向分析受阻的首要原因。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="1-概述">&lt;span>1. 概述&lt;/span>
 &lt;a href="#1-%e6%a6%82%e8%bf%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>对于逆向工程师来说，理解 Android 各版本安全特性的演进至关重要，原因如下：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工具兼容性&lt;/strong>：不同 Android 版本对 Frida、Xposed、Magisk 等工具的支持程度不同，选错工具版本会直接导致注入失败&lt;/li>
&lt;li>&lt;strong>分析策略差异&lt;/strong>：Android 7.0 之后的证书信任策略变化使得抓包方式截然不同；Android 9.0 的 Hidden API 限制改变了反射调用的方式&lt;/li>
&lt;li>&lt;strong>绕过方法更新&lt;/strong>：每个版本的安全增强都需要对应的绕过手段，旧方法可能在新版本上完全失效&lt;/li>
&lt;li>&lt;strong>Native 层影响&lt;/strong>：从 Linker namespace 到 XOM 再到 16KB 页面大小，底层变化影响 SO 分析的每一个环节&lt;/li>
&lt;li>&lt;strong>加密与认证&lt;/strong>：Hardware Keystore、BiometricPrompt、MTE 等特性不断提高数据保护强度&lt;/li>
&lt;/ol>
&lt;div class="details admonition tip open disabled">
 &lt;div class="details-summary admonition-title">&lt;i class="icon fa-fw fa-regular fa-lightbulb" aria-hidden="true">&lt;/i>实用建议&lt;/div>
 &lt;div class="details-content">
 &lt;div class="admonition-content">&lt;p>在开始任何逆向分析任务之前，务必先确认目标设备的 Android 版本和安全补丁级别：&lt;/p>
&lt;pre>&lt;code>adb shell getprop ro.build.version.release # Android 版本号
adb shell getprop ro.build.version.sdk # API Level
adb shell getprop ro.build.version.security_patch # 安全补丁日期&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="2-版本安全特性总览表">&lt;span>2. 版本安全特性总览表&lt;/span>
 &lt;a href="#2-%e7%89%88%e6%9c%ac%e5%ae%89%e5%85%a8%e7%89%b9%e6%80%a7%e6%80%bb%e8%a7%88%e8%a1%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>下表汇总了 Android 5.0 到 15 各版本的关键安全特性及其对逆向工程的影响：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">版本号 (代号)&lt;/th>
 &lt;th style="text-align: center">API Level&lt;/th>
 &lt;th style="text-align: left">关键安全特性&lt;/th>
 &lt;th style="text-align: left">对逆向的影响&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>5.0-5.1&lt;/strong> (Lollipop)&lt;/td>
 &lt;td style="text-align: center">21-22&lt;/td>
 &lt;td style="text-align: left">ART 默认运行时、SELinux enforcing、全盘加密 (FDE)&lt;/td>
 &lt;td style="text-align: left">DEX 优化格式变化（OAT 文件），需新 dump 策略&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>6.0&lt;/strong> (Marshmallow)&lt;/td>
 &lt;td style="text-align: center">23&lt;/td>
 &lt;td style="text-align: left">运行时权限、验证启动、硬件 Keystore、指纹 API&lt;/td>
 &lt;td style="text-align: left">权限检查成为 hook 目标，Keystore 提取需新方法&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>7.0-7.1&lt;/strong> (Nougat)&lt;/td>
 &lt;td style="text-align: center">24-25&lt;/td>
 &lt;td style="text-align: left">网络安全配置、用户证书不信任、Linker namespace、APK Sig v2、FBE&lt;/td>
 &lt;td style="text-align: left">抓包需额外配置，注入需处理 namespace，v2 签名影响重打包&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>8.0-8.1&lt;/strong> (Oreo)&lt;/td>
 &lt;td style="text-align: center">26-27&lt;/td>
 &lt;td style="text-align: left">Project Treble、Vendor/System 分离、HIDL、后台限制&lt;/td>
 &lt;td style="text-align: left">SO 分析需关注分区，后台限制影响持久化 hook&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>9.0&lt;/strong> (Pie)&lt;/td>
 &lt;td style="text-align: center">28&lt;/td>
 &lt;td style="text-align: left">Hidden API 限制、TLS 强制、BiometricPrompt、ASLR 改进&lt;/td>
 &lt;td style="text-align: left">反射调用受限需绕过，ASLR 使内存分析更复杂&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>10&lt;/strong> (Q)&lt;/td>
 &lt;td style="text-align: center">29&lt;/td>
 &lt;td style="text-align: left">Scoped Storage、XOM、TLS 1.3、MAC 随机化&lt;/td>
 &lt;td style="text-align: left">XOM 使 .text 不可读，Scoped Storage 影响 dump 路径&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>11&lt;/strong> (R)&lt;/td>
 &lt;td style="text-align: center">30&lt;/td>
 &lt;td style="text-align: left">包可见性限制、APK Sig v4、GWP-ASan&lt;/td>
 &lt;td style="text-align: left">应用枚举受限，需 QUERY_ALL_PACKAGES 权限&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>12-12L&lt;/strong> (S)&lt;/td>
 &lt;td style="text-align: center">31-32&lt;/td>
 &lt;td style="text-align: left">隐私面板、ART Mainline 模块化、ASLR 增强&lt;/td>
 &lt;td style="text-align: left">ART 可独立更新，调试限制增强&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>13&lt;/strong> (T)&lt;/td>
 &lt;td style="text-align: center">33&lt;/td>
 &lt;td style="text-align: left">通知权限、Intent filter 验证增强&lt;/td>
 &lt;td style="text-align: left">Intent filter 验证影响 deep link 测试&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>14&lt;/strong> (U)&lt;/td>
 &lt;td style="text-align: center">34&lt;/td>
 &lt;td style="text-align: left">Credential Manager、16KB 页面大小支持、minSdkVersion 限制&lt;/td>
 &lt;td style="text-align: left">SO 段对齐变化，旧工具重打包受限&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>15&lt;/strong> (V)&lt;/td>
 &lt;td style="text-align: center">35&lt;/td>
 &lt;td style="text-align: left">16KB 页面全面支持、MTE 生产可用、Privacy Sandbox&lt;/td>
 &lt;td style="text-align: left">MTE 影响内存分析和 exploit，16KB 页面成硬性要求&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="3-详细版本分析">&lt;span>3. 详细版本分析&lt;/span>
 &lt;a href="#3-%e8%af%a6%e7%bb%86%e7%89%88%e6%9c%ac%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="31-android-50-51-lollipop-api-21-22">&lt;span>3.1 Android 5.0-5.1 (Lollipop, API 21-22)&lt;/span>
 &lt;a href="#31-android-50-51-lollipop-api-21-22" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Android 5.0 是 Android 安全架构的分水岭，三项核心变化奠定了现代 Android 安全的基础。&lt;/p>
&lt;h4 class="heading-element" id="311-art-取代-dalvik-成为默认运行时">&lt;span>3.1.1 ART 取代 Dalvik 成为默认运行时&lt;/span>
 &lt;a href="#311-art-%e5%8f%96%e4%bb%a3-dalvik-%e6%88%90%e4%b8%ba%e9%bb%98%e8%ae%a4%e8%bf%90%e8%a1%8c%e6%97%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 5.0 将 ART (Android Runtime) 确立为唯一的运行时环境，彻底取代了 Dalvik。ART 使用 AOT (Ahead-Of-Time) 编译，在应用安装时将 DEX 字节码编译为本地机器码。&lt;/p>
&lt;p>&lt;strong>核心变化&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>DEX 字节码不再直接解释执行，而是被编译为 OAT (Optimized Android runtime application) 格式&lt;/li>
&lt;li>编译产物路径从 &lt;code>/data/dalvik-cache/&lt;/code> 下的 &lt;code>.dex&lt;/code> 文件变为 &lt;code>.odex&lt;/code>（实际是 OAT 格式）&lt;/li>
&lt;li>运行时方法调用方式发生根本改变&lt;/li>
&lt;/ul>
&lt;pre>&lt;code># 查看 OAT 文件
adb shell ls /data/dalvik-cache/arm64/
# 使用 oatdump 分析
oatdump --oat-file=/data/dalvik-cache/arm64/system@app@SomeApp@SomeApp.apk@classes.dex&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="312-selinux-enforcing-mode-全面启用">&lt;span>3.1.2 SELinux Enforcing Mode 全面启用&lt;/span>
 &lt;a href="#312-selinux-enforcing-mode-%e5%85%a8%e9%9d%a2%e5%90%af%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 5.0 将 SELinux 从 Permissive 模式切换到 Enforcing 模式，意味着所有违反安全策略的操作都会被阻止，而不仅仅是记录日志。&lt;/p>
&lt;pre>&lt;code># 查看 SELinux 状态
adb shell getenforce
# 输出: Enforcing

# 查看 SELinux 策略
adb shell ls -la /sys/fs/selinux/&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="313-全盘加密-fde">&lt;span>3.1.3 全盘加密 (FDE)&lt;/span>
 &lt;a href="#313-%e5%85%a8%e7%9b%98%e5%8a%a0%e5%af%86-fde" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 5.0 要求新出厂设备默认启用全盘加密 (Full Disk Encryption)，使用 &lt;code>dm-crypt&lt;/code> 对 &lt;code>/data&lt;/code> 分区进行加密。&lt;/p>
&lt;h4 class="heading-element" id="对逆向的影响">&lt;span>对逆向的影响&lt;/span>
 &lt;a href="#%e5%af%b9%e9%80%86%e5%90%91%e7%9a%84%e5%bd%b1%e5%93%8d" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">影响点&lt;/th>
 &lt;th style="text-align: left">具体变化&lt;/th>
 &lt;th style="text-align: left">应对策略&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">DEX dump&lt;/td>
 &lt;td style="text-align: left">OAT 格式取代直接 DEX 执行&lt;/td>
 &lt;td style="text-align: left">使用 &lt;code>oatdump&lt;/code>、&lt;code>baksmali&lt;/code> 适配 OAT 格式&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">方法 Hook&lt;/td>
 &lt;td style="text-align: left">ART 方法结构与 Dalvik 不同&lt;/td>
 &lt;td style="text-align: left">更新 Hook 框架至 ART 兼容版本&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">SELinux 阻止&lt;/td>
 &lt;td style="text-align: left">文件操作、ptrace 等被策略限制&lt;/td>
 &lt;td style="text-align: left">需要修改 SELinux 策略或切换到 Permissive&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">数据获取&lt;/td>
 &lt;td style="text-align: left">全盘加密阻止离线数据读取&lt;/td>
 &lt;td style="text-align: left">需要在设备解锁状态下操作&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h3 class="heading-element" id="32-android-60-marshmallow-api-23">&lt;span>3.2 Android 6.0 (Marshmallow, API 23)&lt;/span>
 &lt;a href="#32-android-60-marshmallow-api-23" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="321-运行时权限模型">&lt;span>3.2.1 运行时权限模型&lt;/span>
 &lt;a href="#321-%e8%bf%90%e8%a1%8c%e6%97%b6%e6%9d%83%e9%99%90%e6%a8%a1%e5%9e%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 6.0 将敏感权限从安装时授予改为运行时动态申请。应用需要在代码中显式请求危险权限，用户可以拒绝或撤销。&lt;/p>
&lt;pre>&lt;code>// 运行时权限检查代码（逆向分析中常见的 hook 目标）
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
 != PackageManager.PERMISSION_GRANTED) {
 ActivityCompat.requestPermissions(this,
 new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE);
}&lt;/code>&lt;/pre>&lt;p>&lt;strong>逆向关注点&lt;/strong>：&lt;code>checkSelfPermission&lt;/code> 和 &lt;code>requestPermissions&lt;/code> 是常见的 hook 目标，可以通过 Frida 直接返回 &lt;code>PERMISSION_GRANTED&lt;/code> 绕过权限检查。&lt;/p>
&lt;pre>&lt;code>// Frida 绕过运行时权限检查
Java.perform(function() {
 var ContextCompat = Java.use(&amp;#39;androidx.core.content.ContextCompat&amp;#39;);
 ContextCompat.checkSelfPermission.implementation = function(context, permission) {
 console.log(&amp;#39;[*] checkSelfPermission: &amp;#39; &amp;#43; permission);
 return 0; // PERMISSION_GRANTED
 };
});&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="322-验证启动-verified-boot">&lt;span>3.2.2 验证启动 (Verified Boot)&lt;/span>
 &lt;a href="#322-%e9%aa%8c%e8%af%81%e5%90%af%e5%8a%a8-verified-boot" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 6.0 强化了验证启动机制，确保从引导加载程序到系统分区的完整信任链。修改 system 分区会触发验证失败。&lt;/p>
&lt;h4 class="heading-element" id="323-硬件级密钥库-hardware-keystore">&lt;span>3.2.3 硬件级密钥库 (Hardware Keystore)&lt;/span>
 &lt;a href="#323-%e7%a1%ac%e4%bb%b6%e7%ba%a7%e5%af%86%e9%92%a5%e5%ba%93-hardware-keystore" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 6.0 引入了硬件级别的密钥库 API，密钥存储在 TEE (Trusted Execution Environment) 或专用安全芯片中。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>存储在硬件 Keystore 中的密钥无法通过软件方式提取&lt;/li>
&lt;li>加密操作在 TEE 内部完成，无法通过内存 dump 获取密钥材料&lt;/li>
&lt;li>需要 hook &lt;code>KeyStore&lt;/code> API 调用来拦截加密前/解密后的明文数据&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>// Frida hook KeyStore 操作
Java.perform(function() {
 var Cipher = Java.use(&amp;#39;javax.crypto.Cipher&amp;#39;);
 Cipher.doFinal.overload(&amp;#39;[B&amp;#39;).implementation = function(input) {
 console.log(&amp;#39;[*] Cipher.doFinal input: &amp;#39; &amp;#43; bytesToHex(input));
 var result = this.doFinal(input);
 console.log(&amp;#39;[*] Cipher.doFinal output: &amp;#39; &amp;#43; bytesToHex(result));
 return result;
 };
});&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="324-指纹认证-api">&lt;span>3.2.4 指纹认证 API&lt;/span>
 &lt;a href="#324-%e6%8c%87%e7%ba%b9%e8%ae%a4%e8%af%81-api" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 6.0 引入 &lt;code>FingerprintManager&lt;/code> API，允许应用使用设备指纹传感器进行身份验证。&lt;/p>
&lt;hr>
&lt;h3 class="heading-element" id="33-android-70-71-nougat-api-24-25">&lt;span>3.3 Android 7.0-7.1 (Nougat, API 24-25)&lt;/span>
 &lt;a href="#33-android-70-71-nougat-api-24-25" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Android 7.0 对逆向工程的影响极为深远，尤其是网络安全配置的引入，直接改变了流量拦截的方式。&lt;/p>
&lt;h4 class="heading-element" id="331-网络安全配置-network-security-config">&lt;span>3.3.1 网络安全配置 (Network Security Config)&lt;/span>
 &lt;a href="#331-%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8%e9%85%8d%e7%bd%ae-network-security-config" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>这是影响逆向分析最深远的变化之一。Android 7.0 引入了 &lt;code>network_security_config.xml&lt;/code>，允许应用以声明式方式配置网络安全策略。&lt;/p>
&lt;p>&lt;strong>最关键的变化&lt;/strong>：默认情况下，应用不再信任用户安装的 CA 证书。这意味着在设备上安装 mitmproxy/Burp 等代理的证书后，targetSdkVersion &amp;gt;= 24 的应用会拒绝连接。&lt;/p>
&lt;pre>&lt;code>&amp;lt;!-- 应用的默认行为 (targetSdkVersion &amp;gt;= 24) --&amp;gt;
&amp;lt;network-security-config&amp;gt;
 &amp;lt;base-config&amp;gt;
 &amp;lt;trust-anchors&amp;gt;
 &amp;lt;certificates src=&amp;#34;system&amp;#34;/&amp;gt;
 &amp;lt;!-- 注意：没有 user 证书源 --&amp;gt;
 &amp;lt;/trust-anchors&amp;gt;
 &amp;lt;/base-config&amp;gt;
&amp;lt;/network-security-config&amp;gt;&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="绕过证书信任限制">&lt;span>绕过证书信任限制&lt;/span>
 &lt;a href="#%e7%bb%95%e8%bf%87%e8%af%81%e4%b9%a6%e4%bf%a1%e4%bb%bb%e9%99%90%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>&lt;strong>方法一：修改 APK 中的网络安全配置&lt;/strong>&lt;/p>
&lt;p>反编译 APK 后，添加或修改 &lt;code>network_security_config.xml&lt;/code>，使其信任用户证书：&lt;/p>
&lt;pre>&lt;code>&amp;lt;!-- network_security_config.xml --&amp;gt;
&amp;lt;network-security-config&amp;gt;
 &amp;lt;base-config&amp;gt;
 &amp;lt;trust-anchors&amp;gt;
 &amp;lt;certificates src=&amp;#34;system&amp;#34;/&amp;gt;
 &amp;lt;certificates src=&amp;#34;user&amp;#34;/&amp;gt;
 &amp;lt;/trust-anchors&amp;gt;
 &amp;lt;/base-config&amp;gt;
&amp;lt;/network-security-config&amp;gt;&lt;/code>&lt;/pre>&lt;p>然后在 &lt;code>AndroidManifest.xml&lt;/code> 中引用：&lt;/p>
&lt;pre>&lt;code>&amp;lt;application
 android:networkSecurityConfig=&amp;#34;@xml/network_security_config&amp;#34;
 ...&amp;gt;&lt;/code>&lt;/pre>&lt;p>&lt;strong>方法二：Magisk + MoveCert 模块&lt;/strong>&lt;/p>
&lt;p>将用户证书移动到系统证书目录，使其被视为系统证书：&lt;/p>
&lt;pre>&lt;code># 1. 安装 Magisk (确保版本 24&amp;#43;)
# 2. 安装 MagiskTrustUserCerts 模块
# 模块地址: https://github.com/NVISOsecurity/MagiskTrustUserCerts

# 安装用户证书后，模块会自动将其复制到 /system/etc/security/cacerts/
# 重启设备生效

# 验证证书是否在系统目录
adb shell ls /system/etc/security/cacerts/ | grep -i &amp;#34;hash&amp;#34;&lt;/code>&lt;/pre>&lt;p>&lt;strong>方法三：Frida SSL Pinning Bypass&lt;/strong>&lt;/p>
&lt;p>使用 Frida 在运行时绕过 SSL 证书验证：&lt;/p>
&lt;pre>&lt;code>// Frida SSL Pinning Bypass (通用版)
Java.perform(function() {
 // 绕过 TrustManager
 var TrustManagerImpl = Java.use(&amp;#39;com.android.org.conscrypt.TrustManagerImpl&amp;#39;);
 TrustManagerImpl.verifyChain.implementation = function(untrustedChain,
 trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
 console.log(&amp;#39;[*] SSL Pinning Bypass: &amp;#39; &amp;#43; host);
 return untrustedChain;
 };

 // 绕过 OkHttp CertificatePinner
 try {
 var CertificatePinner = Java.use(&amp;#39;okhttp3.CertificatePinner&amp;#39;);
 CertificatePinner.check.overload(&amp;#39;java.lang.String&amp;#39;, &amp;#39;java.util.List&amp;#39;)
 .implementation = function(hostname, peerCertificates) {
 console.log(&amp;#39;[*] OkHttp SSL Pinning Bypass: &amp;#39; &amp;#43; hostname);
 return;
 };
 } catch (e) {
 console.log(&amp;#39;[*] OkHttp not found, skipping...&amp;#39;);
 }

 // 绕过 WebView SSL 错误
 var WebViewClient = Java.use(&amp;#39;android.webkit.WebViewClient&amp;#39;);
 WebViewClient.onReceivedSslError.implementation = function(view, handler, error) {
 console.log(&amp;#39;[*] WebView SSL Error Bypass&amp;#39;);
 handler.proceed();
 };
});&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="332-linker-namespace-隔离">&lt;span>3.3.2 Linker Namespace 隔离&lt;/span>
 &lt;a href="#332-linker-namespace-%e9%9a%94%e7%a6%bb" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 7.0 引入了 Linker namespace 机制，限制应用只能加载特定路径下的共享库，防止应用访问系统内部的私有 SO 库。&lt;/p>
&lt;pre>&lt;code># namespace 隔离示意
┌──────────────────────────────────────────┐
│ Android 7.0&amp;#43; Linker │
├──────────────────────────────────────────┤
│ │
│ ┌────────────┐ ┌────────────┐ │
│ │ default │ │ classloader│ │
│ │ namespace │ │ namespace │ │
│ ├────────────┤ ├────────────┤ │
│ │ /system/lib│ │ /data/app/ │ │
│ │ /vendor/lib│ │ app的SO │ │
│ └────────────┘ └────────────┘ │
│ ↕ 受限访问 │
└──────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;p>&lt;strong>对逆向影响&lt;/strong>：Frida 和 Xposed 注入时需要处理 namespace 隔离，否则可能无法正确加载或 hook 目标 SO。&lt;/p>
&lt;h4 class="heading-element" id="333-apk-signature-scheme-v2">&lt;span>3.3.3 APK Signature Scheme v2&lt;/span>
 &lt;a href="#333-apk-signature-scheme-v2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>APK Signature Scheme v2 对整个 APK 文件进行签名验证（而非仅 JAR 签名），修改 APK 任何部分都会导致签名失效。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：重打包后必须使用支持 v2 签名的工具重新签名：&lt;/p>
&lt;pre>&lt;code># 使用 apksigner 进行 v2 签名
apksigner sign --ks my-key.jks --ks-key-alias mykey \
 --v1-signing-enabled true --v2-signing-enabled true \
 modified.apk

# 验证签名
apksigner verify --verbose modified.apk&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="334-file-based-encryption-fbe">&lt;span>3.3.4 File-Based Encryption (FBE)&lt;/span>
 &lt;a href="#334-file-based-encryption-fbe" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 7.0 引入基于文件的加密 (FBE) 取代全盘加密 (FDE)，允许不同文件使用不同密钥加密，支持 Direct Boot 模式。&lt;/p>
&lt;h4 class="heading-element" id="335-jit-编译器回归-profile-guided-compilation">&lt;span>3.3.5 JIT 编译器回归 (Profile-Guided Compilation)&lt;/span>
 &lt;a href="#335-jit-%e7%bc%96%e8%af%91%e5%99%a8%e5%9b%9e%e5%bd%92-profile-guided-compilation" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>ART 重新引入 JIT 编译器，与 AOT 结合形成混合编译模式：&lt;/p>
&lt;pre>&lt;code>应用首次安装 → 全部解释执行/JIT
 ↓
 收集运行时 Profile
 ↓
 设备空闲时执行 AOT 编译（仅热点代码）
 ↓
 后续运行: 热点代码 AOT 执行 &amp;#43; 冷代码 JIT/解释执行&lt;/code>&lt;/pre>&lt;p>&lt;strong>对逆向影响&lt;/strong>：方法可能处于不同的编译状态，hook 时需要考虑方法是 AOT 编译还是解释执行。&lt;/p>
&lt;hr>
&lt;h3 class="heading-element" id="34-android-80-81-oreo-api-26-27">&lt;span>3.4 Android 8.0-8.1 (Oreo, API 26-27)&lt;/span>
 &lt;a href="#34-android-80-81-oreo-api-26-27" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="341-project-treble-hal-接口标准化">&lt;span>3.4.1 Project Treble (HAL 接口标准化)&lt;/span>
 &lt;a href="#341-project-treble-hal-%e6%8e%a5%e5%8f%a3%e6%a0%87%e5%87%86%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Project Treble 是 Android 架构的一次重大重构，将 vendor（硬件相关）实现与 Android 框架分离：&lt;/p>
&lt;pre>&lt;code>┌──────────────────────────────────────────────┐
│ Android 8.0&amp;#43; 架构 │
├──────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Framework │ │ Apps │ ← system 分区 │
│ └────┬─────┘ └──────────┘ │
│ │ HIDL │
│ ┌────┴─────┐ │
│ │ Vendor │ ← vendor 分区 │
│ │ HAL │ │
│ └──────────┘ │
│ │
└──────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="342-vendorsystem-分区分离">&lt;span>3.4.2 Vendor/System 分区分离&lt;/span>
 &lt;a href="#342-vendorsystem-%e5%88%86%e5%8c%ba%e5%88%86%e7%a6%bb" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>SO 库被严格按照分区组织：&lt;/p>
&lt;pre>&lt;code># System SO 路径
/system/lib64/ # 框架层 SO
/system/lib64/hw/ # System HAL 库

# Vendor SO 路径
/vendor/lib64/ # 厂商 SO
/vendor/lib64/hw/ # Vendor HAL 库

# 查看 SO 所在分区
adb shell ls -la /system/lib64/ | head -20
adb shell ls -la /vendor/lib64/ | head -20&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="343-hidl-hal-interface-definition-language">&lt;span>3.4.3 HIDL (HAL Interface Definition Language)&lt;/span>
 &lt;a href="#343-hidl-hal-interface-definition-language" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>HIDL 定义了 Framework 与 Vendor HAL 之间的稳定接口，使用 Binder IPC 进行跨进程通信。&lt;/p>
&lt;h4 class="heading-element" id="344-更严格的后台限制">&lt;span>3.4.4 更严格的后台限制&lt;/span>
 &lt;a href="#344-%e6%9b%b4%e4%b8%a5%e6%a0%bc%e7%9a%84%e5%90%8e%e5%8f%b0%e9%99%90%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 8.0 对后台服务施加了严格限制：&lt;/p>
&lt;ul>
&lt;li>后台服务在一定时间后被系统终止&lt;/li>
&lt;li>隐式广播限制&lt;/li>
&lt;li>后台定位更新频率降低&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>需要持久化运行的 hook 框架（如 Frida gadget）可能被后台限制影响&lt;/li>
&lt;li>需要将服务声明为前台服务或使用 Work Manager&lt;/li>
&lt;/ul>
&lt;h4 class="heading-element" id="treble-架构下的-so-查找技巧">&lt;span>Treble 架构下的 SO 查找技巧&lt;/span>
 &lt;a href="#treble-%e6%9e%b6%e6%9e%84%e4%b8%8b%e7%9a%84-so-%e6%9f%a5%e6%89%be%e6%8a%80%e5%b7%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code># 查找特定 SO 在哪个分区
adb shell find /system /vendor /product /apex -name &amp;#34;libtarget.so&amp;#34; 2&amp;gt;/dev/null

# 查看 SO 的链接依赖
adb shell readelf -d /vendor/lib64/libtarget.so | grep NEEDED

# 查看 vendor namespace 中可见的库
adb shell cat /system/etc/ld.config.txt | grep -A 10 &amp;#34;\[vendor\]&amp;#34;

# 列出 HIDL 服务
adb shell lshal&lt;/code>&lt;/pre>&lt;hr>
&lt;h3 class="heading-element" id="35-android-90-pie-api-28">&lt;span>3.5 Android 9.0 (Pie, API 28)&lt;/span>
 &lt;a href="#35-android-90-pie-api-28" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Android 9.0 对逆向工程引入了几项影响深远的限制。&lt;/p>
&lt;h4 class="heading-element" id="351-非-sdk-接口限制-hidden-api-restrictions">&lt;span>3.5.1 非 SDK 接口限制 (Hidden API Restrictions)&lt;/span>
 &lt;a href="#351-%e9%9d%9e-sdk-%e6%8e%a5%e5%8f%a3%e9%99%90%e5%88%b6-hidden-api-restrictions" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>这是对 Java 层逆向影响最大的变化之一。Android 9.0 开始限制应用通过反射、JNI 等方式访问 SDK 中未公开的内部 API（标记为 &lt;code>@hide&lt;/code> 的 API）。&lt;/p>
&lt;p>&lt;strong>限制分级&lt;/strong>：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">列表&lt;/th>
 &lt;th style="text-align: left">说明&lt;/th>
 &lt;th style="text-align: left">限制程度&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">whitelist&lt;/td>
 &lt;td style="text-align: left">公开 SDK API&lt;/td>
 &lt;td style="text-align: left">无限制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">light-greylist&lt;/td>
 &lt;td style="text-align: left">宽松灰名单&lt;/td>
 &lt;td style="text-align: left">可用但有警告&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">dark-greylist&lt;/td>
 &lt;td style="text-align: left">严格灰名单&lt;/td>
 &lt;td style="text-align: left">targetSdk &amp;gt;= 28 被阻止&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">blacklist&lt;/td>
 &lt;td style="text-align: left">黑名单&lt;/td>
 &lt;td style="text-align: left">完全阻止&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;p>&lt;strong>绕过方法一：双重反射&lt;/strong>&lt;/p>
&lt;pre>&lt;code>// 通过双重反射绕过 Hidden API 限制
// 原理: 系统检查的是&amp;#34;调用者&amp;#34;的身份, 双重反射让&amp;#34;调用者&amp;#34;变成系统自己
Method forName = Class.class.getDeclaredMethod(&amp;#34;forName&amp;#34;, String.class);
Method getDeclaredMethod = Class.class.getDeclaredMethod(
 &amp;#34;getDeclaredMethod&amp;#34;, String.class, Class[].class);

// 通过双重反射获取 VMRuntime
Class&amp;lt;?&amp;gt; vmRuntime = (Class&amp;lt;?&amp;gt;) forName.invoke(null, &amp;#34;dalvik.system.VMRuntime&amp;#34;);
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(
 vmRuntime, &amp;#34;setHiddenApiExemptions&amp;#34;, new Class[]{String[].class});

// 获取 VMRuntime 实例并设置豁免
Method getRuntime = (Method) getDeclaredMethod.invoke(
 vmRuntime, &amp;#34;getRuntime&amp;#34;, new Class[0]);
Object runtime = getRuntime.invoke(null);

// 豁免所有隐藏 API（传入 &amp;#34;L&amp;#34; 表示所有以 L 开头的签名，即所有类）
setHiddenApiExemptions.invoke(runtime, new Object[]{new String[]{&amp;#34;L&amp;#34;}});&lt;/code>&lt;/pre>&lt;p>&lt;strong>绕过方法二：Frida 运行时绕过&lt;/strong>&lt;/p>
&lt;pre>&lt;code>// Frida 绕过 Hidden API 限制
Java.perform(function() {
 var VMRuntime = Java.use(&amp;#39;dalvik.system.VMRuntime&amp;#39;);
 var runtime = VMRuntime.getRuntime();
 runtime.setHiddenApiExemptions([&amp;#39;L&amp;#39;]);
 console.log(&amp;#39;[*] Hidden API restrictions bypassed&amp;#39;);
});&lt;/code>&lt;/pre>&lt;p>&lt;strong>绕过方法三：通过 adb 设置&lt;/strong>&lt;/p>
&lt;pre>&lt;code># 开发/测试环境下可直接通过 adb 关闭限制
adb shell settings put global hidden_api_policy 1
# 0 = 不检测 (disable)
# 1 = 仅警告 (just warn)
# 2 = 不允许 dark greylist
# 3 = 不允许所有非 SDK API&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="352-tls-默认强制">&lt;span>3.5.2 TLS 默认强制&lt;/span>
 &lt;a href="#352-tls-%e9%bb%98%e8%ae%a4%e5%bc%ba%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 9.0 默认禁止明文 HTTP 流量 (cleartext traffic)。应用必须使用 HTTPS，除非在网络安全配置中显式允许明文。&lt;/p>
&lt;pre>&lt;code>&amp;lt;!-- 允许明文流量（逆向测试环境配置） --&amp;gt;
&amp;lt;network-security-config&amp;gt;
 &amp;lt;base-config cleartextTrafficPermitted=&amp;#34;true&amp;#34;&amp;gt;
 &amp;lt;trust-anchors&amp;gt;
 &amp;lt;certificates src=&amp;#34;system&amp;#34;/&amp;gt;
 &amp;lt;certificates src=&amp;#34;user&amp;#34;/&amp;gt;
 &amp;lt;/trust-anchors&amp;gt;
 &amp;lt;/base-config&amp;gt;
&amp;lt;/network-security-config&amp;gt;&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="353-biometricprompt-api">&lt;span>3.5.3 BiometricPrompt API&lt;/span>
 &lt;a href="#353-biometricprompt-api" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 9.0 引入统一的生物识别认证 API &lt;code>BiometricPrompt&lt;/code>，替代了 Android 6.0 的 &lt;code>FingerprintManager&lt;/code>。&lt;/p>
&lt;h4 class="heading-element" id="354-dns-over-tls">&lt;span>3.5.4 DNS over TLS&lt;/span>
 &lt;a href="#354-dns-over-tls" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>系统级 DNS over TLS 支持（Private DNS），使得 DNS 查询也被加密，影响 DNS 层面的流量拦截。&lt;/p>
&lt;h4 class="heading-element" id="355-aslr-改进">&lt;span>3.5.5 ASLR 改进&lt;/span>
 &lt;a href="#355-aslr-%e6%94%b9%e8%bf%9b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 9.0 改进了地址空间布局随机化 (ASLR)，增加了代码和数据段的随机化程度。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>每次进程重启后，库的加载基址都会变化&lt;/li>
&lt;li>不能依赖固定地址进行 hook，需要动态计算偏移&lt;/li>
&lt;li>使用 Frida 的 &lt;code>Module.findBaseAddress()&lt;/code> 获取实际加载地址&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>// Frida 中动态获取 SO 基址
var base = Module.findBaseAddress(&amp;#39;libtarget.so&amp;#39;);
console.log(&amp;#39;[*] libtarget.so base: &amp;#39; &amp;#43; base);

// 基于偏移 hook
var targetFunc = base.add(0x1234);
Interceptor.attach(targetFunc, {
 onEnter: function(args) {
 console.log(&amp;#39;[*] targetFunc called&amp;#39;);
 }
});&lt;/code>&lt;/pre>&lt;hr>
&lt;h3 class="heading-element" id="36-android-10-q-api-29">&lt;span>3.6 Android 10 (Q, API 29)&lt;/span>
 &lt;a href="#36-android-10-q-api-29" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Android 10 在原生安全层面引入了多项重要变化。&lt;/p>
&lt;h4 class="heading-element" id="361-scoped-storage-分区存储">&lt;span>3.6.1 Scoped Storage (分区存储)&lt;/span>
 &lt;a href="#361-scoped-storage-%e5%88%86%e5%8c%ba%e5%ad%98%e5%82%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>应用只能访问自己的私有目录和特定的公共媒体文件，不再能自由访问外部存储。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>文件 dump 路径受限，不能随意写入 &lt;code>/sdcard/&lt;/code> 目录&lt;/li>
&lt;li>Frida 脚本中保存文件需要使用应用的私有目录&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>// Frida 在 Scoped Storage 环境下保存文件
Java.perform(function() {
 var context = Java.use(&amp;#39;android.app.ActivityThread&amp;#39;)
 .currentApplication().getApplicationContext();
 var filesDir = context.getFilesDir().getAbsolutePath();
 console.log(&amp;#39;[*] 可写目录: &amp;#39; &amp;#43; filesDir);
 // 文件操作使用 filesDir 作为基础路径
});&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="362-execute-only-memory-xom">&lt;span>3.6.2 Execute-Only Memory (XOM)&lt;/span>
 &lt;a href="#362-execute-only-memory-xom" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 10 为 native 代码引入了仅执行内存 (XOM) 机制。&lt;code>.text&lt;/code> 段被标记为仅执行，不可读取。&lt;/p>
&lt;p>&lt;strong>核心影响&lt;/strong>：传统的内存 dump 技术无法直接读取代码段。&lt;/p>
&lt;pre>&lt;code># XOM 内存权限对比
传统 (Android 9 及更早):
 .text 段权限: r-x (可读可执行)
 可以直接通过 /proc/pid/mem 读取代码

Android 10&amp;#43; (XOM 启用):
 .text 段权限: --x (仅执行)
 通过 /proc/pid/mem 读取 .text 段返回全零&lt;/code>&lt;/pre>&lt;p>&lt;strong>XOM 绕过技术&lt;/strong>：&lt;/p>
&lt;pre>&lt;code># 绕过方法 1: 使用 ptrace (Frida 默认使用此方式)
# ptrace 系统调用不受 XOM 限制
# Frida 通过 ptrace attach 到目标进程后可以正常读取代码段

# 绕过方法 2: 通过 adb 禁用 XOM (需要 root)
# adb shell setprop debug.arm64.xom false
# 部分设备可能不支持此属性

# 绕过方法 3: 修改 ELF phdr 移除 XOM 标志
# 将 PF_X (仅执行) 改为 PF_R|PF_X (可读可执行)
# 需要修改 SO 文件的 Program Header

# 绕过方法 4: 利用 mmap 重新映射
# 在 Frida 脚本中重新映射代码段为可读&lt;/code>&lt;/pre>&lt;pre>&lt;code>// Frida 检查 XOM 状态
function checkXOM(moduleName) {
 var module = Process.findModuleByName(moduleName);
 if (module) {
 Process.enumerateRanges(&amp;#39;--x&amp;#39;).forEach(function(range) {
 if (range.base.compare(module.base) &amp;gt;= 0 &amp;amp;&amp;amp;
 range.base.compare(module.base.add(module.size)) &amp;lt; 0) {
 console.log(&amp;#39;[*] XOM 区域: &amp;#39; &amp;#43; range.base &amp;#43; &amp;#39; - &amp;#39;
 &amp;#43; range.base.add(range.size)
 &amp;#43; &amp;#39; 权限: &amp;#39; &amp;#43; range.protection);
 }
 });
 }
}

// 通过 Frida 读取 XOM 保护的代码段
function readXOMCode(address, size) {
 // Frida 通过 ptrace 可以绕过 XOM 限制
 try {
 var buf = Memory.readByteArray(address, size);
 console.log(&amp;#39;[*] 成功读取 &amp;#39; &amp;#43; size &amp;#43; &amp;#39; 字节&amp;#39;);
 return buf;
 } catch (e) {
 console.log(&amp;#39;[-] 读取失败: &amp;#39; &amp;#43; e);
 return null;
 }
}&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="363-tls-13-默认启用">&lt;span>3.6.3 TLS 1.3 默认启用&lt;/span>
 &lt;a href="#363-tls-13-%e9%bb%98%e8%ae%a4%e5%90%af%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 10 默认启用 TLS 1.3，提供更快的握手速度和更强的安全性。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：TLS 1.3 加密了更多的握手信息（如证书），使被动嗅探更加困难。但使用中间人代理（如 mitmproxy）的主动拦截仍然有效。&lt;/p>
&lt;h4 class="heading-element" id="364-mac-地址随机化">&lt;span>3.6.4 MAC 地址随机化&lt;/span>
 &lt;a href="#364-mac-%e5%9c%b0%e5%9d%80%e9%9a%8f%e6%9c%ba%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 10 对每个 Wi-Fi 网络使用随机 MAC 地址，防止跨网络跟踪设备。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>基于 MAC 地址的设备指纹识别失效&lt;/li>
&lt;li>分析设备指纹时需要关注应用是否使用了其他持久化标识符&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 class="heading-element" id="37-android-11-r-api-30">&lt;span>3.7 Android 11 (R, API 30)&lt;/span>
 &lt;a href="#37-android-11-r-api-30" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="371-包可见性限制-package-visibility">&lt;span>3.7.1 包可见性限制 (Package Visibility)&lt;/span>
 &lt;a href="#371-%e5%8c%85%e5%8f%af%e8%a7%81%e6%80%a7%e9%99%90%e5%88%b6-package-visibility" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 11 限制了应用查询其他已安装应用的能力。默认情况下，应用只能看到特定的系统应用和在 &lt;code>&amp;lt;queries&amp;gt;&lt;/code> 标签中声明的应用。&lt;/p>
&lt;pre>&lt;code>&amp;lt;!-- AndroidManifest.xml 中声明需要查询的包 --&amp;gt;
&amp;lt;manifest&amp;gt;
 &amp;lt;queries&amp;gt;
 &amp;lt;package android:name=&amp;#34;com.target.app&amp;#34;/&amp;gt;
 &amp;lt;/queries&amp;gt;

 &amp;lt;!-- 或者请求完全的包可见性 --&amp;gt;
 &amp;lt;uses-permission android:name=&amp;#34;android.permission.QUERY_ALL_PACKAGES&amp;#34;/&amp;gt;
&amp;lt;/manifest&amp;gt;&lt;/code>&lt;/pre>&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>编写分析工具时，枚举已安装应用需要 &lt;code>QUERY_ALL_PACKAGES&lt;/code> 权限&lt;/li>
&lt;li>hook &lt;code>PackageManager.getInstalledPackages()&lt;/code> 可能返回不完整的结果&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>// Frida 绕过包可见性限制
Java.perform(function() {
 var PackageManager = Java.use(&amp;#39;android.app.ApplicationPackageManager&amp;#39;);
 PackageManager.getInstalledPackages.overload(&amp;#39;int&amp;#39;).implementation = function(flags) {
 // 通过调用系统服务直接获取完整列表
 console.log(&amp;#39;[*] getInstalledPackages called with flags: &amp;#39; &amp;#43; flags);
 var result = this.getInstalledPackages(flags);
 console.log(&amp;#39;[*] Returned &amp;#39; &amp;#43; result.size() &amp;#43; &amp;#39; packages&amp;#39;);
 return result;
 };
});&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="372-apk-signature-scheme-v4">&lt;span>3.7.2 APK Signature Scheme v4&lt;/span>
 &lt;a href="#372-apk-signature-scheme-v4" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>APK Signature Scheme v4 主要服务于 ADB 增量安装 (&lt;code>adb install --incremental&lt;/code>)，生成一个单独的 &lt;code>.idsig&lt;/code> 文件。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：v4 签名不影响传统的 APK 重打包流程，因为 v4 签名是可选的，且仅用于优化安装速度。&lt;/p>
&lt;h4 class="heading-element" id="373-scoped-storage-强制执行">&lt;span>3.7.3 Scoped Storage 强制执行&lt;/span>
 &lt;a href="#373-scoped-storage-%e5%bc%ba%e5%88%b6%e6%89%a7%e8%a1%8c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 11 强制所有应用使用 Scoped Storage，移除了 &lt;code>requestLegacyExternalStorage&lt;/code> 的豁免。&lt;/p>
&lt;h4 class="heading-element" id="374-gwp-asan-内存安全检测">&lt;span>3.7.4 GWP-ASan (内存安全检测)&lt;/span>
 &lt;a href="#374-gwp-asan-%e5%86%85%e5%ad%98%e5%ae%89%e5%85%a8%e6%a3%80%e6%b5%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>GWP-ASan 是一个概率性的内存安全检测器，可以检测 use-after-free 和 heap-buffer-overflow。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>利用内存安全漏洞的 exploit 可能被 GWP-ASan 检测到&lt;/li>
&lt;li>分析 crash 时需要区分 GWP-ASan 报告和普通 crash&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 class="heading-element" id="38-android-12-12l-s-api-31-32">&lt;span>3.8 Android 12-12L (S, API 31-32)&lt;/span>
 &lt;a href="#38-android-12-12l-s-api-31-32" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="381-隐私面板-privacy-dashboard">&lt;span>3.8.1 隐私面板 (Privacy Dashboard)&lt;/span>
 &lt;a href="#381-%e9%9a%90%e7%a7%81%e9%9d%a2%e6%9d%bf-privacy-dashboard" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 12 引入隐私面板，显示过去 24 小时内应用对敏感权限（位置、摄像头、麦克风）的访问记录。&lt;/p>
&lt;h4 class="heading-element" id="382-art-模块化-mainline">&lt;span>3.8.2 ART 模块化 (Mainline)&lt;/span>
 &lt;a href="#382-art-%e6%a8%a1%e5%9d%97%e5%8c%96-mainline" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>这是一项对逆向工程有深远影响的变化。ART 运行时成为 Project Mainline 的一部分，可以通过 Google Play 系统更新独立于 Android 版本进行更新。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>同一个 Android 12 设备，ART 运行时版本可能不同&lt;/li>
&lt;li>hook 框架（如 Frida）的兼容性可能在 ART 模块更新后出现问题&lt;/li>
&lt;li>分析 ART 内部结构时需要确认具体的 ART 版本&lt;/li>
&lt;/ul>
&lt;pre>&lt;code># 查看 ART 模块版本
adb shell pm list packages | grep com.google.android.art
adb shell dumpsys package com.google.android.art | grep version

# 查看 ART apex 信息
adb shell ls -la /apex/com.android.art/&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="383-aslr-增强">&lt;span>3.8.3 ASLR 增强&lt;/span>
 &lt;a href="#383-aslr-%e5%a2%9e%e5%bc%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 12 进一步增强了 ASLR，增大了地址空间随机化范围，特别是对 64 位进程。&lt;/p>
&lt;h4 class="heading-element" id="384-restricted-debugging-增强">&lt;span>3.8.4 Restricted Debugging 增强&lt;/span>
 &lt;a href="#384-restricted-debugging-%e5%a2%9e%e5%bc%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 12 增强了对非 debuggable 应用的调试限制。&lt;/p>
&lt;p>&lt;strong>绕过 Restricted Debugging 的方法&lt;/strong>：&lt;/p>
&lt;pre>&lt;code># 方法 1: 使用 Magisk 修改 ro.debuggable 属性
# 在 Magisk 的 post-fs-data.sh 中添加:
resetprop ro.debuggable 1

# 方法 2: 重打包 APK 启用 debuggable
# 在 AndroidManifest.xml 中添加:
# android:debuggable=&amp;#34;true&amp;#34;

# 方法 3: 使用 Frida 直接注入（不需要 debuggable）
frida -U -f com.target.app -l hook.js --no-pause&lt;/code>&lt;/pre>&lt;pre>&lt;code>// Frida 绕过 debuggable 检查
Java.perform(function() {
 var ApplicationInfo = Java.use(&amp;#39;android.content.pm.ApplicationInfo&amp;#39;);
 var GET_META_DATA = 128;

 // 一些应用会检查自身是否为 debuggable
 var PackageManager = Java.use(&amp;#39;android.app.ApplicationPackageManager&amp;#39;);
 PackageManager.getApplicationInfo.overload(&amp;#39;java.lang.String&amp;#39;, &amp;#39;int&amp;#39;)
 .implementation = function(packageName, flags) {
 var info = this.getApplicationInfo(packageName, flags);
 // 移除 FLAG_DEBUGGABLE 标志，防止反调试检测
 info.flags.value = info.flags.value &amp;amp; ~2; // FLAG_DEBUGGABLE = 0x2
 return info;
 };
});&lt;/code>&lt;/pre>&lt;hr>
&lt;h3 class="heading-element" id="39-android-13-t-api-33">&lt;span>3.9 Android 13 (T, API 33)&lt;/span>
 &lt;a href="#39-android-13-t-api-33" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="391-通知权限-post_notifications">&lt;span>3.9.1 通知权限 (POST_NOTIFICATIONS)&lt;/span>
 &lt;a href="#391-%e9%80%9a%e7%9f%a5%e6%9d%83%e9%99%90-post_notifications" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 13 将通知发送权限改为运行时权限，应用需要显式请求 &lt;code>POST_NOTIFICATIONS&lt;/code> 权限。&lt;/p>
&lt;h4 class="heading-element" id="392-按应用语言设置">&lt;span>3.9.2 按应用语言设置&lt;/span>
 &lt;a href="#392-%e6%8c%89%e5%ba%94%e7%94%a8%e8%af%ad%e8%a8%80%e8%ae%be%e7%bd%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>允许用户为每个应用单独设置语言，应用可能根据语言配置加载不同的资源或执行不同的逻辑分支。&lt;/p>
&lt;h4 class="heading-element" id="393-intent-filter-验证增强">&lt;span>3.9.3 Intent Filter 验证增强&lt;/span>
 &lt;a href="#393-intent-filter-%e9%aa%8c%e8%af%81%e5%a2%9e%e5%bc%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 13 加强了 Intent Filter 的验证，自动验证的 App Link 域名需要通过更严格的 Digital Asset Links 验证。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>测试 deep link 时需要确保域名验证通过，或使用 adb 命令手动触发&lt;/li>
&lt;li>分析应用的路由逻辑时需要关注 Intent Filter 配置&lt;/li>
&lt;/ul>
&lt;pre>&lt;code># 测试 deep link（不受 Intent Filter 验证限制）
adb shell am start -a android.intent.action.VIEW \
 -d &amp;#34;https://example.com/deeplink?param=value&amp;#34; \
 com.target.app

# 查看应用的 Intent Filter 验证状态
adb shell pm get-app-links com.target.app

# 手动重置验证状态
adb shell pm set-app-links --package com.target.app 0 all&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="394-更细粒度的媒体权限">&lt;span>3.9.4 更细粒度的媒体权限&lt;/span>
 &lt;a href="#394-%e6%9b%b4%e7%bb%86%e7%b2%92%e5%ba%a6%e7%9a%84%e5%aa%92%e4%bd%93%e6%9d%83%e9%99%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>&lt;code>READ_EXTERNAL_STORAGE&lt;/code> 被拆分为 &lt;code>READ_MEDIA_IMAGES&lt;/code>、&lt;code>READ_MEDIA_VIDEO&lt;/code> 和 &lt;code>READ_MEDIA_AUDIO&lt;/code>。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：权限模型继续复杂化，hook 权限检查时需要覆盖更多的权限类型。&lt;/p>
&lt;hr>
&lt;h3 class="heading-element" id="310-android-14-u-api-34">&lt;span>3.10 Android 14 (U, API 34)&lt;/span>
 &lt;a href="#310-android-14-u-api-34" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="3101-credential-manager-api">&lt;span>3.10.1 Credential Manager API&lt;/span>
 &lt;a href="#3101-credential-manager-api" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 14 引入 Credential Manager 统一管理密码、通行密钥 (Passkeys) 和联合登录凭据。&lt;/p>
&lt;h4 class="heading-element" id="3102-16kb-页面大小支持部分设备">&lt;span>3.10.2 16KB 页面大小支持（部分设备）&lt;/span>
 &lt;a href="#3102-16kb-%e9%a1%b5%e9%9d%a2%e5%a4%a7%e5%b0%8f%e6%94%af%e6%8c%81%e9%83%a8%e5%88%86%e8%ae%be%e5%a4%87" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>这是对 Native 层逆向影响最大的变化之一。部分 Android 14 设备开始支持 16KB 内存页面大小（传统为 4KB）。&lt;/p>
&lt;p>&lt;strong>核心影响&lt;/strong>：&lt;/p>
&lt;pre>&lt;code># 4KB 页面 (传统): .text 段对齐到 0x1000 (4096)
# 16KB 页面 (Android 14&amp;#43;): .text 段对齐到 0x4000 (16384)

# 分析工具需要适配新的对齐方式
# 使用 readelf 检查段对齐:
readelf -l libtarget.so | grep LOAD

# 4KB 页面设备的典型输出:
# LOAD 0x000000 0x00000000 0x00000000 0x01234 0x01234 R 0x1000
# LOAD 0x001000 0x00001000 0x00001000 0x05678 0x05678 R E 0x1000

# 16KB 页面设备的典型输出:
# LOAD 0x000000 0x00000000 0x00000000 0x01234 0x01234 R 0x4000
# LOAD 0x004000 0x00004000 0x00004000 0x05678 0x05678 R E 0x4000&lt;/code>&lt;/pre>&lt;p>&lt;strong>对逆向影响详解&lt;/strong>：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">影响方面&lt;/th>
 &lt;th style="text-align: left">4KB 页面&lt;/th>
 &lt;th style="text-align: left">16KB 页面&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">段对齐&lt;/td>
 &lt;td style="text-align: left">0x1000&lt;/td>
 &lt;td style="text-align: left">0x4000&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">内存映射粒度&lt;/td>
 &lt;td style="text-align: left">4KB&lt;/td>
 &lt;td style="text-align: left">16KB&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">ELF 段间距&lt;/td>
 &lt;td style="text-align: left">较小&lt;/td>
 &lt;td style="text-align: left">较大（更多填充）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">偏移计算&lt;/td>
 &lt;td style="text-align: left">基于 0x1000&lt;/td>
 &lt;td style="text-align: left">基于 0x4000&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">工具兼容性&lt;/td>
 &lt;td style="text-align: left">所有工具支持&lt;/td>
 &lt;td style="text-align: left">需要工具更新&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;pre>&lt;code># 查看设备页面大小
adb shell getconf PAGE_SIZE
# 输出 4096 或 16384

# 检查 SO 是否兼容 16KB 页面
# 如果 LOAD 段的 p_align 小于 0x4000，可能不兼容
readelf -l libtarget.so | grep -E &amp;#34;LOAD|Align&amp;#34;&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="3103-更严格的隐式-intent-限制">&lt;span>3.10.3 更严格的隐式 Intent 限制&lt;/span>
 &lt;a href="#3103-%e6%9b%b4%e4%b8%a5%e6%a0%bc%e7%9a%84%e9%9a%90%e5%bc%8f-intent-%e9%99%90%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 14 要求隐式 Intent 必须指定目标组件的导出状态，未导出的组件不能通过隐式 Intent 启动。&lt;/p>
&lt;h4 class="heading-element" id="3104-minsdkversion-限制">&lt;span>3.10.4 minSdkVersion 限制&lt;/span>
 &lt;a href="#3104-minsdkversion-%e9%99%90%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 14 不允许安装 &lt;code>minSdkVersion&lt;/code> 低于 23 (Android 6.0) 的 APK。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>一些旧版逆向工具（如早期的 Xposed Installer）的 APK 无法安装&lt;/li>
&lt;li>重打包时需要确保 &lt;code>minSdkVersion &amp;gt;= 23&lt;/code>&lt;/li>
&lt;/ul>
&lt;pre>&lt;code># 查看 APK 的 minSdkVersion
aapt2 dump badging target.apk | grep sdkVersion
# 或
apktool d target.apk &amp;amp;&amp;amp; grep minSdkVersion target/apktool.yml&lt;/code>&lt;/pre>&lt;hr>
&lt;h3 class="heading-element" id="311-android-15-v-api-35">&lt;span>3.11 Android 15 (V, API 35)&lt;/span>
 &lt;a href="#311-android-15-v-api-35" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="3111-16kb-页面大小全面支持">&lt;span>3.11.1 16KB 页面大小全面支持&lt;/span>
 &lt;a href="#3111-16kb-%e9%a1%b5%e9%9d%a2%e5%a4%a7%e5%b0%8f%e5%85%a8%e9%9d%a2%e6%94%af%e6%8c%81" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 15 将 16KB 页面大小从可选变为全面支持，所有新发布的设备和 SO 库都需要适配。&lt;/p>
&lt;p>&lt;strong>必须适配的要点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>所有 Native 库的 ELF 段必须按 16KB 对齐&lt;/li>
&lt;li>使用 NDK r27+ 编译以确保兼容&lt;/li>
&lt;li>旧的 SO 库可能无法在 16KB 页面设备上加载&lt;/li>
&lt;/ul>
&lt;pre>&lt;code># 检查 SO 是否兼容 16KB 页面
# 需要所有 LOAD 段的 p_align &amp;gt;= 0x4000
check_16kb_compat() {
 local so_file=$1
 readelf -l &amp;#34;$so_file&amp;#34; 2&amp;gt;/dev/null | grep &amp;#34;LOAD&amp;#34; | while read line; do
 align=$(echo &amp;#34;$line&amp;#34; | awk &amp;#39;{print $NF}&amp;#39;)
 if [ &amp;#34;$align&amp;#34; != &amp;#34;0x4000&amp;#34; ] &amp;amp;&amp;amp; [ &amp;#34;$align&amp;#34; != &amp;#34;0x10000&amp;#34; ]; then
 echo &amp;#34;[-] $so_file: 不兼容 16KB 页面 (align=$align)&amp;#34;
 return 1
 fi
 done
 echo &amp;#34;[&amp;#43;] $so_file: 兼容 16KB 页面&amp;#34;
}

# 批量检查应用中的所有 SO
for so in $(unzip -l target.apk | grep &amp;#34;\.so$&amp;#34; | awk &amp;#39;{print $4}&amp;#39;); do
 unzip -o target.apk &amp;#34;$so&amp;#34; -d /tmp/check_so/
 check_16kb_compat &amp;#34;/tmp/check_so/$so&amp;#34;
done&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="3112-mte-memory-tagging-extension-生产可用">&lt;span>3.11.2 MTE (Memory Tagging Extension) 生产可用&lt;/span>
 &lt;a href="#3112-mte-memory-tagging-extension-%e7%94%9f%e4%ba%a7%e5%8f%af%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>MTE 是 ARMv8.5-A 引入的硬件级内存安全特性，Android 15 将其推向生产可用状态。MTE 在指针的高位（Top Byte）存储一个 4-bit 的标签 (tag)，并在内存分配时为每个 16 字节的内存 granule 分配一个对应的标签。访问内存时，硬件自动检查指针标签与内存标签是否匹配。&lt;/p>
&lt;pre>&lt;code># MTE 指针格式
指针值: 0x0B00007F12345678
 ^^
 ||-- 4-bit memory tag (值: 0x0B)
 |
 高位字节中的标签

# 内存布局:
地址: 0x7F12345670 0x7F12345680 0x7F12345690
标签: [0B] [0B] [03]
 ↑ 匹配 ↑ 匹配 ↑ 不匹配 → 触发异常

# 影响所有基于指针的分析:
# 1. 读取指针值时需要 mask 掉 tag bits
# 2. 构造指针时需要设置正确的 tag
# 3. 内存扫描需要考虑 tagged pointer&lt;/code>&lt;/pre>&lt;p>&lt;strong>MTE 对逆向工程的影响&lt;/strong>：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">影响方面&lt;/th>
 &lt;th style="text-align: left">详细说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">指针分析&lt;/td>
 &lt;td style="text-align: left">所有指针高位包含 tag，直接使用会导致地址错误&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">内存 dump&lt;/td>
 &lt;td style="text-align: left">dump 的指针值包含 tag，需要 mask 后才能使用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Exploit 开发&lt;/td>
 &lt;td style="text-align: left">UAF 和堆溢出被硬件检测，利用难度大幅增加&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Hook 框架&lt;/td>
 &lt;td style="text-align: left">需要正确处理 tagged pointer，否则 hook 可能失败&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">调试工具&lt;/td>
 &lt;td style="text-align: left">GDB/LLDB 需要支持 MTE 才能正确显示地址&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;pre>&lt;code>// Frida 中处理 MTE tagged pointer
function untagPointer(ptr) {
 // 移除高字节中的 MTE tag
 // ARM64 的 TBI (Top Byte Ignore) 允许高字节存储 tag
 var mask = ptr_size === 8
 ? ptr(&amp;#39;0x00FFFFFFFFFFFFFF&amp;#39;)
 : ptr(&amp;#39;0xFFFFFFFF&amp;#39;);
 return ptr.and(mask);
}

// 使用示例
Interceptor.attach(targetAddr, {
 onEnter: function(args) {
 var rawPtr = args[0];
 var cleanPtr = untagPointer(rawPtr);
 console.log(&amp;#39;[*] Raw pointer: &amp;#39; &amp;#43; rawPtr);
 console.log(&amp;#39;[*] Clean pointer: &amp;#39; &amp;#43; cleanPtr);
 console.log(&amp;#39;[*] MTE tag: 0x&amp;#39; &amp;#43;
 rawPtr.shr(56).and(0xF).toString(16));
 }
});&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="3113-privacy-sandbox">&lt;span>3.11.3 Privacy Sandbox&lt;/span>
 &lt;a href="#3113-privacy-sandbox" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Privacy Sandbox 旨在替代广告追踪标识符（如 GAID），引入 Topics API、Attribution Reporting 等新机制。&lt;/p>
&lt;p>&lt;strong>对逆向影响&lt;/strong>：分析广告 SDK 和用户追踪机制时需要了解新的 Privacy Sandbox API。&lt;/p>
&lt;h4 class="heading-element" id="3114-截屏检测-api">&lt;span>3.11.4 截屏检测 API&lt;/span>
 &lt;a href="#3114-%e6%88%aa%e5%b1%8f%e6%a3%80%e6%b5%8b-api" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>Android 15 引入了 &lt;code>Activity.ScreenCaptureCallback&lt;/code>，允许应用检测用户截屏行为。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="4-逆向工具兼容性矩阵">&lt;span>4. 逆向工具兼容性矩阵&lt;/span>
 &lt;a href="#4-%e9%80%86%e5%90%91%e5%b7%a5%e5%85%b7%e5%85%bc%e5%ae%b9%e6%80%a7%e7%9f%a9%e9%98%b5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>下表展示了主流逆向工具在不同 Android 版本范围内的兼容性情况：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">工具&lt;/th>
 &lt;th style="text-align: center">Android 7-9&lt;/th>
 &lt;th style="text-align: center">Android 10-12&lt;/th>
 &lt;th style="text-align: center">Android 13-15&lt;/th>
 &lt;th style="text-align: left">关键适配点&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>Frida&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅ (需适配)&lt;/td>
 &lt;td style="text-align: left">XOM 绕过、SELinux 策略、MTE 兼容&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>Xposed (原版)&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">❌&lt;/td>
 &lt;td style="text-align: center">❌&lt;/td>
 &lt;td style="text-align: left">仅支持 ART 5.0-8.1，已停止维护&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>LSPosed&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">❌&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: left">基于 Riru/Zygisk，需要 Magisk&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>Magisk&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅ (需最新版)&lt;/td>
 &lt;td style="text-align: left">版本 24+ 改用 Zygisk 架构&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>objection&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: left">基于 Frida，兼容性取决于 Frida&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>apktool&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅ (v2.9+)&lt;/td>
 &lt;td style="text-align: left">需适配新资源格式和签名方案&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>jadx&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: left">Java/Kotlin 反编译无版本差异&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>IDA Pro&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: left">Native 层静态分析无版本差异&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>Ghidra&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: left">同上，但需关注 16KB 页面对齐&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>r2/radare2&lt;/strong>&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: center">✅&lt;/td>
 &lt;td style="text-align: left">同上&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;p>&lt;strong>工具版本建议&lt;/strong>：&lt;/p>
&lt;pre>&lt;code># 推荐的工具最低版本（截至 2025 年）
Frida: &amp;gt;= 16.x # 支持 Android 14/15 新特性
Magisk: &amp;gt;= 26.x # Zygisk 架构稳定版
LSPosed: &amp;gt;= 1.9.x # 最新 Zygisk 模块版本
apktool: &amp;gt;= 2.9.x # 支持新资源格式
objection: &amp;gt;= 1.11.x # 基于最新 Frida&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="5-apk-签名方案演进">&lt;span>5. APK 签名方案演进&lt;/span>
 &lt;a href="#5-apk-%e7%ad%be%e5%90%8d%e6%96%b9%e6%a1%88%e6%bc%94%e8%bf%9b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>APK 签名方案从 v1 到 v4 经历了四代演进，每一代都增强了安全性。&lt;/p>
&lt;h3 class="heading-element" id="51-签名方案对比">&lt;span>5.1 签名方案对比&lt;/span>
 &lt;a href="#51-%e7%ad%be%e5%90%8d%e6%96%b9%e6%a1%88%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">方案&lt;/th>
 &lt;th style="text-align: left">引入版本&lt;/th>
 &lt;th style="text-align: left">签名范围&lt;/th>
 &lt;th style="text-align: left">防篡改能力&lt;/th>
 &lt;th style="text-align: left">重打包难度&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>v1&lt;/strong> (JAR Signing)&lt;/td>
 &lt;td style="text-align: left">所有版本&lt;/td>
 &lt;td style="text-align: left">仅 ZIP 条目&lt;/td>
 &lt;td style="text-align: left">弱：可修改未签名条目&lt;/td>
 &lt;td style="text-align: left">低&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>v2&lt;/strong> (APK Sig Scheme)&lt;/td>
 &lt;td style="text-align: left">Android 7.0+&lt;/td>
 &lt;td style="text-align: left">整个 APK 文件&lt;/td>
 &lt;td style="text-align: left">强：文件级完整性&lt;/td>
 &lt;td style="text-align: left">中&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>v3&lt;/strong> (Key Rotation)&lt;/td>
 &lt;td style="text-align: left">Android 9.0+&lt;/td>
 &lt;td style="text-align: left">整个 APK + 密钥轮换&lt;/td>
 &lt;td style="text-align: left">强：支持证书链&lt;/td>
 &lt;td style="text-align: left">中&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>v4&lt;/strong> (Incremental)&lt;/td>
 &lt;td style="text-align: left">Android 11+&lt;/td>
 &lt;td style="text-align: left">增量安装验证&lt;/td>
 &lt;td style="text-align: left">补充：仅用于安装优化&lt;/td>
 &lt;td style="text-align: left">不影响&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="52-各方案详解">&lt;span>5.2 各方案详解&lt;/span>
 &lt;a href="#52-%e5%90%84%e6%96%b9%e6%a1%88%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="v1-jar-signing">&lt;span>v1: JAR Signing&lt;/span>
 &lt;a href="#v1-jar-signing" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>APK (ZIP 格式)
├── classes.dex ← 签名覆盖
├── resources.arsc ← 签名覆盖
├── res/ ← 签名覆盖
├── lib/ ← 签名覆盖
├── META-INF/
│ ├── MANIFEST.MF ← 各文件 SHA 摘要
│ ├── CERT.SF ← MANIFEST.MF 的签名
│ └── CERT.RSA ← 证书 &amp;#43; 签名
└── assets/ ← 签名覆盖&lt;/code>&lt;/pre>&lt;p>&lt;strong>弱点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>仅对 ZIP 条目进行独立签名&lt;/li>
&lt;li>可以在不破坏签名的情况下在 ZIP 文件的注释区域添加数据&lt;/li>
&lt;li>可以利用 ZIP 格式的特性绕过部分检查&lt;/li>
&lt;/ul>
&lt;h4 class="heading-element" id="v2-apk-signature-scheme-v2">&lt;span>v2: APK Signature Scheme v2&lt;/span>
 &lt;a href="#v2-apk-signature-scheme-v2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>APK 文件结构 (v2 签名):
┌──────────────────────┐
│ ZIP 内容区 │ ← 签名保护区域 1
├──────────────────────┤
│ APK Signing Block │ ← 包含 v2 签名数据
├──────────────────────┤
│ 中央目录 │ ← 签名保护区域 2
├──────────────────────┤
│ 中央目录结尾 │ ← 签名保护区域 3
└──────────────────────┘&lt;/code>&lt;/pre>&lt;p>v2 对 APK Signing Block 以外的所有区域计算摘要并签名，任何修改都会导致验证失败。&lt;/p>
&lt;h4 class="heading-element" id="v3-key-rotation">&lt;span>v3: Key Rotation&lt;/span>
 &lt;a href="#v3-key-rotation" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>v3 在 v2 的基础上增加了密钥轮换支持，允许使用新证书签名同时保持与旧证书的信任链：&lt;/p>
&lt;pre>&lt;code>Signing Block 中的证书链:
 旧证书 A → 新证书 B → 当前证书 C&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="v4-incremental-install">&lt;span>v4: Incremental Install&lt;/span>
 &lt;a href="#v4-incremental-install" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>v4 签名主要用于 ADB 增量安装，生成独立的 &lt;code>.idsig&lt;/code> 文件。&lt;/p>
&lt;h3 class="heading-element" id="53-重打包工具和方法">&lt;span>5.3 重打包工具和方法&lt;/span>
 &lt;a href="#53-%e9%87%8d%e6%89%93%e5%8c%85%e5%b7%a5%e5%85%b7%e5%92%8c%e6%96%b9%e6%b3%95" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 1. 反编译
apktool d -r target.apk -o target_dir/ # -r 不解码资源（加速）

# 2. 修改代码/资源
# ... 修改 smali 代码 ...

# 3. 重新打包
apktool b target_dir/ -o modified_unsigned.apk

# 4. 对齐
zipalign -v 4 modified_unsigned.apk modified_aligned.apk

# 5. 签名（支持 v1&amp;#43;v2&amp;#43;v3）
apksigner sign \
 --ks my-release-key.jks \
 --ks-key-alias my-alias \
 --v1-signing-enabled true \
 --v2-signing-enabled true \
 --v3-signing-enabled true \
 modified_aligned.apk

# 6. 验证签名
apksigner verify --verbose --print-certs modified_aligned.apk&lt;/code>&lt;/pre>&lt;p>&lt;strong>签名验证绕过注意事项&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>// 部分应用会在运行时校验签名，需要 hook 绕过
Java.perform(function() {
 // 方法 1: Hook PackageManager.getPackageInfo 替换签名
 var PackageManager = Java.use(&amp;#39;android.app.ApplicationPackageManager&amp;#39;);
 PackageManager.getPackageInfo.overload(&amp;#39;java.lang.String&amp;#39;, &amp;#39;int&amp;#39;)
 .implementation = function(packageName, flags) {
 // GET_SIGNATURES = 64, GET_SIGNING_CERTIFICATES = 0x08000000
 if ((flags &amp;amp; 64) !== 0 || (flags &amp;amp; 0x08000000) !== 0) {
 console.log(&amp;#39;[*] Signature check intercepted for: &amp;#39; &amp;#43; packageName);
 }
 return this.getPackageInfo(packageName, flags);
 };

 // 方法 2: 直接修改签名数据
 // 在内存中替换为原始签名的 byte array
});&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="6-art-运行时演进">&lt;span>6. ART 运行时演进&lt;/span>
 &lt;a href="#6-art-%e8%bf%90%e8%a1%8c%e6%97%b6%e6%bc%94%e8%bf%9b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>ART 运行时的演进直接影响了 DEX dump、方法 Hook 和代码追踪的技术路径。&lt;/p>
&lt;h3 class="heading-element" id="61-演进时间线">&lt;span>6.1 演进时间线&lt;/span>
 &lt;a href="#61-%e6%bc%94%e8%bf%9b%e6%97%b6%e9%97%b4%e7%ba%bf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>Android 4.4 Android 5.0 Android 7.0 Android 12 Android 14&amp;#43;
 │ │ │ │ │
 ▼ ▼ ▼ ▼ ▼
 Dalvik ART (AOT) ART (AOT&amp;#43;JIT) ART Mainline ART &amp;#43; 16KB
 JIT 编译 纯 AOT 编译 混合编译 模块化更新 页面适配
 dex2oat Profile-Guided 独立 APEX
 Compilation&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="62-编译模式演进">&lt;span>6.2 编译模式演进&lt;/span>
 &lt;a href="#62-%e7%bc%96%e8%af%91%e6%a8%a1%e5%bc%8f%e6%bc%94%e8%bf%9b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="dalvik-jit-android-44-及更早">&lt;span>Dalvik JIT (Android 4.4 及更早)&lt;/span>
 &lt;a href="#dalvik-jit-android-44-%e5%8f%8a%e6%9b%b4%e6%97%a9" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>DEX 字节码 → Dalvik VM 解释执行 → 热点代码 JIT 编译 → 缓存本地代码&lt;/code>&lt;/pre>&lt;ul>
&lt;li>每次启动重新解释&lt;/li>
&lt;li>JIT 编译结果不持久化&lt;/li>
&lt;/ul>
&lt;h4 class="heading-element" id="art-纯-aot-android-50-60">&lt;span>ART 纯 AOT (Android 5.0-6.0)&lt;/span>
 &lt;a href="#art-%e7%ba%af-aot-android-50-60" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>安装时: DEX → dex2oat → OAT 文件（完整 AOT 编译）
运行时: 直接执行 OAT 中的本地机器码&lt;/code>&lt;/pre>&lt;ul>
&lt;li>安装时间长（全量编译）&lt;/li>
&lt;li>占用大量存储空间&lt;/li>
&lt;li>运行性能好&lt;/li>
&lt;/ul>
&lt;h4 class="heading-element" id="art-混合编译-android-70">&lt;span>ART 混合编译 (Android 7.0+)&lt;/span>
 &lt;a href="#art-%e6%b7%b7%e5%90%88%e7%bc%96%e8%af%91-android-70" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>安装时: DEX → 仅验证（不编译或仅编译关键路径）
首次运行: 解释执行 &amp;#43; JIT 编译热点代码
 → 生成 Profile 文件（.prof）
设备空闲: Profile-Guided AOT 编译
 → 仅编译 Profile 中标记的热点方法
后续运行: 热点代码 AOT 执行 &amp;#43; 冷代码解释/JIT&lt;/code>&lt;/pre>&lt;pre>&lt;code># 查看应用的 Profile 文件
adb shell ls -la /data/misc/profiles/cur/0/com.target.app/

# 查看编译状态
adb shell cmd package compile -m speed -f com.target.app # 强制 AOT 编译
adb shell cmd package compile -m verify com.target.app # 仅验证
adb shell cmd package compile --reset com.target.app # 重置编译&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="baseline-profiles-android-12">&lt;span>Baseline Profiles (Android 12+)&lt;/span>
 &lt;a href="#baseline-profiles-android-12" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>开发者可以在 APK 中打包 Baseline Profile，指导 ART 在安装时预编译关键路径代码：&lt;/p>
&lt;pre>&lt;code>APK 中的 assets/dexopt/baseline.prof
 → 安装时 ART 读取 Profile
 → AOT 编译 Profile 中标记的方法
 → 首次启动即有优化代码可用&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="63-对逆向工程的影响">&lt;span>6.3 对逆向工程的影响&lt;/span>
 &lt;a href="#63-%e5%af%b9%e9%80%86%e5%90%91%e5%b7%a5%e7%a8%8b%e7%9a%84%e5%bd%b1%e5%93%8d" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="dex-dump-策略">&lt;span>DEX Dump 策略&lt;/span>
 &lt;a href="#dex-dump-%e7%ad%96%e7%95%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>// Frida DEX Dump (适用于所有 ART 版本)
// 原理: 从 ClassLoader 中获取 DexFile 对象，读取其内存中的 DEX 数据
Java.perform(function() {
 Java.enumerateClassLoaders({
 onMatch: function(loader) {
 try {
 var dexFiles = loader.findClass(&amp;#39;java.lang.Object&amp;#39;)
 .getClassLoader().getClass()
 .getSuperclass().getDeclaredField(&amp;#39;pathList&amp;#39;);
 dexFiles.setAccessible(true);
 // ... 遍历 DexPathList 获取 DEX 数据
 } catch(e) {}
 },
 onComplete: function() {}
 });
});&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="方法-hook-注意事项">&lt;span>方法 Hook 注意事项&lt;/span>
 &lt;a href="#%e6%96%b9%e6%b3%95-hook-%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>// Hook 时需要考虑方法的编译状态
// AOT 编译的方法: entry_point 指向 OAT 中的本地代码
// JIT 编译的方法: entry_point 指向 JIT 代码缓存
// 解释执行的方法: entry_point 指向解释器入口

// Frida 通过替换 ArtMethod 的 entry_point 实现 hook
// 这在所有编译状态下都有效
Java.perform(function() {
 var targetClass = Java.use(&amp;#39;com.target.app.Crypto&amp;#39;);
 targetClass.encrypt.implementation = function(data) {
 console.log(&amp;#39;[*] encrypt called: &amp;#39; &amp;#43; data);
 var result = this.encrypt(data);
 console.log(&amp;#39;[*] encrypt result: &amp;#39; &amp;#43; result);
 return result;
 };
});&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="64-art-内部结构关键偏移">&lt;span>6.4 ART 内部结构关键偏移&lt;/span>
 &lt;a href="#64-art-%e5%86%85%e9%83%a8%e7%bb%93%e6%9e%84%e5%85%b3%e9%94%ae%e5%81%8f%e7%a7%bb" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>不同 Android 版本的 ART 内部结构（如 &lt;code>ArtMethod&lt;/code>）偏移可能不同。编写底层 hook 工具时需要适配：&lt;/p>
&lt;pre>&lt;code>// ArtMethod 结构 (简化版, 偏移因版本而异)
struct ArtMethod {
 uint32_t declaring_class_; // GcRoot&amp;lt;Class&amp;gt;
 uint32_t access_flags_;
 uint32_t dex_code_item_offset_;
 uint32_t dex_method_index_;
 // ...
 void* entry_point_from_quick_compiled_code_; // hook 目标
 void* data_;
};&lt;/code>&lt;/pre>&lt;pre>&lt;code># 使用 Frida 获取 ArtMethod 偏移信息
# 参考 frida-java-bridge 源码中的 art.js&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="7-linker-演进与-so-加载">&lt;span>7. Linker 演进与 SO 加载&lt;/span>
 &lt;a href="#7-linker-%e6%bc%94%e8%bf%9b%e4%b8%8e-so-%e5%8a%a0%e8%bd%bd" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Android 的动态链接器 (linker/linker64) 在各版本中经历了重大变化，直接影响 SO 注入和 hook 技术。&lt;/p>
&lt;h3 class="heading-element" id="71-演进时间线">&lt;span>7.1 演进时间线&lt;/span>
 &lt;a href="#71-%e6%bc%94%e8%bf%9b%e6%97%b6%e9%97%b4%e7%ba%bf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">版本&lt;/th>
 &lt;th style="text-align: left">变化&lt;/th>
 &lt;th style="text-align: left">影响&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">Android 6.0 及更早&lt;/td>
 &lt;td style="text-align: left">全局 namespace，应用可加载任何 SO&lt;/td>
 &lt;td style="text-align: left">注入和 hook 无限制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Android 7.0&lt;/td>
 &lt;td style="text-align: left">Linker namespace 引入&lt;/td>
 &lt;td style="text-align: left">应用不能直接 &lt;code>dlopen&lt;/code> 系统私有 SO&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Android 8.0&lt;/td>
 &lt;td style="text-align: left">Treble vendor namespace&lt;/td>
 &lt;td style="text-align: left">vendor SO 与 system SO 严格隔离&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Android 10&lt;/td>
 &lt;td style="text-align: left">BionicLinker 改进&lt;/td>
 &lt;td style="text-align: left">namespace 检查更严格&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Android 12&lt;/td>
 &lt;td style="text-align: left">Linkerconfig 动态生成&lt;/td>
 &lt;td style="text-align: left">namespace 配置从静态文件变为动态生成&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Android 14+&lt;/td>
 &lt;td style="text-align: left">16KB 页面支持&lt;/td>
 &lt;td style="text-align: left">SO 加载需要适配新的页面对齐&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="72-linker-namespace-详解">&lt;span>7.2 Linker Namespace 详解&lt;/span>
 &lt;a href="#72-linker-namespace-%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────┐
│ Linker Namespace 架构 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ default (系统) │ │ classloader- │ │
│ │ namespace │ │ namespace │ │
│ ├────────────────┤ ├────────────────┤ │
│ │ libandroid.so │ │ app 的 JNI SO │ │
│ │ libc.so │ │ (lib/*.so) │ │
│ │ libm.so │ └───────┬────────┘ │
│ │ liblog.so │ │ │
│ │ ... │←──── 只能 dlopen ──────── │
│ └────────────────┘ 公开的 NDK 库 │
│ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ vendor │ │ vndk │ │
│ │ namespace │ │ namespace │ │
│ ├────────────────┤ ├────────────────┤ │
│ │ vendor HAL SO │ │ VNDK 共享库 │ │
│ │ /vendor/lib64/ │ │ /apex/vndk/ │ │
│ └────────────────┘ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="73-查看-namespace-配置">&lt;span>7.3 查看 Namespace 配置&lt;/span>
 &lt;a href="#73-%e6%9f%a5%e7%9c%8b-namespace-%e9%85%8d%e7%bd%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># Android 7.0-11: 静态配置文件
adb shell cat /system/etc/ld.config.txt

# Android 12&amp;#43;: 动态生成的配置
adb shell cat /linkerconfig/ld.config.txt

# 查看配置中的 namespace 定义
adb shell cat /linkerconfig/ld.config.txt | grep -E &amp;#34;^\[|^namespace\.&amp;#34;

# 典型输出示例:
# [system]
# namespace.default.isolated = true
# namespace.default.search.paths = /system/lib64:/apex/com.android.art/lib64
# namespace.default.permitted.paths = /system/lib64:/apex/...
# namespace.default.asan.search.paths = ...
#
# [vendor]
# namespace.default.isolated = true
# namespace.default.search.paths = /vendor/lib64&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="74-绕过-namespace-限制">&lt;span>7.4 绕过 Namespace 限制&lt;/span>
 &lt;a href="#74-%e7%bb%95%e8%bf%87-namespace-%e9%99%90%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// Frida 中绕过 namespace 限制加载系统私有 SO
// 方法 1: 使用 Process.dlopen (Frida 内部实现绕过)
var handle = Module.load(&amp;#39;/system/lib64/libinput.so&amp;#39;);
console.log(&amp;#39;[*] Loaded: &amp;#39; &amp;#43; handle);

// 方法 2: 使用 android_dlopen_ext 指定 namespace
var android_dlopen_ext = new NativeFunction(
 Module.findExportByName(&amp;#39;libdl.so&amp;#39;, &amp;#39;android_dlopen_ext&amp;#39;),
 &amp;#39;pointer&amp;#39;, [&amp;#39;pointer&amp;#39;, &amp;#39;int&amp;#39;, &amp;#39;pointer&amp;#39;]
);

// 方法 3: 通过 linker 内部函数直接操作 namespace
// 需要找到 linker 中的 do_dlopen 函数并 hook&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="75-android-14-的-16kb-页面与-so-加载">&lt;span>7.5 Android 14+ 的 16KB 页面与 SO 加载&lt;/span>
 &lt;a href="#75-android-14-%e7%9a%84-16kb-%e9%a1%b5%e9%9d%a2%e4%b8%8e-so-%e5%8a%a0%e8%bd%bd" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 在 16KB 页面设备上，linker 对段对齐有严格要求
# SO 的 LOAD 段必须按 max(p_align, page_size) 对齐

# 如果 SO 的 p_align = 0x1000 但设备 page_size = 0x4000:
# linker 会尝试 compat 模式加载（可能失败）
# 或者直接拒绝加载

# 使用 NDK r27&amp;#43; 重新编译 SO 以确保兼容:
# CMakeLists.txt 中添加:
# set(CMAKE_SHARED_LINKER_FLAGS &amp;#34;${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384&amp;#34;)&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="8-实战建议根据目标-android-版本制定分析策略">&lt;span>8. 实战建议：根据目标 Android 版本制定分析策略&lt;/span>
 &lt;a href="#8-%e5%ae%9e%e6%88%98%e5%bb%ba%e8%ae%ae%e6%a0%b9%e6%8d%ae%e7%9b%ae%e6%a0%87-android-%e7%89%88%e6%9c%ac%e5%88%b6%e5%ae%9a%e5%88%86%e6%9e%90%e7%ad%96%e7%95%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: 拿到目标 App 后，第一步看 &lt;code>minSdkVersion&lt;/code> 和 &lt;code>targetSdkVersion&lt;/code> 确定版本范围 → 根据版本选择对应的工具链和绕过方案 → 版本越高限制越多，但核心逆向方法论不变。&lt;/p>&lt;/blockquote>
&lt;h3 class="heading-element" id="81-版本识别与环境评估">&lt;span>8.1 版本识别与环境评估&lt;/span>
 &lt;a href="#81-%e7%89%88%e6%9c%ac%e8%af%86%e5%88%ab%e4%b8%8e%e7%8e%af%e5%a2%83%e8%af%84%e4%bc%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>在开始分析前，首先收集目标设备的完整信息：&lt;/p>
&lt;pre>&lt;code># 1. 基础信息收集
echo &amp;#34;=== Android 版本 ===&amp;#34;
adb shell getprop ro.build.version.release
adb shell getprop ro.build.version.sdk

echo &amp;#34;=== 安全补丁 ===&amp;#34;
adb shell getprop ro.build.version.security_patch

echo &amp;#34;=== 设备架构 ===&amp;#34;
adb shell getprop ro.product.cpu.abi

echo &amp;#34;=== SELinux 状态 ===&amp;#34;
adb shell getenforce

echo &amp;#34;=== Root 状态 ===&amp;#34;
adb shell su -c &amp;#34;id&amp;#34; 2&amp;gt;/dev/null || echo &amp;#34;未 root&amp;#34;

echo &amp;#34;=== 页面大小 ===&amp;#34;
adb shell getconf PAGE_SIZE

echo &amp;#34;=== Magisk 版本 ===&amp;#34;
adb shell su -c &amp;#34;magisk -v&amp;#34; 2&amp;gt;/dev/null || echo &amp;#34;无 Magisk&amp;#34;

echo &amp;#34;=== Kernel 版本 ===&amp;#34;
adb shell uname -r&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="82-分析策略决策流程">&lt;span>8.2 分析策略决策流程&lt;/span>
 &lt;a href="#82-%e5%88%86%e6%9e%90%e7%ad%96%e7%95%a5%e5%86%b3%e7%ad%96%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code> ┌─────────────────┐
 │ 确认 Android 版本 │
 └────────┬────────┘
 │
 ┌──────────────┼──────────────┐
 ▼ ▼ ▼
 Android 5-6 Android 7-9 Android 10&amp;#43;
 │ │ │
 ▼ ▼ ▼
 传统方案即可 需要处理: 需要处理:
 ・直接抓包 ・证书信任 ・XOM 绕过
 ・原版 Xposed ・namespace ・Scoped Storage
 ・简单重打包 ・Hidden API ・16KB 页面 (14&amp;#43;)
 ・v2 签名 ・MTE (15)
 │ │
 ▼ ▼
 工具选择: 工具选择:
 ・Frida ・Frida (最新版)
 ・LSPosed ・LSPosed &amp;#43; Zygisk
 ・Magisk ・Magisk 26&amp;#43;
 ・apktool ・apktool 2.9&amp;#43;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="83-各版本范围的推荐方案">&lt;span>8.3 各版本范围的推荐方案&lt;/span>
 &lt;a href="#83-%e5%90%84%e7%89%88%e6%9c%ac%e8%8c%83%e5%9b%b4%e7%9a%84%e6%8e%a8%e8%8d%90%e6%96%b9%e6%a1%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="android-50-60-api-21-23">&lt;span>Android 5.0-6.0 (API 21-23)&lt;/span>
 &lt;a href="#android-50-60-api-21-23" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code># 抓包: 直接安装证书即可
# 安装代理证书
adb push burp-cert.pem /sdcard/
# 设备上: 设置 → 安全 → 从存储安装证书

# Hook: Xposed 或 Frida 均可
# 安装 Xposed Framework (5.0-6.0 最后的稳定版)
# 或使用 Frida
frida -U -f com.target.app -l hook.js&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="android-70-90-api-24-28">&lt;span>Android 7.0-9.0 (API 24-28)&lt;/span>
 &lt;a href="#android-70-90-api-24-28" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code># 抓包: 需要处理证书信任
# 方案 A: 重打包添加网络安全配置
apktool d target.apk -o target_dir/
# 编辑 network_security_config.xml (信任用户证书)
apktool b target_dir/ -o modified.apk
apksigner sign --ks key.jks modified.apk

# 方案 B: Magisk &amp;#43; MoveCert 模块 (推荐)
# 安装 Magisk → 安装 MagiskTrustUserCerts 模块 → 重启

# Hook: 使用 Frida &amp;#43; LSPosed
# Hidden API 绕过 (Android 9.0):
adb shell settings put global hidden_api_policy 1&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="android-10-12-api-29-32">&lt;span>Android 10-12 (API 29-32)&lt;/span>
 &lt;a href="#android-10-12-api-29-32" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code># 抓包: Magisk &amp;#43; MoveCert (必须)
# &amp;#43; Frida SSL Pinning Bypass (如果应用使用 Certificate Pinning)

# Hook: Frida (最新版) &amp;#43; Magisk (24&amp;#43;)
# 注意 XOM: Frida 默认通过 ptrace 绕过，通常无需额外处理
# 注意 Scoped Storage: dump 文件使用应用私有目录

# 调试: 使用 Frida 而非 JDWP
# Android 12 的调试限制使 JDWP 更难用
frida -U -f com.target.app -l hook.js --no-pause&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="android-13-15-api-33-35">&lt;span>Android 13-15 (API 33-35)&lt;/span>
 &lt;a href="#android-13-15-api-33-35" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code># 抓包: Magisk &amp;#43; MoveCert &amp;#43; Frida SSL Bypass (完整方案)

# Hook: Frida 16.x &amp;#43; Magisk 26.x &amp;#43; LSPosed (Zygisk)
# 确认设备页面大小
adb shell getconf PAGE_SIZE

# 如果是 16KB 页面设备，注意:
# - 自定义 SO 注入可能因对齐问题失败
# - 使用 NDK r27&amp;#43; 编译注入用的 SO

# MTE 检查 (Android 15):
adb shell cat /proc/cpuinfo | grep -i mte
# 如果设备支持 MTE，分析内存时需要 mask 指针 tag&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="84-常见问题排查">&lt;span>8.4 常见问题排查&lt;/span>
 &lt;a href="#84-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">问题现象&lt;/th>
 &lt;th style="text-align: left">可能原因&lt;/th>
 &lt;th style="text-align: left">解决方案&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">Frida 注入后 app 闪退&lt;/td>
 &lt;td style="text-align: left">Frida 检测/SELinux&lt;/td>
 &lt;td style="text-align: left">使用 Frida 检测绕过脚本/关闭 SELinux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">抓不到 HTTPS 流量&lt;/td>
 &lt;td style="text-align: left">证书不信任 (7.0+)&lt;/td>
 &lt;td style="text-align: left">MoveCert 模块 + SSL Pinning Bypass&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">反射调用抛异常&lt;/td>
 &lt;td style="text-align: left">Hidden API 限制 (9.0+)&lt;/td>
 &lt;td style="text-align: left">双重反射绕过或 adb 设置&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">SO 无法 dlopen&lt;/td>
 &lt;td style="text-align: left">Namespace 限制 (7.0+)&lt;/td>
 &lt;td style="text-align: left">使用 Frida 的 Module.load 或修改 namespace&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">内存 dump 全零&lt;/td>
 &lt;td style="text-align: left">XOM 保护 (10+)&lt;/td>
 &lt;td style="text-align: left">使用 Frida (ptrace) 读取&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">SO 加载崩溃&lt;/td>
 &lt;td style="text-align: left">16KB 页面对齐 (14+)&lt;/td>
 &lt;td style="text-align: left">重新编译 SO 适配新对齐&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">指针地址异常&lt;/td>
 &lt;td style="text-align: left">MTE tagged pointer (15)&lt;/td>
 &lt;td style="text-align: left">mask 掉高字节的 tag bits&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">app 检测到 root&lt;/td>
 &lt;td style="text-align: left">SafetyNet/Play Integrity&lt;/td>
 &lt;td style="text-align: left">MagiskHide/Shamiko 模块&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="9-相关链接">&lt;span>9. 相关链接&lt;/span>
 &lt;a href="#9-%e7%9b%b8%e5%85%b3%e9%93%be%e6%8e%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>本站相关文档：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/art_runtime/">Android 运行时 (ART) 深度解析&lt;/a> - ART 运行时内部机制详解&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/selinux/">SELinux 安全机制&lt;/a> - SELinux 策略分析与绕过&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/so_elf_format/">Android .so 文件详解 (ELF Format)&lt;/a> - ELF 格式与 SO 分析基础&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/dex_format/">DEX 文件格式&lt;/a> - DEX 字节码格式详解&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/apk_structure/">APK 结构详解&lt;/a> - APK 文件组成与解析&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/smali_syntax/">Smali 语法参考&lt;/a> - Smali 汇编语法&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/binder_ipc/">Binder IPC 机制&lt;/a> - Android 进程间通信机制&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/arm_assembly/">ARM 汇编基础&lt;/a> - ARM/ARM64 汇编指令参考&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/advanced/magisk_lsposed_internals/">Magisk 与 LSPosed 原理&lt;/a> - Root 框架内部实现&lt;/li>
&lt;li>&lt;a href="https://overkazaf.github.io/reverse_engineering/android/04-reference/advanced/so_anti_debugging_and_obfuscation/">SO 反调试与混淆&lt;/a> - Native 层保护机制分析&lt;/li>
&lt;/ul>
&lt;p>外部资源：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://source.android.com/docs/security/bulletin" target="_blank" rel="external nofollow noopener noreferrer">Android 安全公告&lt;/a> - 官方安全更新信息&lt;/li>
&lt;li>&lt;a href="https://developer.android.com/about/versions" target="_blank" rel="external nofollow noopener noreferrer">Android 版本发行说明&lt;/a> - 各版本新特性官方文档&lt;/li>
&lt;li>&lt;a href="https://frida.re/docs/" target="_blank" rel="external nofollow noopener noreferrer">Frida 官方文档&lt;/a> - Frida 使用和 API 参考&lt;/li>
&lt;li>&lt;a href="https://github.com/topjohnwu/Magisk" target="_blank" rel="external nofollow noopener noreferrer">Magisk 官方仓库&lt;/a> - Magisk 源码与发布&lt;/li>
&lt;li>&lt;a href="https://github.com/LSPosed/LSPosed" target="_blank" rel="external nofollow noopener noreferrer">LSPosed 官方仓库&lt;/a> - LSPosed 框架&lt;/li>
&lt;/ul></description></item><item><title>eBPF 脚本集</title><link>https://overkazaf.github.io/reverse_engineering/android/01-recipes/scripts/ebpf_scripts/</link><pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/01-recipes/scripts/ebpf_scripts/</guid><description>&lt;h1 class="heading-element" id="ebpf-脚本集">&lt;span>eBPF 脚本集&lt;/span>
 &lt;a href="#ebpf-%e8%84%9a%e6%9c%ac%e9%9b%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>本文提供可直接使用的 eBPF/bpftrace 脚本，覆盖 Android 逆向工程的常见场景。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="系统调用追踪">&lt;span>系统调用追踪&lt;/span>
 &lt;a href="#%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a8%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="追踪所有系统调用">&lt;span>追踪所有系统调用&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e6%89%80%e6%9c%89%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: syscall_all.bt
// 用途: 统计目标应用的系统调用

tracepoint:raw_syscalls:sys_enter
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @syscalls[args-&amp;gt;id] = count();
}

END
{
 printf(&amp;#34;\n=== 系统调用统计 ===\n&amp;#34;);
 print(@syscalls);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪文件操作">&lt;span>追踪文件操作&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e6%96%87%e4%bb%b6%e6%93%8d%e4%bd%9c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: file_ops.bt
// 用途: 追踪文件打开、读写、关闭

tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @open_files[str(args-&amp;gt;filename)] = count();
 printf(&amp;#34;[OPEN] %s flags=%d\n&amp;#34;, str(args-&amp;gt;filename), args-&amp;gt;flags);
}

tracepoint:syscalls:sys_enter_read
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @read_count = count();
 @read_bytes = sum(args-&amp;gt;count);
}

tracepoint:syscalls:sys_enter_write
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @write_count = count();
 @write_bytes = sum(args-&amp;gt;count);
}

tracepoint:syscalls:sys_enter_close
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @close_count = count();
}

END
{
 printf(&amp;#34;\n=== 文件操作统计 ===\n&amp;#34;);
 printf(&amp;#34;打开的文件:\n&amp;#34;);
 print(@open_files);
 printf(&amp;#34;\n读取: %d 次, %d 字节\n&amp;#34;, @read_count, @read_bytes);
 printf(&amp;#34;写入: %d 次, %d 字节\n&amp;#34;, @write_count, @write_bytes);
 printf(&amp;#34;关闭: %d 次\n&amp;#34;, @close_count);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪敏感文件访问">&lt;span>追踪敏感文件访问&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e6%95%8f%e6%84%9f%e6%96%87%e4%bb%b6%e8%ae%bf%e9%97%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: sensitive_files.bt
// 用途: 监控敏感文件的访问

tracepoint:syscalls:sys_enter_openat
{
 $filename = str(args-&amp;gt;filename);

 // 检查敏感路径
 if (strcontains($filename, &amp;#34;/proc/&amp;#34;) ||
 strcontains($filename, &amp;#34;/sys/&amp;#34;) ||
 strcontains($filename, &amp;#34;/data/data/&amp;#34;) ||
 strcontains($filename, &amp;#34;passwd&amp;#34;) ||
 strcontains($filename, &amp;#34;shadow&amp;#34;) ||
 strcontains($filename, &amp;#34;.key&amp;#34;) ||
 strcontains($filename, &amp;#34;.pem&amp;#34;)) {

 printf(&amp;#34;[SENSITIVE] %s (PID:%d) opened: %s\n&amp;#34;,
 comm, pid, $filename);
 }
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="网络追踪">&lt;span>网络追踪&lt;/span>
 &lt;a href="#%e7%bd%91%e7%bb%9c%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="追踪网络连接">&lt;span>追踪网络连接&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e7%bd%91%e7%bb%9c%e8%bf%9e%e6%8e%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: network_connect.bt
// 用途: 追踪 TCP/UDP 连接

#include &amp;lt;linux/socket.h&amp;gt;
#include &amp;lt;linux/in.h&amp;gt;

tracepoint:syscalls:sys_enter_connect
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $sa = (struct sockaddr *)args-&amp;gt;uservaddr;

 if ($sa-&amp;gt;sa_family == AF_INET) {
 $sin = (struct sockaddr_in *)$sa;
 $port = ($sin-&amp;gt;sin_port &amp;gt;&amp;gt; 8) | (($sin-&amp;gt;sin_port &amp;amp; 0xff) &amp;lt;&amp;lt; 8);
 $addr = $sin-&amp;gt;sin_addr.s_addr;

 printf(&amp;#34;[CONNECT] %d.%d.%d.%d:%d\n&amp;#34;,
 $addr &amp;amp; 0xff,
 ($addr &amp;gt;&amp;gt; 8) &amp;amp; 0xff,
 ($addr &amp;gt;&amp;gt; 16) &amp;amp; 0xff,
 ($addr &amp;gt;&amp;gt; 24) &amp;amp; 0xff,
 $port);
 }
}

tracepoint:syscalls:sys_exit_connect
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34; -&amp;gt; result: %d\n&amp;#34;, args-&amp;gt;ret);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪-dns-查询">&lt;span>追踪 DNS 查询&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa-dns-%e6%9f%a5%e8%af%a2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: dns_query.bt
// 用途: 追踪 DNS 解析

uprobe:/system/lib64/libc.so:getaddrinfo
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[DNS] Resolving: %s\n&amp;#34;, str(arg0));
 @dns_queries[str(arg0)] = count();
}

uretprobe:/system/lib64/libc.so:getaddrinfo
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34; -&amp;gt; result: %d\n&amp;#34;, retval);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪-socket-数据">&lt;span>追踪 Socket 数据&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa-socket-%e6%95%b0%e6%8d%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: socket_data.bt
// 用途: 追踪 socket 发送接收的数据

tracepoint:syscalls:sys_enter_sendto
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[SEND] fd=%d len=%d\n&amp;#34;, args-&amp;gt;fd, args-&amp;gt;len);
 @send_bytes = sum(args-&amp;gt;len);
}

tracepoint:syscalls:sys_enter_recvfrom
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @recv_pending[tid] = args-&amp;gt;size;
}

tracepoint:syscalls:sys_exit_recvfrom
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; @recv_pending[tid]/
{
 $received = args-&amp;gt;ret;
 if ($received &amp;gt; 0) {
 printf(&amp;#34;[RECV] %d bytes\n&amp;#34;, $received);
 @recv_bytes = sum($received);
 }
 delete(@recv_pending[tid]);
}

END
{
 printf(&amp;#34;\n=== 网络统计 ===\n&amp;#34;);
 printf(&amp;#34;发送: %d 字节\n&amp;#34;, @send_bytes);
 printf(&amp;#34;接收: %d 字节\n&amp;#34;, @recv_bytes);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="加密函数追踪">&lt;span>加密函数追踪&lt;/span>
 &lt;a href="#%e5%8a%a0%e5%af%86%e5%87%bd%e6%95%b0%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="openssl-追踪">&lt;span>OpenSSL 追踪&lt;/span>
 &lt;a href="#openssl-%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: openssl_trace.bt
// 用途: 追踪 OpenSSL 加密操作

// EVP 加密初始化
uprobe:/system/lib64/libcrypto.so:EVP_EncryptInit_ex
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[CRYPTO] EVP_EncryptInit_ex\n&amp;#34;);
 printf(&amp;#34; ctx: %p, cipher: %p\n&amp;#34;, arg0, arg1);
 @encrypt_init = count();
}

// EVP 加密更新
uprobe:/system/lib64/libcrypto.so:EVP_EncryptUpdate
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[CRYPTO] EVP_EncryptUpdate len=%d\n&amp;#34;, arg3);
 @encrypt_bytes = sum(arg3);
}

// EVP 解密初始化
uprobe:/system/lib64/libcrypto.so:EVP_DecryptInit_ex
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[CRYPTO] EVP_DecryptInit_ex\n&amp;#34;);
 @decrypt_init = count();
}

// EVP 解密更新
uprobe:/system/lib64/libcrypto.so:EVP_DecryptUpdate
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[CRYPTO] EVP_DecryptUpdate len=%d\n&amp;#34;, arg3);
 @decrypt_bytes = sum(arg3);
}

// HMAC
uprobe:/system/lib64/libcrypto.so:HMAC
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[CRYPTO] HMAC data_len=%d\n&amp;#34;, arg3);
 @hmac_count = count();
}

// SHA256
uprobe:/system/lib64/libcrypto.so:SHA256
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[CRYPTO] SHA256 len=%d\n&amp;#34;, arg1);
 @sha256_count = count();
}

END
{
 printf(&amp;#34;\n=== 加密统计 ===\n&amp;#34;);
 printf(&amp;#34;加密初始化: %d 次, 处理: %d 字节\n&amp;#34;, @encrypt_init, @encrypt_bytes);
 printf(&amp;#34;解密初始化: %d 次, 处理: %d 字节\n&amp;#34;, @decrypt_init, @decrypt_bytes);
 printf(&amp;#34;HMAC: %d 次\n&amp;#34;, @hmac_count);
 printf(&amp;#34;SHA256: %d 次\n&amp;#34;, @sha256_count);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="aes-密钥捕获">&lt;span>AES 密钥捕获&lt;/span>
 &lt;a href="#aes-%e5%af%86%e9%92%a5%e6%8d%95%e8%8e%b7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: aes_key_capture.bt
// 用途: 捕获 AES 密钥 (仅用于安全研究)

uprobe:/system/lib64/libcrypto.so:AES_set_encrypt_key
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[AES] Setting encrypt key, bits=%d\n&amp;#34;, arg1);

 // 打印密钥的前几个字节 (仅示例)
 $key = (uint8 *)arg0;
 printf(&amp;#34; Key prefix: %02x %02x %02x %02x ...\n&amp;#34;,
 $key[0], $key[1], $key[2], $key[3]);
}

uprobe:/system/lib64/libcrypto.so:AES_set_decrypt_key
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[AES] Setting decrypt key, bits=%d\n&amp;#34;, arg1);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="反调试检测">&lt;span>反调试检测&lt;/span>
 &lt;a href="#%e5%8f%8d%e8%b0%83%e8%af%95%e6%a3%80%e6%b5%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="检测反调试行为">&lt;span>检测反调试行为&lt;/span>
 &lt;a href="#%e6%a3%80%e6%b5%8b%e5%8f%8d%e8%b0%83%e8%af%95%e8%a1%8c%e4%b8%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: anti_debug_detect.bt
// 用途: 检测应用的反调试行为

// ptrace 检测
tracepoint:syscalls:sys_enter_ptrace
{
 printf(&amp;#34;[ANTI-DEBUG] ptrace by %s (PID:%d)\n&amp;#34;, comm, pid);
 printf(&amp;#34; request: %d, pid: %d\n&amp;#34;, args-&amp;gt;request, args-&amp;gt;pid);

 if (args-&amp;gt;request == 0) { // PTRACE_TRACEME
 printf(&amp;#34; !!! PTRACE_TRACEME detected !!!\n&amp;#34;);
 }
}

// /proc/self/status 读取 (检测 TracerPid)
tracepoint:syscalls:sys_enter_openat
/strcontains(str(args-&amp;gt;filename), &amp;#34;/proc/&amp;#34;) &amp;amp;&amp;amp;
 strcontains(str(args-&amp;gt;filename), &amp;#34;/status&amp;#34;)/
{
 printf(&amp;#34;[ANTI-DEBUG] %s reading %s\n&amp;#34;, comm, str(args-&amp;gt;filename));
}

// /proc/self/maps 读取 (检测 Frida)
tracepoint:syscalls:sys_enter_openat
/strcontains(str(args-&amp;gt;filename), &amp;#34;/proc/&amp;#34;) &amp;amp;&amp;amp;
 strcontains(str(args-&amp;gt;filename), &amp;#34;/maps&amp;#34;)/
{
 printf(&amp;#34;[ANTI-DEBUG] %s reading %s\n&amp;#34;, comm, str(args-&amp;gt;filename));
}

// inotify 监控 (检测文件修改)
tracepoint:syscalls:sys_enter_inotify_add_watch
{
 printf(&amp;#34;[ANTI-DEBUG] %s adding inotify watch: %s\n&amp;#34;,
 comm, str(args-&amp;gt;pathname));
}

// prctl 调用 (可能用于 PR_SET_DUMPABLE)
tracepoint:syscalls:sys_enter_prctl
{
 printf(&amp;#34;[ANTI-DEBUG] prctl by %s option=%d\n&amp;#34;, comm, args-&amp;gt;option);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="frida-检测监控">&lt;span>Frida 检测监控&lt;/span>
 &lt;a href="#frida-%e6%a3%80%e6%b5%8b%e7%9b%91%e6%8e%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: frida_detect.bt
// 用途: 监控应用检测 Frida 的行为

// 检测 Frida 端口扫描
tracepoint:syscalls:sys_enter_connect
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $sa = (struct sockaddr *)args-&amp;gt;uservaddr;
 if ($sa-&amp;gt;sa_family == 2) {
 $sin = (struct sockaddr_in *)$sa;
 $port = ($sin-&amp;gt;sin_port &amp;gt;&amp;gt; 8) | (($sin-&amp;gt;sin_port &amp;amp; 0xff) &amp;lt;&amp;lt; 8);

 // Frida 默认端口
 if ($port == 27042 || $port == 27043) {
 printf(&amp;#34;[FRIDA-DETECT] Connecting to Frida port %d\n&amp;#34;, $port);
 }
 }
}

// 检测 Frida 相关文件访问
tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $f = str(args-&amp;gt;filename);
 if (strcontains($f, &amp;#34;frida&amp;#34;) ||
 strcontains($f, &amp;#34;gadget&amp;#34;) ||
 strcontains($f, &amp;#34;agent&amp;#34;)) {
 printf(&amp;#34;[FRIDA-DETECT] Checking file: %s\n&amp;#34;, $f);
 }
}

// 检测 /proc/self/maps 中的 Frida
kprobe:proc_pid_maps
{
 printf(&amp;#34;[FRIDA-DETECT] %s reading /proc/maps\n&amp;#34;, comm);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="进程和线程">&lt;span>进程和线程&lt;/span>
 &lt;a href="#%e8%bf%9b%e7%a8%8b%e5%92%8c%e7%ba%bf%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="进程创建追踪">&lt;span>进程创建追踪&lt;/span>
 &lt;a href="#%e8%bf%9b%e7%a8%8b%e5%88%9b%e5%bb%ba%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: process_trace.bt
// 用途: 追踪进程创建和执行

tracepoint:syscalls:sys_enter_clone
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[CLONE] %s creating child, flags=%x\n&amp;#34;, comm, args-&amp;gt;clone_flags);
}

tracepoint:syscalls:sys_enter_execve
{
 printf(&amp;#34;[EXEC] %s -&amp;gt; %s\n&amp;#34;, comm, str(args-&amp;gt;filename));
}

tracepoint:sched:sched_process_fork
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[FORK] %s (PID:%d) forked child PID:%d\n&amp;#34;,
 comm, args-&amp;gt;parent_pid, args-&amp;gt;child_pid);
}

tracepoint:sched:sched_process_exit
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[EXIT] %s (PID:%d)\n&amp;#34;, comm, pid);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="线程活动监控">&lt;span>线程活动监控&lt;/span>
 &lt;a href="#%e7%ba%bf%e7%a8%8b%e6%b4%bb%e5%8a%a8%e7%9b%91%e6%8e%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: thread_trace.bt
// 用途: 追踪线程创建和调度

tracepoint:syscalls:sys_enter_clone
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; (args-&amp;gt;clone_flags &amp;amp; 0x10000)/ // CLONE_THREAD
{
 printf(&amp;#34;[THREAD] Creating new thread\n&amp;#34;);
 @thread_create = count();
}

tracepoint:sched:sched_switch
/prev_comm == &amp;#34;com.target.app&amp;#34; || next_comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[SWITCH] %s -&amp;gt; %s\n&amp;#34;, prev_comm, next_comm);
}

// 追踪互斥锁
uprobe:/apex/com.android.runtime/lib64/bionic/libc.so:pthread_mutex_lock
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @mutex_lock[arg0] = nsecs;
}

uretprobe:/apex/com.android.runtime/lib64/bionic/libc.so:pthread_mutex_lock
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; @mutex_lock[arg0]/
{
 $wait = nsecs - @mutex_lock[arg0];
 @mutex_wait = hist($wait);
 delete(@mutex_lock[arg0]);
}

END
{
 printf(&amp;#34;\n=== 线程统计 ===\n&amp;#34;);
 printf(&amp;#34;线程创建: %d\n&amp;#34;, @thread_create);
 printf(&amp;#34;互斥锁等待时间分布:\n&amp;#34;);
 print(@mutex_wait);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="jni-和-art">&lt;span>JNI 和 ART&lt;/span>
 &lt;a href="#jni-%e5%92%8c-art" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="jni-调用追踪">&lt;span>JNI 调用追踪&lt;/span>
 &lt;a href="#jni-%e8%b0%83%e7%94%a8%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: jni_trace.bt
// 用途: 追踪 JNI 函数调用

// FindClass
uprobe:/apex/com.android.art/lib64/libart.so:*FindClass*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JNI] FindClass\n&amp;#34;);
 @jni_findclass = count();
}

// GetMethodID
uprobe:/apex/com.android.art/lib64/libart.so:*GetMethodID*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JNI] GetMethodID\n&amp;#34;);
 @jni_getmethod = count();
}

// CallObjectMethod
uprobe:/apex/com.android.art/lib64/libart.so:*CallObjectMethod*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JNI] CallObjectMethod\n&amp;#34;);
 @jni_call = count();
}

// RegisterNatives
uprobe:/apex/com.android.art/lib64/libart.so:*RegisterNatives*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JNI] RegisterNatives\n&amp;#34;);
 @jni_register = count();
}

END
{
 printf(&amp;#34;\n=== JNI 统计 ===\n&amp;#34;);
 printf(&amp;#34;FindClass: %d\n&amp;#34;, @jni_findclass);
 printf(&amp;#34;GetMethodID: %d\n&amp;#34;, @jni_getmethod);
 printf(&amp;#34;CallObjectMethod: %d\n&amp;#34;, @jni_call);
 printf(&amp;#34;RegisterNatives: %d\n&amp;#34;, @jni_register);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="art-方法编译追踪">&lt;span>ART 方法编译追踪&lt;/span>
 &lt;a href="#art-%e6%96%b9%e6%b3%95%e7%bc%96%e8%af%91%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: art_compile.bt
// 用途: 追踪 ART JIT 编译

uprobe:/apex/com.android.art/lib64/libart.so:*JitCompile*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JIT] Method compiled\n&amp;#34;);
 @jit_compile = count();
}

uprobe:/apex/com.android.art/lib64/libart.so:*CompileMethod*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @compile_method = count();
}

END
{
 printf(&amp;#34;\n=== ART JIT 统计 ===\n&amp;#34;);
 printf(&amp;#34;JIT 编译: %d\n&amp;#34;, @jit_compile);
 printf(&amp;#34;方法编译: %d\n&amp;#34;, @compile_method);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="内存追踪">&lt;span>内存追踪&lt;/span>
 &lt;a href="#%e5%86%85%e5%ad%98%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="内存分配追踪">&lt;span>内存分配追踪&lt;/span>
 &lt;a href="#%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: memory_alloc.bt
// 用途: 追踪内存分配

uprobe:/apex/com.android.runtime/lib64/bionic/libc.so:malloc
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @malloc_size = hist(arg0);
 @malloc_total = sum(arg0);
 @malloc_count = count();
}

uretprobe:/apex/com.android.runtime/lib64/bionic/libc.so:malloc
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @malloc_ptrs[retval] = nsecs;
}

uprobe:/apex/com.android.runtime/lib64/bionic/libc.so:free
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; @malloc_ptrs[arg0]/
{
 $lifetime = nsecs - @malloc_ptrs[arg0];
 @mem_lifetime = hist($lifetime);
 delete(@malloc_ptrs[arg0]);
 @free_count = count();
}

uprobe:/apex/com.android.runtime/lib64/bionic/libc.so:realloc
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[REALLOC] ptr=%p new_size=%zu\n&amp;#34;, arg0, arg1);
 @realloc_count = count();
}

END
{
 printf(&amp;#34;\n=== 内存分配统计 ===\n&amp;#34;);
 printf(&amp;#34;malloc 次数: %d, 总量: %d 字节\n&amp;#34;, @malloc_count, @malloc_total);
 printf(&amp;#34;free 次数: %d\n&amp;#34;, @free_count);
 printf(&amp;#34;realloc 次数: %d\n&amp;#34;, @realloc_count);
 printf(&amp;#34;\nmalloc 大小分布:\n&amp;#34;);
 print(@malloc_size);
 printf(&amp;#34;\n内存生命周期分布 (ns):\n&amp;#34;);
 print(@mem_lifetime);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="mmap-追踪">&lt;span>mmap 追踪&lt;/span>
 &lt;a href="#mmap-%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: mmap_trace.bt
// 用途: 追踪内存映射

tracepoint:syscalls:sys_enter_mmap
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[MMAP] addr=%p len=%zu prot=%x flags=%x fd=%d offset=%lu\n&amp;#34;,
 args-&amp;gt;addr, args-&amp;gt;len, args-&amp;gt;prot, args-&amp;gt;flags,
 args-&amp;gt;fd, args-&amp;gt;off);

 @mmap_total = sum(args-&amp;gt;len);
 @mmap_count = count();

 // 记录可执行映射
 if (args-&amp;gt;prot &amp;amp; 4) { // PROT_EXEC
 @exec_mmap = count();
 printf(&amp;#34; !!! EXECUTABLE MAPPING !!!\n&amp;#34;);
 }
}

tracepoint:syscalls:sys_enter_munmap
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[MUNMAP] addr=%p len=%zu\n&amp;#34;, args-&amp;gt;addr, args-&amp;gt;len);
 @munmap_count = count();
}

tracepoint:syscalls:sys_enter_mprotect
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[MPROTECT] addr=%p len=%zu prot=%x\n&amp;#34;,
 args-&amp;gt;start, args-&amp;gt;len, args-&amp;gt;prot);

 if (args-&amp;gt;prot &amp;amp; 4) { // PROT_EXEC
 printf(&amp;#34; !!! MAKING EXECUTABLE !!!\n&amp;#34;);
 }
}

END
{
 printf(&amp;#34;\n=== mmap 统计 ===\n&amp;#34;);
 printf(&amp;#34;mmap: %d 次, 总量: %d 字节\n&amp;#34;, @mmap_count, @mmap_total);
 printf(&amp;#34;munmap: %d 次\n&amp;#34;, @munmap_count);
 printf(&amp;#34;可执行映射: %d 次\n&amp;#34;, @exec_mmap);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="性能分析">&lt;span>性能分析&lt;/span>
 &lt;a href="#%e6%80%a7%e8%83%bd%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="函数耗时统计">&lt;span>函数耗时统计&lt;/span>
 &lt;a href="#%e5%87%bd%e6%95%b0%e8%80%97%e6%97%b6%e7%bb%9f%e8%ae%a1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: func_latency.bt
// 用途: 统计关键函数耗时
// 使用: 修改目标函数路径

uprobe:/data/app/com.target.app-*/lib/arm64/libnative.so:target_function
{
 @start[tid] = nsecs;
}

uretprobe:/data/app/com.target.app-*/lib/arm64/libnative.so:target_function
/@start[tid]/
{
 $latency = nsecs - @start[tid];
 @latency_ns = hist($latency);
 @total_time = sum($latency);
 @call_count = count();
 delete(@start[tid]);
}

END
{
 printf(&amp;#34;\n=== 函数耗时统计 ===\n&amp;#34;);
 printf(&amp;#34;调用次数: %d\n&amp;#34;, @call_count);
 printf(&amp;#34;总耗时: %d ns\n&amp;#34;, @total_time);
 printf(&amp;#34;耗时分布:\n&amp;#34;);
 print(@latency_ns);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="cpu-采样">&lt;span>CPU 采样&lt;/span>
 &lt;a href="#cpu-%e9%87%87%e6%a0%b7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: cpu_profile.bt
// 用途: CPU 热点采样

profile:hz:99
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @cpu_samples[ustack] = count();
}

END
{
 printf(&amp;#34;\n=== CPU 热点 (Top 10) ===\n&amp;#34;);
 print(@cpu_samples, 10);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="实用工具函数">&lt;span>实用工具函数&lt;/span>
 &lt;a href="#%e5%ae%9e%e7%94%a8%e5%b7%a5%e5%85%b7%e5%87%bd%e6%95%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="进程过滤模板">&lt;span>进程过滤模板&lt;/span>
 &lt;a href="#%e8%bf%9b%e7%a8%8b%e8%bf%87%e6%bb%a4%e6%a8%a1%e6%9d%bf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: filter_template.bt
// 用途: 进程过滤模板

// 方法1: 按进程名过滤
/comm == &amp;#34;com.target.app&amp;#34;/

// 方法2: 按 PID 过滤
/pid == $1/ // bpftrace script.bt 12345

// 方法3: 按 UID 过滤
/uid == 10123/

// 方法4: 按 cgroup 过滤 (容器)
/cgroup == &amp;#34;docker/xxx&amp;#34;/

// 方法5: 排除特定进程
/comm != &amp;#34;logd&amp;#34; &amp;amp;&amp;amp; comm != &amp;#34;servicemanager&amp;#34;/&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="输出格式化">&lt;span>输出格式化&lt;/span>
 &lt;a href="#%e8%be%93%e5%87%ba%e6%a0%bc%e5%bc%8f%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: output_format.bt
// 用途: 输出格式化示例

BEGIN
{
 printf(&amp;#34;%-20s %-10s %-10s %s\n&amp;#34;,
 &amp;#34;TIME&amp;#34;, &amp;#34;PID&amp;#34;, &amp;#34;COMM&amp;#34;, &amp;#34;ACTION&amp;#34;);
 printf(&amp;#34;%-20s %-10s %-10s %s\n&amp;#34;,
 &amp;#34;----&amp;#34;, &amp;#34;---&amp;#34;, &amp;#34;----&amp;#34;, &amp;#34;------&amp;#34;);
}

tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $ts = nsecs / 1000000000;
 printf(&amp;#34;%-20llu %-10d %-10s OPEN: %s\n&amp;#34;,
 $ts, pid, comm, str(args-&amp;gt;filename));
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="运行说明">&lt;span>运行说明&lt;/span>
 &lt;a href="#%e8%bf%90%e8%a1%8c%e8%af%b4%e6%98%8e" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="基本用法">&lt;span>基本用法&lt;/span>
 &lt;a href="#%e5%9f%ba%e6%9c%ac%e7%94%a8%e6%b3%95" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 运行脚本
adb shell /data/local/tmp/bpftrace /path/to/script.bt

# 带参数运行
adb shell /data/local/tmp/bpftrace /path/to/script.bt 12345

# 单行命令
adb shell /data/local/tmp/bpftrace -e &amp;#39;tracepoint:syscalls:sys_enter_* { @[probe] = count(); }&amp;#39;

# 输出到文件
adb shell /data/local/tmp/bpftrace /path/to/script.bt &amp;gt; output.txt 2&amp;gt;&amp;amp;1&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="权限设置">&lt;span>权限设置&lt;/span>
 &lt;a href="#%e6%9d%83%e9%99%90%e8%ae%be%e7%bd%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 确保 root 权限
adb root

# 禁用 SELinux (临时)
adb shell setenforce 0

# 检查 bpf 文件系统
adb shell mount | grep bpf&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="常见问题">&lt;span>常见问题&lt;/span>
 &lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>&amp;ldquo;Failed to attach&amp;rdquo;&lt;/strong>: 检查函数名是否正确，使用 &lt;code>nm&lt;/code> 或 &lt;code>readelf&lt;/code> 确认&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Permission denied&amp;rdquo;&lt;/strong>: 需要 root 权限和 SELinux 设置&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;不支持的内核版本&amp;rdquo;&lt;/strong>: 需要 4.14+ 内核&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 class="heading-element" id="参考资料">&lt;span>参考资料&lt;/span>
 &lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md" target="_blank" rel="external nofollow noopener noreferrer">bpftrace Reference Guide&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/iovisor/bpftrace/blob/master/docs/tutorial_one_liners.md" target="_blank" rel="external nofollow noopener noreferrer">bpftrace One-Liners&lt;/a>&lt;/li>
&lt;li>&lt;a href="../../02-Tools/Dynamic/ebpf_guide.md">eBPF 使用指南&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>eBPF 使用指南</title><link>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/ebpf_guide/</link><pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/ebpf_guide/</guid><description>&lt;h1 class="heading-element" id="ebpf-使用指南">&lt;span>eBPF 使用指南&lt;/span>
 &lt;a href="#ebpf-%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>eBPF (extended Berkeley Packet Filter) 是 Linux 内核中的一项革命性技术，允许在内核空间运行沙盒程序而无需修改内核代码。在 Android 逆向工程中，eBPF 提供了比 Frida 更底层、更隐蔽的追踪能力。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="为什么选择-ebpf">&lt;span>为什么选择 eBPF&lt;/span>
 &lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%89%e6%8b%a9-ebpf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="与其他工具对比">&lt;span>与其他工具对比&lt;/span>
 &lt;a href="#%e4%b8%8e%e5%85%b6%e4%bb%96%e5%b7%a5%e5%85%b7%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>eBPF&lt;/th>
 &lt;th>Frida&lt;/th>
 &lt;th>Xposed&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>检测难度&lt;/td>
 &lt;td>极难&lt;/td>
 &lt;td>中等&lt;/td>
 &lt;td>容易&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>内核级追踪&lt;/td>
 &lt;td>原生支持&lt;/td>
 &lt;td>不支持&lt;/td>
 &lt;td>不支持&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>性能开销&lt;/td>
 &lt;td>极低&lt;/td>
 &lt;td>中等&lt;/td>
 &lt;td>中等&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>系统调用追踪&lt;/td>
 &lt;td>原生支持&lt;/td>
 &lt;td>需要额外实现&lt;/td>
 &lt;td>不支持&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>网络包捕获&lt;/td>
 &lt;td>原生支持&lt;/td>
 &lt;td>不支持&lt;/td>
 &lt;td>不支持&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Root 需求&lt;/td>
 &lt;td>是&lt;/td>
 &lt;td>是&lt;/td>
 &lt;td>是&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Android 支持&lt;/td>
 &lt;td>4.14+ 内核&lt;/td>
 &lt;td>广泛&lt;/td>
 &lt;td>广泛&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="ebpf-的优势">&lt;span>eBPF 的优势&lt;/span>
 &lt;a href="#ebpf-%e7%9a%84%e4%bc%98%e5%8a%bf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>隐蔽性&lt;/strong>: 运行在内核空间，应用层检测极其困难&lt;/li>
&lt;li>&lt;strong>性能&lt;/strong>: JIT 编译，接近原生性能&lt;/li>
&lt;li>&lt;strong>安全性&lt;/strong>: 内核验证器确保程序安全&lt;/li>
&lt;li>&lt;strong>全面性&lt;/strong>: 可追踪系统调用、网络、文件系统等各个层面&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 class="heading-element" id="环境准备">&lt;span>环境准备&lt;/span>
 &lt;a href="#%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="检查内核支持">&lt;span>检查内核支持&lt;/span>
 &lt;a href="#%e6%a3%80%e6%9f%a5%e5%86%85%e6%a0%b8%e6%94%af%e6%8c%81" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 检查内核版本（需要 4.14&amp;#43;）
adb shell uname -r

# 检查 eBPF 支持
adb shell ls /sys/fs/bpf/

# 检查 CONFIG_BPF 相关配置
adb shell zcat /proc/config.gz | grep -i bpf&lt;/code>&lt;/pre>&lt;p>需要确认以下内核配置启用:&lt;/p>
&lt;pre>&lt;code>CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="安装-bpftrace-推荐">&lt;span>安装 bpftrace (推荐)&lt;/span>
 &lt;a href="#%e5%ae%89%e8%a3%85-bpftrace-%e6%8e%a8%e8%8d%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>bpftrace 是 eBPF 的高级追踪语言，类似于 awk 和 DTrace。&lt;/p>
&lt;p>&lt;strong>在 Android 上安装:&lt;/strong>&lt;/p>
&lt;pre>&lt;code># 下载预编译的 bpftrace (需要 root)
# https://github.com/aspect-build/bpftrace-android

# 推送到设备
adb push bpftrace /data/local/tmp/
adb shell chmod &amp;#43;x /data/local/tmp/bpftrace

# 测试运行
adb shell /data/local/tmp/bpftrace -e &amp;#39;BEGIN { printf(&amp;#34;eBPF works!\n&amp;#34;); }&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="安装-bcc-工具集">&lt;span>安装 BCC 工具集&lt;/span>
 &lt;a href="#%e5%ae%89%e8%a3%85-bcc-%e5%b7%a5%e5%85%b7%e9%9b%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>BCC (BPF Compiler Collection) 提供了丰富的预置追踪工具。&lt;/p>
&lt;pre>&lt;code># 交叉编译 BCC for Android
# 或使用预编译版本

# 常用工具
# - opensnoop: 追踪文件打开
# - execsnoop: 追踪进程执行
# - tcpconnect: 追踪 TCP 连接
# - trace: 通用函数追踪&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="快速入门">&lt;span>快速入门&lt;/span>
 &lt;a href="#%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="hello-world">&lt;span>Hello World&lt;/span>
 &lt;a href="#hello-world" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 最简单的 bpftrace 脚本
adb shell /data/local/tmp/bpftrace -e &amp;#39;
BEGIN {
 printf(&amp;#34;开始追踪...\n&amp;#34;);
}

END {
 printf(&amp;#34;追踪结束\n&amp;#34;);
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪系统调用">&lt;span>追踪系统调用&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 追踪特定应用的所有系统调用
adb shell /data/local/tmp/bpftrace -e &amp;#39;
tracepoint:raw_syscalls:sys_enter
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @syscalls[args-&amp;gt;id] = count();
}

END {
 print(@syscalls);
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪文件操作">&lt;span>追踪文件操作&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e6%96%87%e4%bb%b6%e6%93%8d%e4%bd%9c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 追踪文件打开操作
adb shell /data/local/tmp/bpftrace -e &amp;#39;
tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;%s opened: %s\n&amp;#34;, comm, str(args-&amp;gt;filename));
}&amp;#39;&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="核心概念">&lt;span>核心概念&lt;/span>
 &lt;a href="#%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="程序类型">&lt;span>程序类型&lt;/span>
 &lt;a href="#%e7%a8%8b%e5%ba%8f%e7%b1%bb%e5%9e%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>eBPF 支持多种程序类型:&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>类型&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;th>Android 逆向场景&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>kprobe/kretprobe&lt;/td>
 &lt;td>内核函数追踪&lt;/td>
 &lt;td>追踪内核行为&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>uprobe/uretprobe&lt;/td>
 &lt;td>用户态函数追踪&lt;/td>
 &lt;td>追踪应用函数&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>tracepoint&lt;/td>
 &lt;td>内核静态追踪点&lt;/td>
 &lt;td>系统调用追踪&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>socket_filter&lt;/td>
 &lt;td>网络包过滤&lt;/td>
 &lt;td>网络流量分析&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>xdp&lt;/td>
 &lt;td>高性能网络处理&lt;/td>
 &lt;td>网络数据包分析&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="maps-数据结构">&lt;span>Maps 数据结构&lt;/span>
 &lt;a href="#maps-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>eBPF Maps 用于在内核和用户空间之间共享数据:&lt;/p>
&lt;pre>&lt;code>// 常用 Map 类型
BPF_HASH(counts, u32); // 哈希表
BPF_ARRAY(data, u64, 256); // 数组
BPF_PERF_OUTPUT(events); // 性能事件输出
BPF_STACK_TRACE(stacks, 128); // 调用栈追踪&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="辅助函数">&lt;span>辅助函数&lt;/span>
 &lt;a href="#%e8%be%85%e5%8a%a9%e5%87%bd%e6%95%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 常用 eBPF 辅助函数
bpf_get_current_pid_tgid() // 获取进程/线程 ID
bpf_get_current_comm() // 获取进程名
bpf_probe_read() // 安全读取内存
bpf_ktime_get_ns() // 获取时间戳
bpf_trace_printk() // 调试输出&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="实战场景">&lt;span>实战场景&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e5%9c%ba%e6%99%af" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: eBPF 的核心优势是「内核级无感知监控」— 在内核中插入探针，应用层完全无法检测到，适合对抗强反调试/反 hook 的场景。&lt;/p>&lt;/blockquote>
&lt;h3 class="heading-element" id="场景1-追踪加密函数调用">&lt;span>场景1: 追踪加密函数调用&lt;/span>
 &lt;a href="#%e5%9c%ba%e6%99%af1-%e8%bf%bd%e8%b8%aa%e5%8a%a0%e5%af%86%e5%87%bd%e6%95%b0%e8%b0%83%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>追踪应用调用的 OpenSSL 加密函数:&lt;/p>
&lt;pre>&lt;code>adb shell /data/local/tmp/bpftrace -e &amp;#39;
uprobe:/system/lib64/libcrypto.so:EVP_EncryptInit_ex
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[%d] EVP_EncryptInit_ex called\n&amp;#34;, pid);
 printf(&amp;#34; ctx: %p\n&amp;#34;, arg0);
 printf(&amp;#34; type: %p\n&amp;#34;, arg1);
}

uprobe:/system/lib64/libcrypto.so:EVP_EncryptUpdate
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[%d] EVP_EncryptUpdate\n&amp;#34;, pid);
 printf(&amp;#34; input len: %d\n&amp;#34;, arg3);
}
&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="场景2-监控网络连接">&lt;span>场景2: 监控网络连接&lt;/span>
 &lt;a href="#%e5%9c%ba%e6%99%af2-%e7%9b%91%e6%8e%a7%e7%bd%91%e7%bb%9c%e8%bf%9e%e6%8e%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>adb shell /data/local/tmp/bpftrace -e &amp;#39;
tracepoint:syscalls:sys_enter_connect
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $sa = (struct sockaddr *)args-&amp;gt;uservaddr;
 if ($sa-&amp;gt;sa_family == 2) { // AF_INET
 $sin = (struct sockaddr_in *)$sa;
 printf(&amp;#34;Connect to %s:%d\n&amp;#34;,
 ntop(AF_INET, $sin-&amp;gt;sin_addr.s_addr),
 ntohs($sin-&amp;gt;sin_port));
 }
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="场景3-文件访问监控">&lt;span>场景3: 文件访问监控&lt;/span>
 &lt;a href="#%e5%9c%ba%e6%99%af3-%e6%96%87%e4%bb%b6%e8%ae%bf%e9%97%ae%e7%9b%91%e6%8e%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>adb shell /data/local/tmp/bpftrace -e &amp;#39;
tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @files[str(args-&amp;gt;filename)] = count();
}

tracepoint:syscalls:sys_enter_read
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @read_bytes = sum(args-&amp;gt;count);
}

tracepoint:syscalls:sys_enter_write
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @write_bytes = sum(args-&amp;gt;count);
}

END {
 printf(&amp;#34;\n=== 文件访问统计 ===\n&amp;#34;);
 print(@files);
 printf(&amp;#34;\n读取字节: %d\n&amp;#34;, @read_bytes);
 printf(&amp;#34;写入字节: %d\n&amp;#34;, @write_bytes);
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="场景4-jni-调用追踪">&lt;span>场景4: JNI 调用追踪&lt;/span>
 &lt;a href="#%e5%9c%ba%e6%99%af4-jni-%e8%b0%83%e7%94%a8%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 追踪 JNI 函数调用
adb shell /data/local/tmp/bpftrace -e &amp;#39;
uprobe:/system/lib64/libart.so:*JNI*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JNI] %s\n&amp;#34;, probe);
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="场景5-检测反调试行为">&lt;span>场景5: 检测反调试行为&lt;/span>
 &lt;a href="#%e5%9c%ba%e6%99%af5-%e6%a3%80%e6%b5%8b%e5%8f%8d%e8%b0%83%e8%af%95%e8%a1%8c%e4%b8%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 监控常见的反调试系统调用
adb shell /data/local/tmp/bpftrace -e &amp;#39;
tracepoint:syscalls:sys_enter_ptrace
{
 printf(&amp;#34;[Anti-Debug] ptrace called by %s (PID: %d)\n&amp;#34;, comm, pid);
 printf(&amp;#34; request: %d\n&amp;#34;, args-&amp;gt;request);
}

tracepoint:syscalls:sys_enter_prctl
{
 printf(&amp;#34;[Anti-Debug] prctl called by %s\n&amp;#34;, comm);
 printf(&amp;#34; option: %d\n&amp;#34;, args-&amp;gt;option);
}

kprobe:proc_pid_status
{
 printf(&amp;#34;[Anti-Debug] /proc/pid/status read by %s\n&amp;#34;, comm);
}&amp;#39;&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="高级技巧">&lt;span>高级技巧&lt;/span>
 &lt;a href="#%e9%ab%98%e7%ba%a7%e6%8a%80%e5%b7%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="1-条件过滤">&lt;span>1. 条件过滤&lt;/span>
 &lt;a href="#1-%e6%9d%a1%e4%bb%b6%e8%bf%87%e6%bb%a4" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 只追踪特定 UID 的进程
adb shell /data/local/tmp/bpftrace -e &amp;#39;
tracepoint:syscalls:sys_enter_*
/uid == 10123/ // 目标应用的 UID
{
 @syscalls[probe] = count();
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="2-调用栈追踪">&lt;span>2. 调用栈追踪&lt;/span>
 &lt;a href="#2-%e8%b0%83%e7%94%a8%e6%a0%88%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 获取完整调用栈
adb shell /data/local/tmp/bpftrace -e &amp;#39;
uprobe:/data/app/com.target.app-*/lib/arm64/libnative.so:suspicious_function
{
 printf(&amp;#34;Function called!\n&amp;#34;);
 printf(&amp;#34;User stack:\n%s\n&amp;#34;, ustack);
 printf(&amp;#34;Kernel stack:\n%s\n&amp;#34;, kstack);
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="3-时间统计">&lt;span>3. 时间统计&lt;/span>
 &lt;a href="#3-%e6%97%b6%e9%97%b4%e7%bb%9f%e8%ae%a1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 统计函数执行时间
adb shell /data/local/tmp/bpftrace -e &amp;#39;
uprobe:/data/app/com.target.app-*/lib/arm64/libnative.so:target_function
{
 @start[tid] = nsecs;
}

uretprobe:/data/app/com.target.app-*/lib/arm64/libnative.so:target_function
/@start[tid]/
{
 $duration = nsecs - @start[tid];
 @time = hist($duration);
 delete(@start[tid]);
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="4-内存访问追踪">&lt;span>4. 内存访问追踪&lt;/span>
 &lt;a href="#4-%e5%86%85%e5%ad%98%e8%ae%bf%e9%97%ae%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 追踪内存分配
adb shell /data/local/tmp/bpftrace -e &amp;#39;
uprobe:/apex/com.android.runtime/lib64/bionic/libc.so:malloc
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @malloc_size = hist(arg0);
 @total_alloc = sum(arg0);
}

uretprobe:/apex/com.android.runtime/lib64/bionic/libc.so:malloc
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;malloc returned: %p\n&amp;#34;, retval);
}&amp;#39;&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="bcc-python-脚本">&lt;span>BCC Python 脚本&lt;/span>
 &lt;a href="#bcc-python-%e8%84%9a%e6%9c%ac" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>对于更复杂的追踪需求，可以使用 BCC Python API:&lt;/p>
&lt;pre>&lt;code>#!/usr/bin/env python3
from bcc import BPF

# eBPF 程序
prog = &amp;#34;&amp;#34;&amp;#34;
#include &amp;lt;uapi/linux/ptrace.h&amp;gt;
#include &amp;lt;linux/sched.h&amp;gt;

struct data_t {
 u32 pid;
 u64 ts;
 char comm[TASK_COMM_LEN];
 char filename[256];
};

BPF_PERF_OUTPUT(events);

int trace_openat(struct pt_regs *ctx, int dfd, const char __user *filename) {
 struct data_t data = {};

 data.pid = bpf_get_current_pid_tgid() &amp;gt;&amp;gt; 32;
 data.ts = bpf_ktime_get_ns();
 bpf_get_current_comm(&amp;amp;data.comm, sizeof(data.comm));
 bpf_probe_read_user_str(&amp;amp;data.filename, sizeof(data.filename), filename);

 events.perf_submit(ctx, &amp;amp;data, sizeof(data));
 return 0;
}
&amp;#34;&amp;#34;&amp;#34;

# 加载 BPF 程序
b = BPF(text=prog)
b.attach_kprobe(event=&amp;#34;do_sys_openat2&amp;#34;, fn_name=&amp;#34;trace_openat&amp;#34;)

# 处理事件
def print_event(cpu, data, size):
 event = b[&amp;#34;events&amp;#34;].event(data)
 print(f&amp;#34;[{event.pid}] {event.comm.decode()}: {event.filename.decode()}&amp;#34;)

b[&amp;#34;events&amp;#34;].open_perf_buffer(print_event)

print(&amp;#34;Tracing file opens... Ctrl&amp;#43;C to exit&amp;#34;)
while True:
 try:
 b.perf_buffer_poll()
 except KeyboardInterrupt:
 break&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="常见问题">&lt;span>常见问题&lt;/span>
 &lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="q-android-设备不支持-ebpf">&lt;span>Q: Android 设备不支持 eBPF？&lt;/span>
 &lt;a href="#q-android-%e8%ae%be%e5%a4%87%e4%b8%8d%e6%94%af%e6%8c%81-ebpf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>检查内核版本和配置:&lt;/p>
&lt;pre>&lt;code># 内核版本需要 &amp;gt;= 4.14
adb shell uname -r

# 部分厂商可能禁用了 BPF
adb shell zcat /proc/config.gz | grep BPF&lt;/code>&lt;/pre>&lt;p>解决方案:&lt;/p>
&lt;ol>
&lt;li>使用自定义内核 (如 LineageOS)&lt;/li>
&lt;li>使用 Android 模拟器 (支持更好)&lt;/li>
&lt;li>使用特定的 Root 方案&lt;/li>
&lt;/ol>
&lt;h3 class="heading-element" id="q-bpftrace-报错-failed-to-attach">&lt;span>Q: bpftrace 报错 &amp;ldquo;Failed to attach&amp;rdquo;？&lt;/span>
 &lt;a href="#q-bpftrace-%e6%8a%a5%e9%94%99-failed-to-attach" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 检查 SELinux 状态
adb shell getenforce

# 临时禁用 (需要 root)
adb shell setenforce 0

# 检查内核符号
adb shell cat /proc/kallsyms | head&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="q-如何追踪特定应用">&lt;span>Q: 如何追踪特定应用？&lt;/span>
 &lt;a href="#q-%e5%a6%82%e4%bd%95%e8%bf%bd%e8%b8%aa%e7%89%b9%e5%ae%9a%e5%ba%94%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 方法1: 使用进程名
/comm == &amp;#34;com.target.app&amp;#34;/

# 方法2: 使用 PID
/pid == 12345/

# 方法3: 使用 UID
/uid == 10123/

# 获取应用 UID
adb shell dumpsys package com.target.app | grep userId&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="工具推荐">&lt;span>工具推荐&lt;/span>
 &lt;a href="#%e5%b7%a5%e5%85%b7%e6%8e%a8%e8%8d%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="1-bpftrace">&lt;span>1. bpftrace&lt;/span>
 &lt;a href="#1-bpftrace" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>官网: &lt;a href="https://github.com/iovisor/bpftrace" target="_blank" rel="external nofollow noopener noreferrer">https://github.com/iovisor/bpftrace&lt;/a>&lt;/li>
&lt;li>Android 版: &lt;a href="https://github.com/aspect-build/bpftrace-android" target="_blank" rel="external nofollow noopener noreferrer">https://github.com/aspect-build/bpftrace-android&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="2-bcc">&lt;span>2. BCC&lt;/span>
 &lt;a href="#2-bcc" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>官网: &lt;a href="https://github.com/iovisor/bcc" target="_blank" rel="external nofollow noopener noreferrer">https://github.com/iovisor/bcc&lt;/a>&lt;/li>
&lt;li>文档: &lt;a href="https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md" target="_blank" rel="external nofollow noopener noreferrer">https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="3-libbpf">&lt;span>3. libbpf&lt;/span>
 &lt;a href="#3-libbpf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>官网: &lt;a href="https://github.com/libbpf/libbpf" target="_blank" rel="external nofollow noopener noreferrer">https://github.com/libbpf/libbpf&lt;/a>&lt;/li>
&lt;li>CO-RE (一次编译，到处运行)&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="4-ecapture">&lt;span>4. eCapture&lt;/span>
 &lt;a href="#4-ecapture" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>官网: &lt;a href="https://github.com/gojue/ecapture" target="_blank" rel="external nofollow noopener noreferrer">https://github.com/gojue/ecapture&lt;/a>&lt;/li>
&lt;li>无需 CA 证书的 HTTPS 抓包工具&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="5-tracee">&lt;span>5. Tracee&lt;/span>
 &lt;a href="#5-tracee" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>官网: &lt;a href="https://github.com/aquasecurity/tracee" target="_blank" rel="external nofollow noopener noreferrer">https://github.com/aquasecurity/tracee&lt;/a>&lt;/li>
&lt;li>安全事件追踪工具&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="延伸阅读">&lt;span>延伸阅读&lt;/span>
 &lt;a href="#%e5%bb%b6%e4%bc%b8%e9%98%85%e8%af%bb" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="./ebpf_internals.md">eBPF 内部原理&lt;/a> - 深入理解 eBPF 工作机制&lt;/li>
&lt;li>&lt;a href="../../01-Recipes/Analysis/ebpf_android_reversing.md">eBPF Android 逆向实战&lt;/a> - Android 逆向场景实战&lt;/li>
&lt;li>&lt;a href="../../01-Recipes/Scripts/ebpf_scripts.md">eBPF 脚本集&lt;/a> - 可直接使用的脚本&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="参考资料">&lt;span>参考资料&lt;/span>
 &lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://ebpf.io/" target="_blank" rel="external nofollow noopener noreferrer">eBPF.io&lt;/a> - eBPF 官方网站&lt;/li>
&lt;li>&lt;a href="https://www.kernel.org/doc/html/latest/bpf/" target="_blank" rel="external nofollow noopener noreferrer">Linux Kernel BPF Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.brendangregg.com/bpf-performance-tools-book.html" target="_blank" rel="external nofollow noopener noreferrer">BPF Performance Tools&lt;/a> - Brendan Gregg 的经典书籍&lt;/li>
&lt;li>&lt;a href="https://source.android.com/docs/core/architecture/kernel/bpf" target="_blank" rel="external nofollow noopener noreferrer">Android eBPF&lt;/a> - Android 官方 eBPF 文档&lt;/li>
&lt;/ul></description></item><item><title>eBPF Android 逆向实战</title><link>https://overkazaf.github.io/reverse_engineering/android/01-recipes/analysis/ebpf_android_reversing/</link><pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/01-recipes/analysis/ebpf_android_reversing/</guid><description>&lt;h1 class="heading-element" id="ebpf-android-逆向实战">&lt;span>eBPF Android 逆向实战&lt;/span>
 &lt;a href="#ebpf-android-%e9%80%86%e5%90%91%e5%ae%9e%e6%88%98" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>本文通过实战案例展示如何使用 eBPF 进行 Android 应用逆向分析。eBPF 的优势在于运行在内核层，极难被应用检测到。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="实战环境准备">&lt;span>实战环境准备&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="设备要求">&lt;span>设备要求&lt;/span>
 &lt;a href="#%e8%ae%be%e5%a4%87%e8%a6%81%e6%b1%82" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 1. 检查内核版本 (需要 &amp;gt;= 4.14)
adb shell uname -r
# 期望输出: 4.14.x 或更高

# 2. 检查 eBPF 支持
adb shell ls /sys/fs/bpf/
# 应该存在此目录

# 3. 检查必要的内核配置
adb shell zcat /proc/config.gz | grep -E &amp;#34;CONFIG_BPF|CONFIG_KPROBE&amp;#34;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="工具安装">&lt;span>工具安装&lt;/span>
 &lt;a href="#%e5%b7%a5%e5%85%b7%e5%ae%89%e8%a3%85" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 下载 bpftrace for Android
# 选项1: 使用预编译版本
wget https://github.com/aspect-build/bpftrace-android/releases/latest/bpftrace-arm64

# 选项2: 自行编译 (需要 NDK)

# 推送到设备
adb push bpftrace-arm64 /data/local/tmp/bpftrace
adb shell chmod &amp;#43;x /data/local/tmp/bpftrace

# 验证安装
adb shell /data/local/tmp/bpftrace --version&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="selinux-配置">&lt;span>SELinux 配置&lt;/span>
 &lt;a href="#selinux-%e9%85%8d%e7%bd%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 获取 root 权限
adb root

# 临时禁用 SELinux (必需)
adb shell setenforce 0

# 验证
adb shell getenforce
# 输出: Permissive&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="实战案例-1-隐蔽追踪加密通信">&lt;span>实战案例 1: 隐蔽追踪加密通信&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e6%a1%88%e4%be%8b-1-%e9%9a%90%e8%94%bd%e8%bf%bd%e8%b8%aa%e5%8a%a0%e5%af%86%e9%80%9a%e4%bf%a1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: 用 eBPF 在内核层拦截 send/recv 系统调用，在加密前/解密后捕获明文数据，完全绕过应用层的反 hook 检测。&lt;/p>&lt;/blockquote>
&lt;h3 class="heading-element" id="背景">&lt;span>背景&lt;/span>
 &lt;a href="#%e8%83%8c%e6%99%af" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>目标应用使用自定义加密，需要在不被检测的情况下捕获明文数据。&lt;/p>
&lt;h3 class="heading-element" id="步骤-1-识别加密库">&lt;span>步骤 1: 识别加密库&lt;/span>
 &lt;a href="#%e6%ad%a5%e9%aa%a4-1-%e8%af%86%e5%88%ab%e5%8a%a0%e5%af%86%e5%ba%93" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 列出应用加载的共享库
adb shell cat /proc/$(pidof com.target.app)/maps | grep &amp;#34;\.so&amp;#34;

# 常见加密库位置
# /system/lib64/libcrypto.so (OpenSSL)
# /system/lib64/libssl.so (SSL/TLS)
# /data/app/xxx/lib/arm64/lib*.so (应用私有库)&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="步骤-2-追踪-openssl-加密">&lt;span>步骤 2: 追踪 OpenSSL 加密&lt;/span>
 &lt;a href="#%e6%ad%a5%e9%aa%a4-2-%e8%bf%bd%e8%b8%aa-openssl-%e5%8a%a0%e5%af%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: ssl_intercept.bt

// 追踪 SSL_write - 捕获发送的明文
uprobe:/system/lib64/libssl.so:SSL_write
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @ssl_write_buf[tid] = arg1;
 @ssl_write_len[tid] = arg2;
 printf(&amp;#34;\n[SSL_write] len=%d\n&amp;#34;, arg2);
}

uretprobe:/system/lib64/libssl.so:SSL_write
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; @ssl_write_buf[tid]/
{
 $buf = @ssl_write_buf[tid];
 $len = @ssl_write_len[tid];

 // 打印前64字节
 $print_len = $len &amp;lt; 64 ? $len : 64;
 printf(&amp;#34;Data (first %d bytes):\n&amp;#34;, $print_len);

 // 使用循环打印数据
 $i = 0;
 while ($i &amp;lt; $print_len &amp;amp;&amp;amp; $i &amp;lt; 64) {
 $byte = *(uint8 *)($buf &amp;#43; $i);
 printf(&amp;#34;%02x &amp;#34;, $byte);
 if (($i &amp;#43; 1) % 16 == 0) {
 printf(&amp;#34;\n&amp;#34;);
 }
 $i&amp;#43;&amp;#43;;
 }
 printf(&amp;#34;\n&amp;#34;);

 delete(@ssl_write_buf[tid]);
 delete(@ssl_write_len[tid]);
}

// 追踪 SSL_read - 捕获接收的明文
uprobe:/system/lib64/libssl.so:SSL_read
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @ssl_read_buf[tid] = arg1;
}

uretprobe:/system/lib64/libssl.so:SSL_read
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; retval &amp;gt; 0/
{
 $buf = @ssl_read_buf[tid];
 $len = retval;

 printf(&amp;#34;\n[SSL_read] len=%d\n&amp;#34;, $len);

 $print_len = $len &amp;lt; 64 ? $len : 64;
 printf(&amp;#34;Data (first %d bytes):\n&amp;#34;, $print_len);

 $i = 0;
 while ($i &amp;lt; $print_len &amp;amp;&amp;amp; $i &amp;lt; 64) {
 $byte = *(uint8 *)($buf &amp;#43; $i);
 printf(&amp;#34;%02x &amp;#34;, $byte);
 if (($i &amp;#43; 1) % 16 == 0) {
 printf(&amp;#34;\n&amp;#34;);
 }
 $i&amp;#43;&amp;#43;;
 }
 printf(&amp;#34;\n&amp;#34;);

 delete(@ssl_read_buf[tid]);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="步骤-3-捕获加密密钥">&lt;span>步骤 3: 捕获加密密钥&lt;/span>
 &lt;a href="#%e6%ad%a5%e9%aa%a4-3-%e6%8d%95%e8%8e%b7%e5%8a%a0%e5%af%86%e5%af%86%e9%92%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: crypto_key_capture.bt

// AES 密钥设置
uprobe:/system/lib64/libcrypto.so:AES_set_encrypt_key
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $key = (uint8 *)arg0;
 $bits = arg1;

 printf(&amp;#34;\n[AES_set_encrypt_key] bits=%d\n&amp;#34;, $bits);
 printf(&amp;#34;Key: &amp;#34;);

 $len = $bits / 8;
 $i = 0;
 while ($i &amp;lt; $len) {
 printf(&amp;#34;%02x&amp;#34;, $key[$i]);
 $i&amp;#43;&amp;#43;;
 }
 printf(&amp;#34;\n&amp;#34;);
}

// EVP 加密初始化 - 获取 IV
uprobe:/system/lib64/libcrypto.so:EVP_EncryptInit_ex
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;\n[EVP_EncryptInit_ex]\n&amp;#34;);
 printf(&amp;#34; ctx=%p cipher=%p key=%p iv=%p\n&amp;#34;, arg0, arg1, arg3, arg4);

 if (arg4 != 0) {
 $iv = (uint8 *)arg4;
 printf(&amp;#34; IV: &amp;#34;);
 $i = 0;
 while ($i &amp;lt; 16) {
 printf(&amp;#34;%02x&amp;#34;, $iv[$i]);
 $i&amp;#43;&amp;#43;;
 }
 printf(&amp;#34;\n&amp;#34;);
 }
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="实战案例-2-绕过反调试检测">&lt;span>实战案例 2: 绕过反调试检测&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e6%a1%88%e4%be%8b-2-%e7%bb%95%e8%bf%87%e5%8f%8d%e8%b0%83%e8%af%95%e6%a3%80%e6%b5%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: 用 eBPF hook ptrace/open 等系统调用，在内核层篡改返回值，让反调试检测函数永远得到&amp;quot;安全&amp;quot;的结果。&lt;/p>&lt;/blockquote>
&lt;h3 class="heading-element" id="背景-1">&lt;span>背景&lt;/span>
 &lt;a href="#%e8%83%8c%e6%99%af-1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>目标应用有多重反调试保护，需要在不触发检测的情况下分析。&lt;/p>
&lt;h3 class="heading-element" id="检测点分析">&lt;span>检测点分析&lt;/span>
 &lt;a href="#%e6%a3%80%e6%b5%8b%e7%82%b9%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: anti_debug_analysis.bt
// 首先运行此脚本，观察应用的反调试行为

// 1. ptrace 检测
tracepoint:syscalls:sys_enter_ptrace
{
 printf(&amp;#34;[PTRACE] %s (PID:%d) request=%d target_pid=%d\n&amp;#34;,
 comm, pid, args-&amp;gt;request, args-&amp;gt;pid);

 @ptrace_requests[args-&amp;gt;request] = count();
}

// 2. /proc 文件系统访问
tracepoint:syscalls:sys_enter_openat
/strcontains(str(args-&amp;gt;filename), &amp;#34;/proc/&amp;#34;)/
{
 $f = str(args-&amp;gt;filename);

 if (strcontains($f, &amp;#34;status&amp;#34;) ||
 strcontains($f, &amp;#34;stat&amp;#34;) ||
 strcontains($f, &amp;#34;maps&amp;#34;) ||
 strcontains($f, &amp;#34;cmdline&amp;#34;)) {
 printf(&amp;#34;[PROC] %s opening %s\n&amp;#34;, comm, $f);
 @proc_access[$f] = count();
 }
}

// 3. 时间检测 (调试会导致执行变慢)
tracepoint:syscalls:sys_enter_clock_gettime
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @clock_gettime = count();
}

tracepoint:syscalls:sys_enter_gettimeofday
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @gettimeofday = count();
}

// 4. 信号处理
tracepoint:signal:signal_deliver
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[SIGNAL] %s received signal %d\n&amp;#34;, comm, args-&amp;gt;sig);
}

END
{
 printf(&amp;#34;\n=== 反调试行为统计 ===\n&amp;#34;);
 printf(&amp;#34;\nptrace 请求:\n&amp;#34;);
 print(@ptrace_requests);
 printf(&amp;#34;\n/proc 访问:\n&amp;#34;);
 print(@proc_access);
 printf(&amp;#34;\n时间获取: clock_gettime=%d, gettimeofday=%d\n&amp;#34;,
 @clock_gettime, @gettimeofday);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="隐蔽监控方案">&lt;span>隐蔽监控方案&lt;/span>
 &lt;a href="#%e9%9a%90%e8%94%bd%e7%9b%91%e6%8e%a7%e6%96%b9%e6%a1%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>使用 eBPF 监控而非 Frida，避免被检测:&lt;/p>
&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: stealth_monitor.bt
// eBPF 运行在内核空间，应用层无法检测

// 追踪所有关键行为，但不干预
tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @files[str(args-&amp;gt;filename)] = count();
}

tracepoint:syscalls:sys_enter_connect
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @connects = count();
}

tracepoint:syscalls:sys_enter_sendto
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @send_bytes = sum(args-&amp;gt;len);
}

tracepoint:syscalls:sys_enter_recvfrom
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @recv_attempts = count();
}

// JNI 调用追踪
uprobe:/apex/com.android.art/lib64/libart.so:*RegisterNatives*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JNI] RegisterNatives called\n&amp;#34;);
 @jni_register = count();
}

interval:s:10
{
 printf(&amp;#34;\n--- 10秒统计 ---\n&amp;#34;);
 printf(&amp;#34;文件访问: &amp;#34;);
 print(@files);
 printf(&amp;#34;网络连接: %d, 发送: %d 字节\n&amp;#34;, @connects, @send_bytes);
 clear(@files);
 clear(@connects);
 clear(@send_bytes);
 clear(@recv_attempts);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="实战案例-3-分析应用启动流程">&lt;span>实战案例 3: 分析应用启动流程&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e6%a1%88%e4%be%8b-3-%e5%88%86%e6%9e%90%e5%ba%94%e7%94%a8%e5%90%af%e5%8a%a8%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: 用 eBPF 追踪 fork/exec/mmap/open 系统调用序列，还原应用从 Zygote fork 到加载 DEX/SO 的完整启动链路。&lt;/p>&lt;/blockquote>
&lt;h3 class="heading-element" id="追踪启动过程">&lt;span>追踪启动过程&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e5%90%af%e5%8a%a8%e8%bf%87%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: app_startup.bt
// 用途: 分析应用从启动到完成初始化的全过程

BEGIN
{
 printf(&amp;#34;等待应用启动...\n&amp;#34;);
 printf(&amp;#34;请执行: adb shell am start com.target.app/.MainActivity\n\n&amp;#34;);
}

// Zygote fork 新进程
tracepoint:sched:sched_process_fork
/comm == &amp;#34;zygote64&amp;#34; || comm == &amp;#34;zygote&amp;#34;/
{
 printf(&amp;#34;[%llu] FORK: %s -&amp;gt; child_pid=%d\n&amp;#34;,
 nsecs, comm, args-&amp;gt;child_pid);
 @app_pid = args-&amp;gt;child_pid;
}

// 进程执行
tracepoint:sched:sched_process_exec
/@app_pid == pid/
{
 printf(&amp;#34;[%llu] EXEC: %s\n&amp;#34;, nsecs, comm);
}

// 库加载追踪
tracepoint:syscalls:sys_enter_openat
/pid == @app_pid &amp;amp;&amp;amp; strcontains(str(args-&amp;gt;filename), &amp;#34;.so&amp;#34;)/
{
 printf(&amp;#34;[%llu] LOAD: %s\n&amp;#34;, nsecs, str(args-&amp;gt;filename));
 @loaded_libs[str(args-&amp;gt;filename)] = 1;
}

// DEX 文件访问
tracepoint:syscalls:sys_enter_openat
/pid == @app_pid &amp;amp;&amp;amp;
 (strcontains(str(args-&amp;gt;filename), &amp;#34;.dex&amp;#34;) ||
 strcontains(str(args-&amp;gt;filename), &amp;#34;.apk&amp;#34;) ||
 strcontains(str(args-&amp;gt;filename), &amp;#34;.vdex&amp;#34;) ||
 strcontains(str(args-&amp;gt;filename), &amp;#34;.odex&amp;#34;))/
{
 printf(&amp;#34;[%llu] DEX: %s\n&amp;#34;, nsecs, str(args-&amp;gt;filename));
}

// mmap 可执行区域 (代码加载)
tracepoint:syscalls:sys_enter_mmap
/pid == @app_pid &amp;amp;&amp;amp; (args-&amp;gt;prot &amp;amp; 4)/ // PROT_EXEC
{
 printf(&amp;#34;[%llu] MMAP_EXEC: addr=%p len=%zu\n&amp;#34;,
 nsecs, args-&amp;gt;addr, args-&amp;gt;len);
 @exec_maps = count();
}

// 网络连接 (首次通信)
tracepoint:syscalls:sys_enter_connect
/pid == @app_pid/
{
 printf(&amp;#34;[%llu] FIRST_CONNECT\n&amp;#34;, nsecs);
}

// 10 秒后输出统计
interval:s:10
{
 printf(&amp;#34;\n=== 启动分析完成 ===\n&amp;#34;);
 printf(&amp;#34;加载的库:\n&amp;#34;);
 print(@loaded_libs);
 printf(&amp;#34;可执行映射数: %d\n&amp;#34;, @exec_maps);
 exit();
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪-native-库初始化">&lt;span>追踪 Native 库初始化&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa-native-%e5%ba%93%e5%88%9d%e5%a7%8b%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: native_init.bt
// 追踪 .so 库的 init 函数

// dlopen 调用
uprobe:/apex/com.android.runtime/lib64/bionic/libdl.so:dlopen
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[DLOPEN] Loading: %s\n&amp;#34;, str(arg0));
 @dlopen_start[str(arg0)] = nsecs;
}

uretprobe:/apex/com.android.runtime/lib64/bionic/libdl.so:dlopen
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[DLOPEN] Returned: %p\n&amp;#34;, retval);
}

// 追踪 JNI_OnLoad
uprobe:/data/app/com.target.app-*/lib/arm64/*.so:JNI_OnLoad
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[JNI_OnLoad] %s\n&amp;#34;, probe);
 @jni_onload = count();
}

// 追踪 .init_array 执行 (constructor 函数)
// 这需要知道具体函数地址，或使用通配符&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="实战案例-4-协议逆向分析">&lt;span>实战案例 4: 协议逆向分析&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e6%a1%88%e4%be%8b-4-%e5%8d%8f%e8%ae%ae%e9%80%86%e5%90%91%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: 用 eBPF 在 socket 层拦截收发数据，配合 uprobe hook 应用层加解密函数，同时获取加密前明文和网络层密文，快速理解协议结构。&lt;/p>&lt;/blockquote>
&lt;h3 class="heading-element" id="追踪自定义协议">&lt;span>追踪自定义协议&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8d%8f%e8%ae%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: protocol_analysis.bt
// 分析应用自定义协议

// Socket 创建
tracepoint:syscalls:sys_enter_socket
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[SOCKET] domain=%d type=%d protocol=%d\n&amp;#34;,
 args-&amp;gt;family, args-&amp;gt;type, args-&amp;gt;protocol);
}

// 数据发送
tracepoint:syscalls:sys_enter_sendto
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $buf = (uint8 *)args-&amp;gt;buff;
 $len = args-&amp;gt;len;

 printf(&amp;#34;\n[SEND] len=%d\n&amp;#34;, $len);

 // 打印协议头 (假设前16字节是头部)
 printf(&amp;#34;Header: &amp;#34;);
 $i = 0;
 while ($i &amp;lt; 16 &amp;amp;&amp;amp; $i &amp;lt; $len) {
 printf(&amp;#34;%02x &amp;#34;, $buf[$i]);
 $i&amp;#43;&amp;#43;;
 }
 printf(&amp;#34;\n&amp;#34;);

 // 分析魔数
 $magic = ($buf[0] &amp;lt;&amp;lt; 24) | ($buf[1] &amp;lt;&amp;lt; 16) | ($buf[2] &amp;lt;&amp;lt; 8) | $buf[3];
 printf(&amp;#34;Magic: 0x%08x\n&amp;#34;, $magic);

 @send_sizes = hist($len);
}

// 数据接收
tracepoint:syscalls:sys_exit_recvfrom
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; args-&amp;gt;ret &amp;gt; 0/
{
 printf(&amp;#34;\n[RECV] len=%d\n&amp;#34;, args-&amp;gt;ret);
 @recv_sizes = hist(args-&amp;gt;ret);
}

END
{
 printf(&amp;#34;\n=== 协议统计 ===\n&amp;#34;);
 printf(&amp;#34;发送包大小分布:\n&amp;#34;);
 print(@send_sizes);
 printf(&amp;#34;接收包大小分布:\n&amp;#34;);
 print(@recv_sizes);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪-protobuf-序列化">&lt;span>追踪 Protobuf 序列化&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa-protobuf-%e5%ba%8f%e5%88%97%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: protobuf_trace.bt
// 追踪 Protobuf 编解码

// Google Protobuf 库函数
uprobe:/data/app/com.target.app-*/lib/arm64/lib*.so:*SerializeToString*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[PROTOBUF] SerializeToString\n&amp;#34;);
 @serialize = count();
}

uprobe:/data/app/com.target.app-*/lib/arm64/lib*.so:*ParseFromString*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;[PROTOBUF] ParseFromString\n&amp;#34;);
 @parse = count();
}

// 追踪更底层的编码函数
uprobe:/data/app/com.target.app-*/lib/arm64/lib*.so:*WriteVarint*
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @varint_writes = count();
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="实战案例-5-root-检测分析">&lt;span>实战案例 5: Root 检测分析&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e6%a1%88%e4%be%8b-5-root-%e6%a3%80%e6%b5%8b%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: 用 eBPF 监控应用的 open/access/stat 系统调用，观察它检测哪些路径（/system/xbin/su, /sbin/magisk 等），从而精准定位并绕过 root 检测。&lt;/p>&lt;/blockquote>
&lt;h3 class="heading-element" id="监控-root-检测行为">&lt;span>监控 Root 检测行为&lt;/span>
 &lt;a href="#%e7%9b%91%e6%8e%a7-root-%e6%a3%80%e6%b5%8b%e8%a1%8c%e4%b8%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: root_detect.bt
// 分析应用的 Root 检测机制

// 检测 su 二进制文件
tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $f = str(args-&amp;gt;filename);

 if (strcontains($f, &amp;#34;/su&amp;#34;) ||
 strcontains($f, &amp;#34;supersu&amp;#34;) ||
 strcontains($f, &amp;#34;superuser&amp;#34;) ||
 strcontains($f, &amp;#34;magisk&amp;#34;) ||
 strcontains($f, &amp;#34;busybox&amp;#34;)) {
 printf(&amp;#34;[ROOT-CHECK] Checking: %s\n&amp;#34;, $f);
 @root_checks[$f] = count();
 }
}

// 检测 stat/access 调用
tracepoint:syscalls:sys_enter_faccessat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $f = str(args-&amp;gt;filename);

 if (strcontains($f, &amp;#34;/su&amp;#34;) ||
 strcontains($f, &amp;#34;/system/xbin/&amp;#34;) ||
 strcontains($f, &amp;#34;/system/bin/&amp;#34;)) {
 printf(&amp;#34;[ROOT-CHECK] Access check: %s\n&amp;#34;, $f);
 }
}

// 检测 which 命令
tracepoint:syscalls:sys_enter_execve
/strcontains(str(args-&amp;gt;filename), &amp;#34;which&amp;#34;)/
{
 printf(&amp;#34;[ROOT-CHECK] Exec: %s\n&amp;#34;, str(args-&amp;gt;filename));
}

// 检测系统属性读取
uprobe:/system/lib64/libc.so:__system_property_get
/comm == &amp;#34;com.target.app&amp;#34;/
{
 $name = str(arg0);

 if (strcontains($name, &amp;#34;ro.build&amp;#34;) ||
 strcontains($name, &amp;#34;ro.debuggable&amp;#34;) ||
 strcontains($name, &amp;#34;ro.secure&amp;#34;)) {
 printf(&amp;#34;[ROOT-CHECK] Property: %s\n&amp;#34;, $name);
 @prop_checks[$name] = count();
 }
}

END
{
 printf(&amp;#34;\n=== Root 检测统计 ===\n&amp;#34;);
 printf(&amp;#34;文件检查:\n&amp;#34;);
 print(@root_checks);
 printf(&amp;#34;\n属性检查:\n&amp;#34;);
 print(@prop_checks);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="性能分析工具">&lt;span>性能分析工具&lt;/span>
 &lt;a href="#%e6%80%a7%e8%83%bd%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="热点函数分析">&lt;span>热点函数分析&lt;/span>
 &lt;a href="#%e7%83%ad%e7%82%b9%e5%87%bd%e6%95%b0%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: hotspot.bt
// CPU 热点分析

profile:hz:99
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @user_stacks[ustack(10)] = count();
 @kernel_stacks[kstack(10)] = count();
}

END
{
 printf(&amp;#34;\n=== 用户态热点 (Top 5) ===\n&amp;#34;);
 print(@user_stacks, 5);
 printf(&amp;#34;\n=== 内核态热点 (Top 5) ===\n&amp;#34;);
 print(@kernel_stacks, 5);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="锁竞争分析">&lt;span>锁竞争分析&lt;/span>
 &lt;a href="#%e9%94%81%e7%ab%9e%e4%ba%89%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>#!/usr/bin/env bpftrace
// 文件: lock_contention.bt

uprobe:/apex/com.android.runtime/lib64/bionic/libc.so:pthread_mutex_lock
/comm == &amp;#34;com.target.app&amp;#34;/
{
 @lock_start[tid, arg0] = nsecs;
}

uretprobe:/apex/com.android.runtime/lib64/bionic/libc.so:pthread_mutex_lock
/comm == &amp;#34;com.target.app&amp;#34; &amp;amp;&amp;amp; @lock_start[tid, arg0]/
{
 $wait = nsecs - @lock_start[tid, arg0];
 @lock_wait = hist($wait);

 if ($wait &amp;gt; 1000000) { // &amp;gt; 1ms
 printf(&amp;#34;[LOCK] tid=%d waited %d ns for mutex %p\n&amp;#34;,
 tid, $wait, arg0);
 }

 delete(@lock_start[tid, arg0]);
}

END
{
 printf(&amp;#34;\n=== 锁等待时间分布 (ns) ===\n&amp;#34;);
 print(@lock_wait);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="与-frida-配合使用">&lt;span>与 Frida 配合使用&lt;/span>
 &lt;a href="#%e4%b8%8e-frida-%e9%85%8d%e5%90%88%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="场景-ebpf-监控--frida-修改">&lt;span>场景: eBPF 监控 + Frida 修改&lt;/span>
 &lt;a href="#%e5%9c%ba%e6%99%af-ebpf-%e7%9b%91%e6%8e%a7--frida-%e4%bf%ae%e6%94%b9" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 终端1: eBPF 监控 (不被检测)
adb shell /data/local/tmp/bpftrace -e &amp;#39;
tracepoint:syscalls:sys_enter_openat
/comm == &amp;#34;com.target.app&amp;#34;/
{
 printf(&amp;#34;OPEN: %s\n&amp;#34;, str(args-&amp;gt;filename));
}&amp;#39;

# 终端2: 等待检测通过后，使用 Frida 注入
# 可以利用 eBPF 的信息决定 Hook 点
frida -U -f com.target.app -l script.js&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="使用-ebpf-辅助-frida-分析">&lt;span>使用 eBPF 辅助 Frida 分析&lt;/span>
 &lt;a href="#%e4%bd%bf%e7%94%a8-ebpf-%e8%be%85%e5%8a%a9-frida-%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// Frida 脚本: 基于 eBPF 发现的地址进行 Hook
// eBPF 可以发现动态加载的库地址

// 假设 eBPF 发现加密函数在 0x12345678
var encrypt_addr = ptr(&amp;#34;0x12345678&amp;#34;);

Interceptor.attach(encrypt_addr, {
 onEnter: function(args) {
 console.log(&amp;#34;Encrypt called&amp;#34;);
 }
});&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="常见问题解决">&lt;span>常见问题解决&lt;/span>
 &lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="q-bpftrace-找不到符号">&lt;span>Q: bpftrace 找不到符号&lt;/span>
 &lt;a href="#q-bpftrace-%e6%89%be%e4%b8%8d%e5%88%b0%e7%ac%a6%e5%8f%b7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 检查符号表
adb shell readelf -s /system/lib64/libcrypto.so | grep EVP

# 使用地址而非符号名
uprobe:/system/lib64/libcrypto.so:0x12345&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="q-追踪导致应用崩溃">&lt;span>Q: 追踪导致应用崩溃&lt;/span>
 &lt;a href="#q-%e8%bf%bd%e8%b8%aa%e5%af%bc%e8%87%b4%e5%ba%94%e7%94%a8%e5%b4%a9%e6%ba%83" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 减少追踪频率
interval:ms:100 # 而不是每次调用

# 避免追踪高频函数
# 使用 profile 采样而非 uprobe&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="q-内存限制">&lt;span>Q: 内存限制&lt;/span>
 &lt;a href="#q-%e5%86%85%e5%ad%98%e9%99%90%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 增加 map 大小
sudo sysctl kernel.perf_event_max_stack=127
sudo sysctl kernel.perf_event_max_contexts_per_stack=8&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="总结">&lt;span>总结&lt;/span>
 &lt;a href="#%e6%80%bb%e7%bb%93" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>eBPF 在 Android 逆向中的核心优势:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>隐蔽性&lt;/strong>: 内核态运行，无法被应用检测&lt;/li>
&lt;li>&lt;strong>全面性&lt;/strong>: 可追踪系统调用、网络、文件、内存等所有层面&lt;/li>
&lt;li>&lt;strong>高性能&lt;/strong>: JIT 编译，开销极低&lt;/li>
&lt;li>&lt;strong>安全性&lt;/strong>: 不影响目标应用稳定性&lt;/li>
&lt;/ol>
&lt;p>建议工作流:&lt;/p>
&lt;ol>
&lt;li>先用 eBPF 隐蔽监控，了解应用行为&lt;/li>
&lt;li>分析反调试机制&lt;/li>
&lt;li>确定关键函数和地址&lt;/li>
&lt;li>必要时配合 Frida 进行深入分析&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 class="heading-element" id="参考资料">&lt;span>参考资料&lt;/span>
 &lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="../../02-Tools/Dynamic/ebpf_guide.md">eBPF 使用指南&lt;/a>&lt;/li>
&lt;li>&lt;a href="../../02-Tools/Dynamic/ebpf_internals.md">eBPF 内部原理&lt;/a>&lt;/li>
&lt;li>&lt;a href="../Scripts/ebpf_scripts.md">eBPF 脚本集&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>eBPF 内部原理</title><link>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/ebpf_internals/</link><pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/ebpf_internals/</guid><description>&lt;h1 class="heading-element" id="ebpf-内部原理">&lt;span>eBPF 内部原理&lt;/span>
 &lt;a href="#ebpf-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>本文深入剖析 eBPF 的内部工作机制，帮助你理解这项技术的底层原理，从而更好地应用于 Android 逆向工程。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="架构概览">&lt;span>架构概览&lt;/span>
 &lt;a href="#%e6%9e%b6%e6%9e%84%e6%a6%82%e8%a7%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────┐
│ 用户空间 │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ │
│ │ bpftrace │ │ BCC/Python │ │ libbpf/C │ │
│ └──────┬──────┘ └──────┬───────┘ └────────┬────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────────┘ │
│ │ bpf() 系统调用 │
├──────────────────────────┼──────────────────────────────────┤
│ 内核空间 │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ BPF 验证器 │ │
│ │ - 安全检查 - 边界验证 - 死循环检测 │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ JIT 编译器 │ │
│ │ 将 BPF 字节码编译为原生机器码 │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │
│ │ kprobes │ │tracepoint│ │ socket/XDP │ │
│ └─────────┘ └─────────┘ └─────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ BPF Maps │ │
│ │ 内核与用户空间共享的数据结构 │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="bpf-虚拟机">&lt;span>BPF 虚拟机&lt;/span>
 &lt;a href="#bpf-%e8%99%9a%e6%8b%9f%e6%9c%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="寄存器模型">&lt;span>寄存器模型&lt;/span>
 &lt;a href="#%e5%af%84%e5%ad%98%e5%99%a8%e6%a8%a1%e5%9e%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>eBPF 使用 11 个 64 位寄存器:&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>寄存器&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>R0&lt;/td>
 &lt;td>返回值，辅助函数返回值&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>R1-R5&lt;/td>
 &lt;td>函数参数&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>R6-R9&lt;/td>
 &lt;td>被调用者保存寄存器&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>R10&lt;/td>
 &lt;td>只读栈帧指针&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;pre>&lt;code>// 寄存器使用示例
// R1 = ctx (上下文指针)
// R0 = 返回值

int bpf_prog(struct pt_regs *ctx) {
 // R1 = ctx
 u64 pid = bpf_get_current_pid_tgid(); // 结果在 R0
 return 0; // R0 = 0
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="指令集">&lt;span>指令集&lt;/span>
 &lt;a href="#%e6%8c%87%e4%bb%a4%e9%9b%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>eBPF 指令格式 (64 位):&lt;/p>
&lt;pre>&lt;code>┌───────┬───────┬───────┬───────────────┬───────────────────┐
│ 8 bit │ 4 bit │ 4 bit │ 16 bit │ 32 bit │
│ op │ dst │ src │ offset │ imm │
└───────┴───────┴───────┴───────────────┴───────────────────┘&lt;/code>&lt;/pre>&lt;p>&lt;strong>指令类别:&lt;/strong>&lt;/p>
&lt;pre>&lt;code>// 算术指令
BPF_ADD | BPF_X | BPF_ALU64 // dst &amp;#43;= src (64位)
BPF_SUB | BPF_K | BPF_ALU // dst -= imm (32位)

// 跳转指令
BPF_JEQ | BPF_K | BPF_JMP // if dst == imm goto pc&amp;#43;off
BPF_JGT | BPF_X | BPF_JMP // if dst &amp;gt; src goto pc&amp;#43;off

// 内存访问
BPF_LDX | BPF_MEM | BPF_DW // dst = *(u64 *)(src &amp;#43; off)
BPF_STX | BPF_MEM | BPF_W // *(u32 *)(dst &amp;#43; off) = src

// 函数调用
BPF_CALL // 调用辅助函数
BPF_EXIT // 退出程序&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="示例程序字节码">&lt;span>示例程序字节码&lt;/span>
 &lt;a href="#%e7%a4%ba%e4%be%8b%e7%a8%8b%e5%ba%8f%e5%ad%97%e8%8a%82%e7%a0%81" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 简单的 eBPF 程序
int hello(void *ctx) {
 char msg[] = &amp;#34;Hello&amp;#34;;
 bpf_trace_printk(msg, sizeof(msg));
 return 0;
}

// 编译后的字节码 (简化)
/*
0: r1 = 0x6f6c6c6548 // &amp;#34;Hello&amp;#34; 低位
1: *(u64 *)(r10 - 8) = r1 // 存储到栈
2: r1 = r10 - 8 // msg 地址
3: r2 = 6 // sizeof(msg)
4: call bpf_trace_printk // 调用辅助函数
5: r0 = 0 // 返回值
6: exit // 退出
*/&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="验证器-verifier">&lt;span>验证器 (Verifier)&lt;/span>
 &lt;a href="#%e9%aa%8c%e8%af%81%e5%99%a8-verifier" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>验证器是 eBPF 安全性的核心，确保程序不会破坏内核。&lt;/p>
&lt;h3 class="heading-element" id="验证流程">&lt;span>验证流程&lt;/span>
 &lt;a href="#%e9%aa%8c%e8%af%81%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────┐
│ BPF 验证器流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. CFG 检查 (Control Flow Graph) │
│ ├─ 检测不可达代码 │
│ ├─ 验证所有路径都有 exit │
│ └─ 检测循环 (默认禁止无界循环) │
│ │
│ 2. 模拟执行 │
│ ├─ 追踪每个寄存器状态 │
│ ├─ 验证内存访问边界 │
│ └─ 检查指针类型安全 │
│ │
│ 3. 辅助函数调用验证 │
│ ├─ 检查参数类型 │
│ ├─ 验证调用权限 │
│ └─ 追踪返回值类型 │
│ │
│ 4. Map 访问验证 │
│ ├─ 检查 Map 类型兼容性 │
│ ├─ 验证键/值大小 │
│ └─ 检查并发安全性 │
│ │
└─────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="寄存器状态追踪">&lt;span>寄存器状态追踪&lt;/span>
 &lt;a href="#%e5%af%84%e5%ad%98%e5%99%a8%e7%8a%b6%e6%80%81%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 验证器追踪的寄存器状态
enum bpf_reg_type {
 NOT_INIT, // 未初始化
 SCALAR_VALUE, // 标量值
 PTR_TO_CTX, // 上下文指针
 PTR_TO_MAP_VALUE, // Map 值指针
 PTR_TO_STACK, // 栈指针
 PTR_TO_PACKET, // 网络包指针
 // ...
};

// 验证示例
int bpf_prog(struct __sk_buff *skb) {
 // R1 = PTR_TO_CTX (skb)

 u8 *data = (void *)(long)skb-&amp;gt;data;
 // data 类型: PTR_TO_PACKET

 u8 *end = (void *)(long)skb-&amp;gt;data_end;
 // end 类型: PTR_TO_PACKET_END

 // 必须进行边界检查
 if (data &amp;#43; 14 &amp;gt; end) {
 return 0; // 验证器要求的边界检查
 }

 // 现在可以安全访问 data[0..13]
 return data[0];
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="常见验证错误">&lt;span>常见验证错误&lt;/span>
 &lt;a href="#%e5%b8%b8%e8%a7%81%e9%aa%8c%e8%af%81%e9%94%99%e8%af%af" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 错误1: 无界循环
&amp;#34;back-edge from insn X to Y&amp;#34;

# 错误2: 越界访问
&amp;#34;invalid access to map value, off=X size=Y&amp;#34;

# 错误3: 未初始化寄存器
&amp;#34;R3 !read_ok&amp;#34;

# 错误4: 指针泄露
&amp;#34;cannot write pointer to map value&amp;#34;

# 错误5: 无效的辅助函数调用
&amp;#34;unknown func bpf_xxx&amp;#34;&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="jit-编译器">&lt;span>JIT 编译器&lt;/span>
 &lt;a href="#jit-%e7%bc%96%e8%af%91%e5%99%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="编译流程">&lt;span>编译流程&lt;/span>
 &lt;a href="#%e7%bc%96%e8%af%91%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>BPF 字节码 → JIT 编译器 → 原生机器码
 │ │ │
 │ │ ├─ x86_64
 │ │ ├─ ARM64
 │ │ ├─ ARM32
 │ │ └─ ...&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="arm64-jit-示例">&lt;span>ARM64 JIT 示例&lt;/span>
 &lt;a href="#arm64-jit-%e7%a4%ba%e4%be%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// BPF 指令
BPF_ALU64 | BPF_ADD | BPF_X // R0 &amp;#43;= R1

// 编译为 ARM64
ADD X0, X0, X1

// BPF 指令
BPF_JEQ | BPF_K | BPF_JMP // if R0 == 42 goto &amp;#43;5

// 编译为 ARM64
CMP X0, #42
B.EQ .&amp;#43;5*4&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="jit-优化">&lt;span>JIT 优化&lt;/span>
 &lt;a href="#jit-%e4%bc%98%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 常量折叠
r1 = 10
r2 = 20
r3 = r1 &amp;#43; r2 // 编译时计算为 30

// 死代码消除
if (false) {
 // 这段代码会被移除
}

// 寄存器分配
// BPF 寄存器直接映射到物理寄存器
// R0-R9 → X0-X9 (ARM64)&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="bpf-maps">&lt;span>BPF Maps&lt;/span>
 &lt;a href="#bpf-maps" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="map-类型详解">&lt;span>Map 类型详解&lt;/span>
 &lt;a href="#map-%e7%b1%bb%e5%9e%8b%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 1. 哈希表 - 任意键值对
BPF_MAP_TYPE_HASH
// 用途: 存储 PID 到计数的映射
struct {
 __uint(type, BPF_MAP_TYPE_HASH);
 __uint(max_entries, 10240);
 __type(key, u32); // PID
 __type(value, u64); // 计数
} pid_counts SEC(&amp;#34;.maps&amp;#34;);

// 2. 数组 - 快速索引访问
BPF_MAP_TYPE_ARRAY
// 用途: 预分配的固定大小数组
struct {
 __uint(type, BPF_MAP_TYPE_ARRAY);
 __uint(max_entries, 256);
 __type(key, u32);
 __type(value, struct stats);
} syscall_stats SEC(&amp;#34;.maps&amp;#34;);

// 3. 性能缓冲区 - 高效事件传输
BPF_MAP_TYPE_PERF_EVENT_ARRAY
// 用途: 向用户空间发送事件
struct {
 __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
 __uint(key_size, sizeof(int));
 __uint(value_size, sizeof(int));
} events SEC(&amp;#34;.maps&amp;#34;);

// 4. 栈追踪 - 存储调用栈
BPF_MAP_TYPE_STACK_TRACE
// 用途: 捕获内核/用户态调用栈

// 5. LRU 哈希表 - 自动淘汰
BPF_MAP_TYPE_LRU_HASH
// 用途: 有限空间下的缓存&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="map-操作">&lt;span>Map 操作&lt;/span>
 &lt;a href="#map-%e6%93%8d%e4%bd%9c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 内核态操作
void *bpf_map_lookup_elem(map, key);
long bpf_map_update_elem(map, key, value, flags);
long bpf_map_delete_elem(map, key);

// 用户态操作 (通过 bpf 系统调用)
int bpf_map_lookup_elem(int fd, const void *key, void *value);
int bpf_map_update_elem(int fd, const void *key, const void *value, __u64 flags);
int bpf_map_delete_elem(int fd, const void *key);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="map-并发安全">&lt;span>Map 并发安全&lt;/span>
 &lt;a href="#map-%e5%b9%b6%e5%8f%91%e5%ae%89%e5%85%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 原子操作
__sync_fetch_and_add(&amp;amp;value, 1);

// Per-CPU Map - 无锁并发
BPF_MAP_TYPE_PERCPU_HASH
BPF_MAP_TYPE_PERCPU_ARRAY

// 自旋锁 (较新内核)
struct bpf_spin_lock lock;
bpf_spin_lock(&amp;amp;lock);
// 临界区
bpf_spin_unlock(&amp;amp;lock);&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="程序类型深入">&lt;span>程序类型深入&lt;/span>
 &lt;a href="#%e7%a8%8b%e5%ba%8f%e7%b1%bb%e5%9e%8b%e6%b7%b1%e5%85%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="kprobekretprobe">&lt;span>Kprobe/Kretprobe&lt;/span>
 &lt;a href="#kprobekretprobe" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 在内核函数入口处触发
SEC(&amp;#34;kprobe/do_sys_openat2&amp;#34;)
int kprobe_openat(struct pt_regs *ctx) {
 // ctx 包含寄存器状态
 // ARM64: x0-x7 = 参数
 char *filename = (char *)PT_REGS_PARM2(ctx);
 return 0;
}

// 在内核函数返回时触发
SEC(&amp;#34;kretprobe/do_sys_openat2&amp;#34;)
int kretprobe_openat(struct pt_regs *ctx) {
 // PT_REGS_RC(ctx) = 返回值
 int fd = PT_REGS_RC(ctx);
 return 0;
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="uprobeuretprobe">&lt;span>Uprobe/Uretprobe&lt;/span>
 &lt;a href="#uprobeuretprobe" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 在用户态函数入口处触发
SEC(&amp;#34;uprobe/libc.so.6:malloc&amp;#34;)
int uprobe_malloc(struct pt_regs *ctx) {
 size_t size = PT_REGS_PARM1(ctx);
 bpf_printk(&amp;#34;malloc(%zu)\n&amp;#34;, size);
 return 0;
}

// 在用户态函数返回时触发
SEC(&amp;#34;uretprobe/libc.so.6:malloc&amp;#34;)
int uretprobe_malloc(struct pt_regs *ctx) {
 void *ptr = (void *)PT_REGS_RC(ctx);
 bpf_printk(&amp;#34;malloc returned %p\n&amp;#34;, ptr);
 return 0;
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="tracepoint">&lt;span>Tracepoint&lt;/span>
 &lt;a href="#tracepoint" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 内核静态追踪点 - 稳定的 ABI
SEC(&amp;#34;tracepoint/syscalls/sys_enter_openat&amp;#34;)
int trace_openat(struct trace_event_raw_sys_enter *ctx) {
 // 参数通过 args 访问
 char *filename = (char *)ctx-&amp;gt;args[1];
 int flags = ctx-&amp;gt;args[2];
 return 0;
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="socketxdp">&lt;span>Socket/XDP&lt;/span>
 &lt;a href="#socketxdp" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// Socket 过滤器
SEC(&amp;#34;socket&amp;#34;)
int socket_filter(struct __sk_buff *skb) {
 // 返回 0 = 丢弃, 返回正数 = 接受
 return skb-&amp;gt;len;
}

// XDP - 高性能网络处理
SEC(&amp;#34;xdp&amp;#34;)
int xdp_filter(struct xdp_md *ctx) {
 void *data = (void *)(long)ctx-&amp;gt;data;
 void *data_end = (void *)(long)ctx-&amp;gt;data_end;

 struct ethhdr *eth = data;
 if ((void *)(eth &amp;#43; 1) &amp;gt; data_end)
 return XDP_DROP;

 return XDP_PASS;
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="辅助函数">&lt;span>辅助函数&lt;/span>
 &lt;a href="#%e8%be%85%e5%8a%a9%e5%87%bd%e6%95%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="内存访问">&lt;span>内存访问&lt;/span>
 &lt;a href="#%e5%86%85%e5%ad%98%e8%ae%bf%e9%97%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 安全读取内核内存
long bpf_probe_read(void *dst, u32 size, const void *src);

// 安全读取用户内存
long bpf_probe_read_user(void *dst, u32 size, const void *src);

// 安全读取字符串
long bpf_probe_read_str(void *dst, u32 size, const void *src);
long bpf_probe_read_user_str(void *dst, u32 size, const void *src);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="进程信息">&lt;span>进程信息&lt;/span>
 &lt;a href="#%e8%bf%9b%e7%a8%8b%e4%bf%a1%e6%81%af" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 获取 PID/TID
u64 bpf_get_current_pid_tgid(void);
// 返回: (PID &amp;lt;&amp;lt; 32) | TID

// 获取 UID/GID
u64 bpf_get_current_uid_gid(void);
// 返回: (GID &amp;lt;&amp;lt; 32) | UID

// 获取进程名
long bpf_get_current_comm(void *buf, u32 size);

// 获取 cgroup ID
u64 bpf_get_current_cgroup_id(void);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="时间和随机">&lt;span>时间和随机&lt;/span>
 &lt;a href="#%e6%97%b6%e9%97%b4%e5%92%8c%e9%9a%8f%e6%9c%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 获取纳秒级时间戳
u64 bpf_ktime_get_ns(void);

// 获取启动时间
u64 bpf_ktime_get_boot_ns(void);

// 获取随机数
u32 bpf_get_prandom_u32(void);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="map-操作-1">&lt;span>Map 操作&lt;/span>
 &lt;a href="#map-%e6%93%8d%e4%bd%9c-1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>void *bpf_map_lookup_elem(struct bpf_map *map, const void *key);
long bpf_map_update_elem(struct bpf_map *map, const void *key,
 const void *value, u64 flags);
long bpf_map_delete_elem(struct bpf_map *map, const void *key);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="输出和调试">&lt;span>输出和调试&lt;/span>
 &lt;a href="#%e8%be%93%e5%87%ba%e5%92%8c%e8%b0%83%e8%af%95" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 性能事件输出
long bpf_perf_event_output(void *ctx, struct bpf_map *map,
 u64 flags, void *data, u64 size);

// 环形缓冲区输出 (推荐)
void *bpf_ringbuf_reserve(struct bpf_map *ringbuf, u64 size, u64 flags);
void bpf_ringbuf_submit(void *data, u64 flags);
void bpf_ringbuf_discard(void *data, u64 flags);

// 调试输出
long bpf_trace_printk(const char *fmt, u32 fmt_size, ...);
// 输出到 /sys/kernel/debug/tracing/trace_pipe&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="co-re-compile-once--run-everywhere">&lt;span>CO-RE (Compile Once – Run Everywhere)&lt;/span>
 &lt;a href="#co-re-compile-once--run-everywhere" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="btf-bpf-type-format">&lt;span>BTF (BPF Type Format)&lt;/span>
 &lt;a href="#btf-bpf-type-format" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>BTF 提供了内核类型信息，使 eBPF 程序可以跨内核版本运行。&lt;/p>
&lt;pre>&lt;code>// 传统方式 - 硬编码偏移
u32 pid = *(u32 *)(task &amp;#43; 0x4c0); // 不同内核偏移不同

// CO-RE 方式 - 使用 BTF
u32 pid;
bpf_core_read(&amp;amp;pid, sizeof(pid), &amp;amp;task-&amp;gt;pid);
// 或使用 BPF_CORE_READ 宏
u32 pid = BPF_CORE_READ(task, pid);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="字段重定位">&lt;span>字段重定位&lt;/span>
 &lt;a href="#%e5%ad%97%e6%ae%b5%e9%87%8d%e5%ae%9a%e4%bd%8d" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 自动处理结构体字段偏移变化
struct task_struct___old {
 int pid;
 // ... 旧版本布局
};

struct task_struct___new {
 int __pad;
 int pid;
 // ... 新版本布局
};

// CO-RE 会在加载时自动重定位
int pid = BPF_CORE_READ(task, pid);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="内核版本检测">&lt;span>内核版本检测&lt;/span>
 &lt;a href="#%e5%86%85%e6%a0%b8%e7%89%88%e6%9c%ac%e6%a3%80%e6%b5%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 检查字段是否存在
if (bpf_core_field_exists(task-&amp;gt;loginuid)) {
 // 使用 loginuid
}

// 检查枚举值
if (bpf_core_enum_value_exists(enum bpf_func_id, BPF_FUNC_xyz)) {
 // 使用新功能
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="android-特定考虑">&lt;span>Android 特定考虑&lt;/span>
 &lt;a href="#android-%e7%89%b9%e5%ae%9a%e8%80%83%e8%99%91" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="android-ebpf-限制">&lt;span>Android eBPF 限制&lt;/span>
 &lt;a href="#android-ebpf-%e9%99%90%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>SELinux 限制&lt;/strong>&lt;/li>
&lt;/ol>
&lt;pre>&lt;code># 检查 SELinux 域
adb shell cat /proc/self/attr/current

# 可能需要的 SELinux 策略
allow domain bpf:bpf { map_create prog_load };&lt;/code>&lt;/pre>&lt;ol start="2">
&lt;li>&lt;strong>内核配置差异&lt;/strong>&lt;/li>
&lt;/ol>
&lt;pre>&lt;code># 检查可用的 eBPF 特性
adb shell cat /proc/sys/kernel/unprivileged_bpf_disabled&lt;/code>&lt;/pre>&lt;ol start="3">
&lt;li>&lt;strong>库路径差异&lt;/strong>&lt;/li>
&lt;/ol>
&lt;pre>&lt;code># Android 系统库位置
/system/lib64/libc.so
/apex/com.android.runtime/lib64/bionic/libc.so
/system/lib64/libcrypto.so&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="android-专用追踪">&lt;span>Android 专用追踪&lt;/span>
 &lt;a href="#android-%e4%b8%93%e7%94%a8%e8%bf%bd%e8%b8%aa" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 追踪 Binder 调用
SEC(&amp;#34;tracepoint/binder/binder_transaction&amp;#34;)
int trace_binder(struct trace_event_raw_binder_transaction *ctx) {
 // 追踪进程间通信
 return 0;
}

// 追踪 ART 虚拟机
SEC(&amp;#34;uprobe/libart.so:_ZN3art...&amp;#34;)
int trace_art(struct pt_regs *ctx) {
 // 追踪 Java 方法调用
 return 0;
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="性能优化">&lt;span>性能优化&lt;/span>
 &lt;a href="#%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="减少-map-查找">&lt;span>减少 Map 查找&lt;/span>
 &lt;a href="#%e5%87%8f%e5%b0%91-map-%e6%9f%a5%e6%89%be" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 不好 - 多次查找
void *val1 = bpf_map_lookup_elem(&amp;amp;map, &amp;amp;key);
void *val2 = bpf_map_lookup_elem(&amp;amp;map, &amp;amp;key);

// 好 - 缓存结果
void *val = bpf_map_lookup_elem(&amp;amp;map, &amp;amp;key);
if (val) {
 // 使用 val 两次
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="使用-per-cpu-map">&lt;span>使用 Per-CPU Map&lt;/span>
 &lt;a href="#%e4%bd%bf%e7%94%a8-per-cpu-map" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 避免锁竞争
struct {
 __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
 __uint(max_entries, 1);
 __type(key, u32);
 __type(value, struct stats);
} stats SEC(&amp;#34;.maps&amp;#34;);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="减少栈使用">&lt;span>减少栈使用&lt;/span>
 &lt;a href="#%e5%87%8f%e5%b0%91%e6%a0%88%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// eBPF 栈大小限制为 512 字节

// 不好 - 大数组在栈上
char buf[256];

// 好 - 使用 Per-CPU 数组
struct {
 __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
 __uint(max_entries, 1);
 __type(key, u32);
 __type(value, char[256]);
} heap SEC(&amp;#34;.maps&amp;#34;);&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="调试技巧">&lt;span>调试技巧&lt;/span>
 &lt;a href="#%e8%b0%83%e8%af%95%e6%8a%80%e5%b7%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="查看验证器日志">&lt;span>查看验证器日志&lt;/span>
 &lt;a href="#%e6%9f%a5%e7%9c%8b%e9%aa%8c%e8%af%81%e5%99%a8%e6%97%a5%e5%bf%97" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 增加日志级别
echo 2 &amp;gt; /proc/sys/kernel/bpf_stats_enabled

# 查看加载失败的详细信息
bpftool prog load xxx.o /sys/fs/bpf/xxx verbose&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="追踪-bpf-事件">&lt;span>追踪 BPF 事件&lt;/span>
 &lt;a href="#%e8%bf%bd%e8%b8%aa-bpf-%e4%ba%8b%e4%bb%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 使用 bpftrace 追踪 bpf 系统调用
bpftrace -e &amp;#39;tracepoint:syscalls:sys_enter_bpf {
 printf(&amp;#34;bpf cmd=%d\n&amp;#34;, args-&amp;gt;cmd);
}&amp;#39;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="检查已加载的程序">&lt;span>检查已加载的程序&lt;/span>
 &lt;a href="#%e6%a3%80%e6%9f%a5%e5%b7%b2%e5%8a%a0%e8%bd%bd%e7%9a%84%e7%a8%8b%e5%ba%8f" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 列出所有 BPF 程序
bpftool prog list

# 查看程序详情
bpftool prog show id 123

# 查看字节码
bpftool prog dump xlated id 123

# 查看 JIT 编译后的代码
bpftool prog dump jited id 123&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="参考资料">&lt;span>参考资料&lt;/span>
 &lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.kernel.org/doc/html/latest/bpf/" target="_blank" rel="external nofollow noopener noreferrer">Linux Kernel BPF Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.cilium.io/en/stable/bpf/" target="_blank" rel="external nofollow noopener noreferrer">BPF and XDP Reference Guide&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.kernel.org/doc/html/latest/bpf/instruction-set.html" target="_blank" rel="external nofollow noopener noreferrer">eBPF Instruction Set&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.kernel.org/doc/html/latest/bpf/btf.html" target="_blank" rel="external nofollow noopener noreferrer">BTF Type Information&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Boot Image、Ramdisk 与 GKI 详解</title><link>https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/boot_image_and_gki/</link><pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/04-reference/foundations/boot_image_and_gki/</guid><description>&lt;h1 class="heading-element" id="boot-imageramdisk-与-gki-详解">&lt;span>Boot Image、Ramdisk 与 GKI 详解&lt;/span>
 &lt;a href="#boot-imageramdisk-%e4%b8%8e-gki-%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>深入理解 Android 启动镜像的结构、ramdisk 的作用以及 GKI (Generic Kernel Image) 架构，这些知识是理解 Root 方案（如 Magisk、KernelSU）工作原理的基础。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="1-android-启动流程概述">&lt;span>1. Android 启动流程概述&lt;/span>
 &lt;a href="#1-android-%e5%90%af%e5%8a%a8%e6%b5%81%e7%a8%8b%e6%a6%82%e8%bf%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="11-启动阶段">&lt;span>1.1 启动阶段&lt;/span>
 &lt;a href="#11-%e5%90%af%e5%8a%a8%e9%98%b6%e6%ae%b5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ Android 启动流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ ROM │ │ Boot- │ │ Kernel │ │ Init │ │
│ │ (固件) │───►│ loader │───►│ 启动 │───►│ 进程 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 硬件初始 │ │ 加载 │ │ 挂载 │ │ 启动 │ │
│ │ 化 │ │ boot.img │ │ ramdisk │ │ Zygote │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ System │ │
│ │ Server │ │
│ └──────────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ Launcher│ │
│ │ (桌面) │ │
│ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="12-各阶段说明">&lt;span>1.2 各阶段说明&lt;/span>
 &lt;a href="#12-%e5%90%84%e9%98%b6%e6%ae%b5%e8%af%b4%e6%98%8e" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>阶段&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;th>关键文件&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>BootROM&lt;/strong>&lt;/td>
 &lt;td>固化在芯片中的代码，初始化硬件&lt;/td>
 &lt;td>-&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Bootloader&lt;/strong>&lt;/td>
 &lt;td>引导加载程序，加载内核&lt;/td>
 &lt;td>aboot, ABL&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Kernel&lt;/strong>&lt;/td>
 &lt;td>Linux 内核启动&lt;/td>
 &lt;td>zImage, Image&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Ramdisk&lt;/strong>&lt;/td>
 &lt;td>临时根文件系统&lt;/td>
 &lt;td>ramdisk.cpio&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Init&lt;/strong>&lt;/td>
 &lt;td>第一个用户空间进程&lt;/td>
 &lt;td>/init&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Zygote&lt;/strong>&lt;/td>
 &lt;td>Android 进程孵化器&lt;/td>
 &lt;td>app_process&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="2-boot-image-结构">&lt;span>2. Boot Image 结构&lt;/span>
 &lt;a href="#2-boot-image-%e7%bb%93%e6%9e%84" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="21-boot-image-组成">&lt;span>2.1 Boot Image 组成&lt;/span>
 &lt;a href="#21-boot-image-%e7%bb%84%e6%88%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Boot Image (boot.img) 是 Android 设备启动的核心镜像：&lt;/p>
&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ boot.img 结构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 偏移量 大小 内容 │
│ ───────────────────────────────────────────────────────────────────── │
│ 0x0000 2KB Boot Header (启动头) │
│ - magic: &amp;#34;ANDROID!&amp;#34; │
│ - kernel_size │
│ - ramdisk_size │
│ - cmdline │
│ - ... │
│ ───────────────────────────────────────────────────────────────────── │
│ 对齐后 kernel_size Kernel (内核镜像) │
│ - 压缩的 Linux 内核 │
│ - 通常为 gzip 压缩 │
│ ───────────────────────────────────────────────────────────────────── │
│ 对齐后 ramdisk_size Ramdisk (初始内存盘) │
│ - CPIO 格式的文件系统 │
│ - gzip 压缩 │
│ ───────────────────────────────────────────────────────────────────── │
│ 对齐后 second_size Second Stage (可选) │
│ - 第二阶段引导程序 │
│ ───────────────────────────────────────────────────────────────────── │
│ 对齐后 dtb_size DTB (设备树, v2&amp;#43;) │
│ - Device Tree Blob │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="22-boot-header-版本">&lt;span>2.2 Boot Header 版本&lt;/span>
 &lt;a href="#22-boot-header-%e7%89%88%e6%9c%ac" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Android 不同版本使用不同的 boot header 格式：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>版本&lt;/th>
 &lt;th>Android 版本&lt;/th>
 &lt;th>特点&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>v0-v2&lt;/strong>&lt;/td>
 &lt;td>Android 9 及更早&lt;/td>
 &lt;td>传统格式&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>v3&lt;/strong>&lt;/td>
 &lt;td>Android 11&lt;/td>
 &lt;td>引入 vendor_boot&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>v4&lt;/strong>&lt;/td>
 &lt;td>Android 12+&lt;/td>
 &lt;td>支持 vendor_ramdisk&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="23-boot-header-v3v4-结构">&lt;span>2.3 Boot Header v3/v4 结构&lt;/span>
 &lt;a href="#23-boot-header-v3v4-%e7%bb%93%e6%9e%84" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// Android 12&amp;#43; boot header v4
struct boot_img_hdr_v4 {
 uint8_t magic[BOOT_MAGIC_SIZE]; // &amp;#34;ANDROID!&amp;#34;
 uint32_t kernel_size; // 内核大小
 uint32_t ramdisk_size; // ramdisk 大小
 uint32_t os_version; // 系统版本
 uint32_t header_size; // header 大小
 uint32_t reserved[4]; // 保留字段
 uint32_t header_version; // header 版本 (4)
 uint8_t cmdline[BOOT_ARGS_SIZE]; // 内核命令行
 uint32_t signature_size; // 签名大小 (v4 新增)
};&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="3-ramdisk-详解">&lt;span>3. Ramdisk 详解&lt;/span>
 &lt;a href="#3-ramdisk-%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="31-什么是-ramdisk">&lt;span>3.1 什么是 Ramdisk&lt;/span>
 &lt;a href="#31-%e4%bb%80%e4%b9%88%e6%98%af-ramdisk" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Ramdisk 是一个&lt;strong>临时的内存文件系统&lt;/strong>，在内核启动早期加载到内存中：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>格式&lt;/strong>: CPIO 归档，通常使用 gzip 压缩&lt;/li>
&lt;li>&lt;strong>作用&lt;/strong>: 提供启动初期所需的文件和程序&lt;/li>
&lt;li>&lt;strong>生命周期&lt;/strong>: 系统启动后可能被卸载或保留&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="32-ramdisk-内容">&lt;span>3.2 Ramdisk 内容&lt;/span>
 &lt;a href="#32-ramdisk-%e5%86%85%e5%ae%b9" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>ramdisk/
├── init # 第一个用户空间进程
├── init.rc # init 配置脚本
├── init.*.rc # 设备特定配置
├── default.prop # 默认属性
├── fstab.* # 文件系统挂载表
├── ueventd.rc # 设备节点配置
├── sbin/ # 系统二进制文件
│ ├── adbd # ADB 守护进程
│ └── ...
├── system/ # 指向 /system 的挂载点
├── vendor/ # 指向 /vendor 的挂载点
├── dev/ # 设备文件
├── proc/ # 进程文件系统
└── sys/ # sysfs 文件系统&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="33-first-stage-init-vs-second-stage-init">&lt;span>3.3 First Stage Init vs Second Stage Init&lt;/span>
 &lt;a href="#33-first-stage-init-vs-second-stage-init" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Android 使用两阶段 init：&lt;/p>
&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ Init 两阶段启动 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ First Stage Init │ │
│ │ │ │
│ │ 来源: boot.img 中的 ramdisk │ │
│ │ 任务: │ │
│ │ 1. 设置基本环境 (/dev, /proc, /sys) │ │
│ │ 2. 加载 SELinux 策略 │ │
│ │ 3. 挂载 /system, /vendor 等分区 │ │
│ │ 4. 切换到 Second Stage Init │ │
│ │ │ │
│ └────────────────────────────┬──────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ Second Stage Init │ │
│ │ │ │
│ │ 来源: /system/bin/init │ │
│ │ 任务: │ │
│ │ 1. 解析 init.rc 脚本 │ │
│ │ 2. 启动各类服务 (servicemanager, surfaceflinger...) │ │
│ │ 3. 启动 Zygote │ │
│ │ 4. 属性服务 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="34-不同类型的-ramdisk">&lt;span>3.4 不同类型的 Ramdisk&lt;/span>
 &lt;a href="#34-%e4%b8%8d%e5%90%8c%e7%b1%bb%e5%9e%8b%e7%9a%84-ramdisk" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Android 11+ 引入了多种 ramdisk：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>类型&lt;/th>
 &lt;th>位置&lt;/th>
 &lt;th>内容&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Generic Ramdisk&lt;/strong>&lt;/td>
 &lt;td>boot.img&lt;/td>
 &lt;td>通用 init 文件&lt;/td>
 &lt;td>First stage init&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Vendor Ramdisk&lt;/strong>&lt;/td>
 &lt;td>vendor_boot.img&lt;/td>
 &lt;td>厂商特定文件&lt;/td>
 &lt;td>硬件初始化&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Recovery Ramdisk&lt;/strong>&lt;/td>
 &lt;td>recovery.img&lt;/td>
 &lt;td>Recovery 环境&lt;/td>
 &lt;td>系统恢复&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="4-gki-generic-kernel-image">&lt;span>4. GKI (Generic Kernel Image)&lt;/span>
 &lt;a href="#4-gki-generic-kernel-image" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="41-gki-概述">&lt;span>4.1 GKI 概述&lt;/span>
 &lt;a href="#41-gki-%e6%a6%82%e8%bf%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>GKI 是 Google 在 Android 11 引入的&lt;strong>通用内核镜像&lt;/strong>架构：&lt;/p>
&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ 传统架构 vs GKI 架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 传统架构 (Android 10 及更早) │
│ ───────────────────────────────────────── │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ boot.img (设备特定) │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ Kernel │ │ Ramdisk │ │ DTB │ │ │
│ │ │ (设备特定) │ │ (设备特定) │ │ (设备特定) │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ - 厂商驱动 │ │ - init │ │ - 设备树 │ │ │
│ │ │ - 定制修改 │ │ - 配置文件 │ │ │ │ │
│ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ │
│ GKI 架构 (Android 11&amp;#43;) │
│ ───────────────────────────────────────── │
│ │
│ ┌──────────────────────────────────┐ ┌──────────────────────────────┐ │
│ │ boot.img (通用) │ │ vendor_boot.img │ │
│ │ ┌──────────────────────────┐ │ │ ┌──────────────────────┐ │ │
│ │ │ GKI Kernel │ │ │ │ Vendor Ramdisk │ │ │
│ │ │ (Google 提供) │ │ │ │ (厂商提供) │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ - 标准化接口 │ │ │ │ - 硬件初始化 │ │ │
│ │ │ - 稳定 ABI │ │ │ │ - 厂商配置 │ │ │
│ │ └──────────────────────────┘ │ │ └──────────────────────┘ │ │
│ │ ┌──────────────────────────┐ │ │ ┌──────────────────────┐ │ │
│ │ │ Generic Ramdisk │ │ │ │ DTB │ │ │
│ │ │ (Google 提供) │ │ │ │ (厂商提供) │ │ │
│ │ └──────────────────────────┘ │ │ └──────────────────────┘ │ │
│ └──────────────────────────────────┘ └──────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ vendor_dlkm (动态加载内核模块) │ │
│ │ 厂商驱动以 LKM 形式加载，不修改 GKI 内核 │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="42-gki-版本">&lt;span>4.2 GKI 版本&lt;/span>
 &lt;a href="#42-gki-%e7%89%88%e6%9c%ac" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>GKI 版本&lt;/th>
 &lt;th>Android 版本&lt;/th>
 &lt;th>内核版本&lt;/th>
 &lt;th>特点&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GKI 1.0&lt;/td>
 &lt;td>Android 11&lt;/td>
 &lt;td>5.4&lt;/td>
 &lt;td>初始版本&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GKI 2.0&lt;/td>
 &lt;td>Android 12&lt;/td>
 &lt;td>5.10&lt;/td>
 &lt;td>完整模块化&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GKI 2.0&lt;/td>
 &lt;td>Android 13&lt;/td>
 &lt;td>5.15&lt;/td>
 &lt;td>增强稳定性&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>GKI 2.0&lt;/td>
 &lt;td>Android 14&lt;/td>
 &lt;td>6.1&lt;/td>
 &lt;td>最新内核支持&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="43-gki-的优势">&lt;span>4.3 GKI 的优势&lt;/span>
 &lt;a href="#43-gki-%e7%9a%84%e4%bc%98%e5%8a%bf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ GKI 优势 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 更快的安全更新 │
│ - Google 可以直接推送内核安全补丁 │
│ - 无需等待厂商适配 │
│ │
│ 2. 标准化接口 (KMI - Kernel Module Interface) │
│ - 厂商驱动与内核解耦 │
│ - 驱动以模块形式加载 │
│ │
│ 3. 更小的 boot.img │
│ - 厂商特定内容移至 vendor_boot │
│ - 便于 OTA 更新 │
│ │
│ 4. 利于 Root 方案 │
│ - KernelSU 可以作为 LKM 加载 │
│ - 无需编译完整内核 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="44-检查设备是否使用-gki">&lt;span>4.4 检查设备是否使用 GKI&lt;/span>
 &lt;a href="#44-%e6%a3%80%e6%9f%a5%e8%ae%be%e5%a4%87%e6%98%af%e5%90%a6%e4%bd%bf%e7%94%a8-gki" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 检查内核版本
adb shell uname -r
# GKI 内核通常显示: 5.10.x-android13-x-xxxxx

# 检查是否存在 vendor_boot 分区
adb shell ls -la /dev/block/by-name/ | grep vendor_boot

# 检查内核配置
adb shell zcat /proc/config.gz | grep CONFIG_GKI&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="5-分区与镜像类型">&lt;span>5. 分区与镜像类型&lt;/span>
 &lt;a href="#5-%e5%88%86%e5%8c%ba%e4%b8%8e%e9%95%9c%e5%83%8f%e7%b1%bb%e5%9e%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="51-启动相关分区">&lt;span>5.1 启动相关分区&lt;/span>
 &lt;a href="#51-%e5%90%af%e5%8a%a8%e7%9b%b8%e5%85%b3%e5%88%86%e5%8c%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>分区&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;th>备注&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>boot&lt;/strong>&lt;/td>
 &lt;td>内核 + 通用 ramdisk&lt;/td>
 &lt;td>必需&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>vendor_boot&lt;/strong>&lt;/td>
 &lt;td>厂商 ramdisk + DTB&lt;/td>
 &lt;td>GKI 设备&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>init_boot&lt;/strong>&lt;/td>
 &lt;td>通用 ramdisk&lt;/td>
 &lt;td>Android 13+&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>recovery&lt;/strong>&lt;/td>
 &lt;td>Recovery 环境&lt;/td>
 &lt;td>部分设备&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>dtbo&lt;/strong>&lt;/td>
 &lt;td>设备树覆盖&lt;/td>
 &lt;td>独立分区&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="52-android-13-分区变化">&lt;span>5.2 Android 13+ 分区变化&lt;/span>
 &lt;a href="#52-android-13-%e5%88%86%e5%8c%ba%e5%8f%98%e5%8c%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>Android 12:
boot.img = kernel &amp;#43; generic_ramdisk

Android 13&amp;#43;:
boot.img = kernel only
init_boot.img = generic_ramdisk&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="53-ab-分区">&lt;span>5.3 A/B 分区&lt;/span>
 &lt;a href="#53-ab-%e5%88%86%e5%8c%ba" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>现代 Android 设备使用 A/B 分区方案：&lt;/p>
&lt;pre>&lt;code>boot_a boot_b
vendor_boot_a vendor_boot_b
system_a system_b
...&lt;/code>&lt;/pre>&lt;p>查看当前槽位：&lt;/p>
&lt;pre>&lt;code>adb shell getprop ro.boot.slot_suffix
# 输出: _a 或 _b&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="6-root-方案与启动镜像">&lt;span>6. Root 方案与启动镜像&lt;/span>
 &lt;a href="#6-root-%e6%96%b9%e6%a1%88%e4%b8%8e%e5%90%af%e5%8a%a8%e9%95%9c%e5%83%8f" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="61-magisk-修改方式">&lt;span>6.1 Magisk 修改方式&lt;/span>
 &lt;a href="#61-magisk-%e4%bf%ae%e6%94%b9%e6%96%b9%e5%bc%8f" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ Magisk 修改 Boot Image │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 原始 boot.img 修改后 boot.img │
│ ───────────────── ───────────────── │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Kernel │ │ Kernel │ (保持不变) │
│ └─────────────────┘ └─────────────────┘ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Ramdisk │ ───► │ Magisk Ramdisk │ │
│ │ │ │ │ │
│ │ - init │ │ - magiskinit │ ← 替换 init │
│ │ - init.rc │ │ - init.rc │ │
│ │ - ... │ │ - overlay.d/ │ ← Magisk 覆盖 │
│ │ │ │ - ... │ │
│ └─────────────────┘ └─────────────────┘ │
│ │
│ Magisk 注入流程: │
│ 1. magiskinit 作为 init 启动 │
│ 2. 执行 Magisk 初始化 │
│ 3. 挂载 Magisk 文件系统 │
│ 4. 启动 magiskd 守护进程 │
│ 5. 调用原始 init 继续启动 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="62-kernelsu-修改方式">&lt;span>6.2 KernelSU 修改方式&lt;/span>
 &lt;a href="#62-kernelsu-%e4%bf%ae%e6%94%b9%e6%96%b9%e5%bc%8f" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ KernelSU 修改 Boot Image │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 方式一: 修改内核 (编译时集成) │
│ ───────────────────────────────── │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 原始 Kernel │ ───► │ KernelSU Kernel │ ← 编译时集成 │
│ └─────────────────┘ └─────────────────┘ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Ramdisk │ │ Ramdisk │ (保持不变) │
│ └─────────────────┘ └─────────────────┘ │
│ │
│ │
│ 方式二: LKM 加载 (GKI 设备) │
│ ───────────────────────────────── │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ GKI Kernel │ │ GKI Kernel │ (保持不变) │
│ └─────────────────┘ └─────────────────┘ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Ramdisk │ ───► │ Ramdisk │ │
│ │ │ │ &amp;#43; kernelsu.ko │ ← 添加内核模块 │
│ │ │ │ &amp;#43; 加载脚本 │ │
│ └─────────────────┘ └─────────────────┘ │
│ │
│ 启动时加载 kernelsu.ko 模块，无需修改内核本身 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="7-实用工具与操作">&lt;span>7. 实用工具与操作&lt;/span>
 &lt;a href="#7-%e5%ae%9e%e7%94%a8%e5%b7%a5%e5%85%b7%e4%b8%8e%e6%93%8d%e4%bd%9c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="71-提取-boot-image">&lt;span>7.1 提取 Boot Image&lt;/span>
 &lt;a href="#71-%e6%8f%90%e5%8f%96-boot-image" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 方法一: 从设备提取
adb shell su -c &amp;#34;dd if=/dev/block/by-name/boot of=/sdcard/boot.img&amp;#34;
adb pull /sdcard/boot.img

# 方法二: 从 OTA 包提取
unzip ota.zip boot.img
# 或使用 payload-dumper
python payload_dumper.py payload.bin --out ./extracted/&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="72-解包-boot-image">&lt;span>7.2 解包 Boot Image&lt;/span>
 &lt;a href="#72-%e8%a7%a3%e5%8c%85-boot-image" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>使用 &lt;strong>magiskboot&lt;/strong> (推荐):&lt;/p>
&lt;pre>&lt;code># 解包
./magiskboot unpack boot.img

# 生成的文件:
# - kernel 内核
# - ramdisk.cpio ramdisk (压缩的)
# - dtb 设备树 (如果有)

# 解包 ramdisk
./magiskboot cpio ramdisk.cpio extract&lt;/code>&lt;/pre>&lt;p>使用 &lt;strong>AIK (Android Image Kitchen)&lt;/strong>:&lt;/p>
&lt;pre>&lt;code>./unpackimg.sh boot.img
# 输出到 split_img/ 和 ramdisk/&lt;/code>&lt;/pre>&lt;p>使用 &lt;strong>mkbootimg 工具链&lt;/strong>:&lt;/p>
&lt;pre>&lt;code># 解包
unpack_bootimg --boot_img boot.img --out boot_unpacked/

# 查看 boot.img 信息
unpack_bootimg --boot_img boot.img --format mkbootimg&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="73-打包-boot-image">&lt;span>7.3 打包 Boot Image&lt;/span>
 &lt;a href="#73-%e6%89%93%e5%8c%85-boot-image" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 使用 magiskboot
./magiskboot repack boot.img new_boot.img

# 使用 mkbootimg
mkbootimg \
 --kernel kernel \
 --ramdisk ramdisk.cpio.gz \
 --cmdline &amp;#34;...&amp;#34; \
 --os_version 13.0.0 \
 --os_patch_level 2024-01 \
 --header_version 4 \
 -o new_boot.img&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="74-刷入-boot-image">&lt;span>7.4 刷入 Boot Image&lt;/span>
 &lt;a href="#74-%e5%88%b7%e5%85%a5-boot-image" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 进入 fastboot 模式
adb reboot bootloader

# 刷入 boot 分区
fastboot flash boot new_boot.img

# 对于 A/B 设备，可能需要指定槽位
fastboot flash boot_a new_boot.img

# 重启
fastboot reboot&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="75-修改-ramdisk">&lt;span>7.5 修改 Ramdisk&lt;/span>
 &lt;a href="#75-%e4%bf%ae%e6%94%b9-ramdisk" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 1. 解包 ramdisk
mkdir ramdisk_dir
cd ramdisk_dir
gzip -dc ../ramdisk.cpio.gz | cpio -idmv

# 2. 修改文件
# 例如修改 init.rc, default.prop 等

# 3. 重新打包
find . | cpio -o -H newc | gzip &amp;gt; ../ramdisk.cpio.gz&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="76-验证-boot-image">&lt;span>7.6 验证 Boot Image&lt;/span>
 &lt;a href="#76-%e9%aa%8c%e8%af%81-boot-image" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 使用 avbtool 验证签名 (如果使用 AVB)
avbtool verify_image --image boot.img

# 查看 vbmeta 信息
avbtool info_image --image vbmeta.img&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="相关章节">&lt;span>相关章节&lt;/span>
 &lt;a href="#%e7%9b%b8%e5%85%b3%e7%ab%a0%e8%8a%82" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="../../02-Tools/Dynamic/kernelsu_guide.md">KernelSU 使用指南&lt;/a> - 基于内核的 Root 方案&lt;/li>
&lt;li>&lt;a href="../../02-Tools/Dynamic/kernelsu_internals.md">KernelSU 内部原理&lt;/a> - 内核模块实现&lt;/li>
&lt;li>&lt;a href="../Advanced/magisk_lsposed_internals.md">Magisk 与 LSPosed 原理&lt;/a> - 传统 Root 方案&lt;/li>
&lt;li>&lt;a href="../Advanced/aosp_and_system_customization.md">AOSP 与系统定制&lt;/a> - 系统级修改&lt;/li>
&lt;/ul></description></item><item><title>KernelSU 内部原理</title><link>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/kernelsu_internals/</link><pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/kernelsu_internals/</guid><description>&lt;h1 class="heading-element" id="kernelsu-内部原理">&lt;span>KernelSU 内部原理&lt;/span>
 &lt;a href="#kernelsu-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>深入分析 KernelSU 的内核级 root 实现机制，包括内核模块架构、权限提升原理、检测规避技术等核心内容。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="1-架构总览">&lt;span>1. 架构总览&lt;/span>
 &lt;a href="#1-%e6%9e%b6%e6%9e%84%e6%80%bb%e8%a7%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="11-整体架构图">&lt;span>1.1 整体架构图&lt;/span>
 &lt;a href="#11-%e6%95%b4%e4%bd%93%e6%9e%b6%e6%9e%84%e5%9b%be" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────────┐
│ KernelSU 技术架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ 用户空间 (User Space) │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ KernelSU │ │ Root │ │ 普通 │ │ │
│ │ │ Manager │ │ 应用 │ │ 应用 │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ └──────┬──────┘ └──────┬──────┘ └─────────────┘ │ │
│ │ │ │ │ │
│ │ │ Binder/ │ prctl() │ │
│ │ │ ioctl │ syscall │ │
│ │ ↓ ↓ │ │
│ └──────────┼──────────────────┼────────────────────────────────────────┘ │
│ │ │ │
│ ═══════════╪══════════════════╪═════════════════════════════════════════ │
│ │ System Call │ Interface │
│ ═══════════╪══════════════════╪═════════════════════════════════════════ │
│ │ │ │
│ ┌──────────┼──────────────────┼────────────────────────────────────────┐ │
│ │ ↓ ↓ 内核空间 (Kernel Space) │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ KernelSU 内核模块 │ │
│ │ │ │ │
│ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ │ ksu_hook │ │ allowlist │ │ sucompat │ │ │
│ │ │ │ │ │ │ │ │ │ │
│ │ │ │ - syscall │ │ - uid 管理 │ │ - su 二进制 │ │ │
│ │ │ │ hooking │ │ - 授权检查 │ │ 兼容层 │ │ │
│ │ │ │ - prctl │ │ - profile │ │ - Magisk │ │ │
│ │ │ │ handler │ │ 管理 │ │ API 兼容 │ │ │
│ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ │ │ │
│ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ │ module_fs │ │ selinux │ │ ksud │ │ │
│ │ │ │ │ │ patch │ │ daemon │ │ │
│ │ │ │ - overlayfs │ │ │ │ │ │ │
│ │ │ │ - mount │ │ - 策略修改 │ │ - 模块管理 │ │ │
│ │ │ │ 管理 │ │ - 权限控制 │ │ - 状态监控 │ │ │
│ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ │ │ │
│ │ └──────────────────────────────────────────────────────────────┘ │
│ │ │ │
│ │ ┌───────────────────────────────────────────────────────────────┐ │ │
│ │ │ Linux Kernel │ │
│ │ │ - task_struct 修改 │ │
│ │ │ - cred 结构体操作 │ │
│ │ │ - namespace 管理 │ │
│ │ └───────────────────────────────────────────────────────────────┘ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="12-核心组件">&lt;span>1.2 核心组件&lt;/span>
 &lt;a href="#12-%e6%a0%b8%e5%bf%83%e7%bb%84%e4%bb%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>组件&lt;/th>
 &lt;th>功能&lt;/th>
 &lt;th>实现方式&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>ksu_hook&lt;/strong>&lt;/td>
 &lt;td>系统调用拦截&lt;/td>
 &lt;td>kprobe/ftrace&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>allowlist&lt;/strong>&lt;/td>
 &lt;td>权限管理&lt;/td>
 &lt;td>内核数据结构&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>sucompat&lt;/strong>&lt;/td>
 &lt;td>su 兼容层&lt;/td>
 &lt;td>进程伪装&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>module_fs&lt;/strong>&lt;/td>
 &lt;td>模块文件系统&lt;/td>
 &lt;td>overlayfs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>ksud&lt;/strong>&lt;/td>
 &lt;td>用户空间守护进程&lt;/td>
 &lt;td>native daemon&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="2-内核模块实现">&lt;span>2. 内核模块实现&lt;/span>
 &lt;a href="#2-%e5%86%85%e6%a0%b8%e6%a8%a1%e5%9d%97%e5%ae%9e%e7%8e%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="21-模块加载机制">&lt;span>2.1 模块加载机制&lt;/span>
 &lt;a href="#21-%e6%a8%a1%e5%9d%97%e5%8a%a0%e8%bd%bd%e6%9c%ba%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 可以通过两种方式集成到内核：&lt;/p>
&lt;h4 class="heading-element" id="方式一编译时集成">&lt;span>方式一：编译时集成&lt;/span>
 &lt;a href="#%e6%96%b9%e5%bc%8f%e4%b8%80%e7%bc%96%e8%af%91%e6%97%b6%e9%9b%86%e6%88%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>// kernel/ksu/core.c
static int __init ksu_init(void)
{
 int ret;

 pr_info(&amp;#34;KernelSU version %d\n&amp;#34;, KSU_VERSION);

 // 初始化 allowlist
 ret = ksu_allowlist_init();
 if (ret)
 return ret;

 // 安装系统调用 hook
 ret = ksu_hook_init();
 if (ret)
 goto err_hook;

 // 初始化 SELinux 补丁
 ret = ksu_selinux_init();
 if (ret)
 goto err_selinux;

 // 启动 ksud 通信
 ret = ksu_ksud_init();
 if (ret)
 goto err_ksud;

 pr_info(&amp;#34;KernelSU initialized successfully\n&amp;#34;);
 return 0;

err_ksud:
 ksu_selinux_exit();
err_selinux:
 ksu_hook_exit();
err_hook:
 ksu_allowlist_exit();
 return ret;
}
core_initcall(ksu_init);&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="方式二lkm-动态加载-gki-20">&lt;span>方式二：LKM 动态加载 (GKI 2.0+)&lt;/span>
 &lt;a href="#%e6%96%b9%e5%bc%8f%e4%ba%8clkm-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd-gki-20" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code>// 作为可加载内核模块
static int __init ksu_module_init(void)
{
 // 检查内核版本兼容性
 if (!ksu_check_kernel_compat())
 return -ENODEV;

 return ksu_init();
}

static void __exit ksu_module_exit(void)
{
 ksu_exit();
}

module_init(ksu_module_init);
module_exit(ksu_module_exit);
MODULE_LICENSE(&amp;#34;GPL&amp;#34;);
MODULE_AUTHOR(&amp;#34;tiann&amp;#34;);
MODULE_DESCRIPTION(&amp;#34;KernelSU - Kernel-based root solution&amp;#34;);&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="22-系统调用-hook">&lt;span>2.2 系统调用 Hook&lt;/span>
 &lt;a href="#22-%e7%b3%bb%e7%bb%9f%e8%b0%83%e7%94%a8-hook" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 使用 kprobe 或 ftrace 来 hook 关键系统调用：&lt;/p>
&lt;pre>&lt;code>// hook prctl 系统调用处理 root 请求
static int ksu_handle_prctl(int option, unsigned long arg2,
 unsigned long arg3, unsigned long arg4,
 unsigned long arg5)
{
 // KernelSU 魔数检查
 if (option == KSU_PRCTL_MAGIC) {
 switch (arg2) {
 case CMD_GET_VERSION:
 return KSU_VERSION;

 case CMD_BECOME_ROOT:
 return ksu_become_root(current);

 case CMD_CHECK_ROOT:
 return ksu_is_allowed_uid(current_uid().val);

 case CMD_GET_ALLOW_LIST:
 return ksu_get_allowlist((void __user *)arg3, arg4);

 case CMD_SET_ALLOW_LIST:
 return ksu_set_allowlist((void __user *)arg3, arg4);
 }
 }

 return -ENOSYS; // 传递给原始 handler
}

// 使用 kprobe 安装 hook
static struct kprobe kp_prctl = {
 .symbol_name = &amp;#34;__arm64_sys_prctl&amp;#34;,
 .pre_handler = ksu_prctl_handler,
};&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="23-凭证修改-credential-modification">&lt;span>2.3 凭证修改 (Credential Modification)&lt;/span>
 &lt;a href="#23-%e5%87%ad%e8%af%81%e4%bf%ae%e6%94%b9-credential-modification" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 通过直接修改进程的 &lt;code>cred&lt;/code> 结构体来提升权限：&lt;/p>
&lt;pre>&lt;code>// kernel/ksu/core.c
int ksu_become_root(struct task_struct *task)
{
 struct cred *new_cred;
 struct ksu_profile *profile;

 // 检查是否在允许列表
 if (!ksu_is_allowed(task))
 return -EPERM;

 // 获取应用 profile
 profile = ksu_get_profile(task);

 // 准备新的凭证
 new_cred = prepare_creds();
 if (!new_cred)
 return -ENOMEM;

 // 设置 UID/GID 为 root
 new_cred-&amp;gt;uid = new_cred-&amp;gt;euid = new_cred-&amp;gt;suid = new_cred-&amp;gt;fsuid = GLOBAL_ROOT_UID;
 new_cred-&amp;gt;gid = new_cred-&amp;gt;egid = new_cred-&amp;gt;sgid = new_cred-&amp;gt;fsgid = GLOBAL_ROOT_GID;

 // 设置 capabilities
 if (profile &amp;amp;&amp;amp; profile-&amp;gt;capabilities) {
 new_cred-&amp;gt;cap_effective = profile-&amp;gt;cap_effective;
 new_cred-&amp;gt;cap_permitted = profile-&amp;gt;cap_permitted;
 new_cred-&amp;gt;cap_inheritable = profile-&amp;gt;cap_inheritable;
 } else {
 // 默认给予所有 capabilities
 cap_set_full(new_cred-&amp;gt;cap_effective);
 cap_set_full(new_cred-&amp;gt;cap_permitted);
 cap_set_full(new_cred-&amp;gt;cap_inheritable);
 }

 // 修改 SELinux 上下文 (如果配置了)
 if (profile &amp;amp;&amp;amp; profile-&amp;gt;selinux_context) {
 ksu_set_selinux_context(new_cred, profile-&amp;gt;selinux_context);
 }

 // 提交凭证修改
 return commit_creds(new_cred);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="24-内核数据结构">&lt;span>2.4 内核数据结构&lt;/span>
 &lt;a href="#24-%e5%86%85%e6%a0%b8%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// KernelSU 内部数据结构

// 允许列表条目
struct ksu_allow_entry {
 uid_t uid; // 应用 UID
 char package_name[256]; // 包名
 struct ksu_profile *profile; // 应用配置
 struct list_head list; // 链表节点
};

// 应用配置文件
struct ksu_profile {
 uid_t uid;
 gid_t gid;
 gid_t groups[32];
 int groups_count;

 kernel_cap_t cap_effective;
 kernel_cap_t cap_permitted;
 kernel_cap_t cap_inheritable;

 char selinux_context[128];

 struct {
 bool mount_namespace;
 bool pid_namespace;
 bool net_namespace;
 } namespace_flags;
};

// 全局状态
struct ksu_state {
 bool initialized;
 int version;

 spinlock_t allowlist_lock;
 struct list_head allowlist;

 struct proc_dir_entry *proc_entry;
 struct dentry *debug_root;
};&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="3-root-授权机制">&lt;span>3. Root 授权机制&lt;/span>
 &lt;a href="#3-root-%e6%8e%88%e6%9d%83%e6%9c%ba%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="31-授权流程">&lt;span>3.1 授权流程&lt;/span>
 &lt;a href="#31-%e6%8e%88%e6%9d%83%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────┐
│ KernelSU Root 授权流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 应用进程 KernelSU 内核模块 │
│ │ │ │
│ │ 1. prctl(KSU_MAGIC, │ │
│ │ CMD_BECOME_ROOT) │ │
│ │ ────────────────────────────&amp;gt;│ │
│ │ │ │
│ │ │ 2. 获取 current task │
│ │ │ 检查 uid/package │
│ │ │ │
│ │ │ 3. 查询 allowlist │
│ │ │ ┌─────────────────────┐ │
│ │ │ │ uid: 10086 │ │
│ │ │ │ pkg: com.example │ │
│ │ │ │ profile: {...} │ │
│ │ │ └─────────────────────┘ │
│ │ │ │
│ │ │ 4. 验证通过? │
│ │ │ ├─ Yes: prepare_creds() │
│ │ │ │ commit_creds() │
│ │ │ │ │
│ │ │ └─ No: return -EPERM │
│ │ │ │
│ │ 5. 返回结果 │ │
│ │ &amp;lt;────────────────────────────│ │
│ │ │ │
│ │ [成功后 uid=0, caps=full] │ │
│ ▼ ▼ │
│ │
└─────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="32-su-兼容实现">&lt;span>3.2 su 兼容实现&lt;/span>
 &lt;a href="#32-su-%e5%85%bc%e5%ae%b9%e5%ae%9e%e7%8e%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 提供了与传统 &lt;code>su&lt;/code> 命令兼容的接口：&lt;/p>
&lt;pre>&lt;code>// kernel/ksu/sucompat.c

// 当执行 /system/bin/su 时，内核会拦截并处理
static int ksu_su_handler(struct linux_binprm *bprm)
{
 const char *filename = bprm-&amp;gt;filename;

 // 检查是否是 su 调用
 if (!ksu_is_su_path(filename))
 return 0; // 不处理

 // 检查调用者权限
 if (!ksu_is_allowed(current)) {
 // 未授权，返回原始的 &amp;#34;su: not found&amp;#34; 行为
 return -ENOENT;
 }

 // 提升权限
 int ret = ksu_become_root(current);
 if (ret)
 return ret;

 // 执行请求的 shell
 const char *shell = ksu_get_shell(bprm);
 return ksu_exec_shell(shell, bprm);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="33-用户空间-api">&lt;span>3.3 用户空间 API&lt;/span>
 &lt;a href="#33-%e7%94%a8%e6%88%b7%e7%a9%ba%e9%97%b4-api" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>应用程序可以通过以下方式与 KernelSU 交互：&lt;/p>
&lt;pre>&lt;code>// 用户空间代码示例
#include &amp;lt;sys/prctl.h&amp;gt;

#define KSU_PRCTL_MAGIC 0x4B535500 // &amp;#34;KSU\0&amp;#34;
#define CMD_GET_VERSION 0
#define CMD_BECOME_ROOT 1
#define CMD_CHECK_ROOT 2

// 检查 KernelSU 是否存在
int ksu_get_version(void) {
 return prctl(KSU_PRCTL_MAGIC, CMD_GET_VERSION, 0, 0, 0);
}

// 请求 root 权限
int ksu_become_root(void) {
 return prctl(KSU_PRCTL_MAGIC, CMD_BECOME_ROOT, 0, 0, 0);
}

// 检查是否有 root 权限
int ksu_check_root(void) {
 return prctl(KSU_PRCTL_MAGIC, CMD_CHECK_ROOT, 0, 0, 0);
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="4-overlayfs-模块系统">&lt;span>4. OverlayFS 模块系统&lt;/span>
 &lt;a href="#4-overlayfs-%e6%a8%a1%e5%9d%97%e7%b3%bb%e7%bb%9f" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="41-模块存储结构">&lt;span>4.1 模块存储结构&lt;/span>
 &lt;a href="#41-%e6%a8%a1%e5%9d%97%e5%ad%98%e5%82%a8%e7%bb%93%e6%9e%84" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/data/adb/
├── ksu/
│ ├── bin/ # KernelSU 工具
│ │ └── ksud # 守护进程
│ ├── profile/ # 应用配置文件
│ │ ├── com.example.json
│ │ └── ...
│ └── log/ # 日志文件
│ └── ksud.log
├── modules/ # 已安装模块
│ ├── module_id_1/
│ │ ├── module.prop
│ │ ├── system/ # 要覆盖的系统文件
│ │ └── ...
│ └── module_id_2/
└── modules_update/ # 待更新模块&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="42-overlayfs-实现">&lt;span>4.2 OverlayFS 实现&lt;/span>
 &lt;a href="#42-overlayfs-%e5%ae%9e%e7%8e%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// kernel/ksu/module_fs.c

static int ksu_mount_overlayfs(const char *module_path)
{
 struct path lower, upper, work;
 struct ovl_fs_context ctx = {
 .redirect_mode = OVL_REDIRECT_ON,
 .index = true,
 };

 // 设置 lower (只读层): 原始系统分区
 kern_path(&amp;#34;/system&amp;#34;, LOOKUP_DIRECTORY, &amp;amp;lower);

 // 设置 upper (读写层): 模块修改
 char upper_path[PATH_MAX];
 snprintf(upper_path, sizeof(upper_path), &amp;#34;%s/system&amp;#34;, module_path);
 kern_path(upper_path, LOOKUP_DIRECTORY, &amp;amp;upper);

 // 设置 work 目录
 char work_path[PATH_MAX];
 snprintf(work_path, sizeof(work_path), &amp;#34;%s/.work&amp;#34;, module_path);
 kern_path(work_path, LOOKUP_DIRECTORY, &amp;amp;work);

 // 挂载 overlayfs
 return ovl_mount(&amp;amp;ctx, &amp;#34;/system&amp;#34;, &amp;amp;lower, &amp;amp;upper, &amp;amp;work);
}

// 模块加载流程
int ksu_load_modules(void)
{
 struct dir_context ctx;
 struct file *modules_dir;

 modules_dir = filp_open(&amp;#34;/data/adb/modules&amp;#34;, O_RDONLY | O_DIRECTORY, 0);
 if (IS_ERR(modules_dir))
 return PTR_ERR(modules_dir);

 // 遍历模块目录
 iterate_dir(modules_dir, &amp;amp;ctx);

 // 对每个模块应用 overlayfs
 list_for_each_entry(module, &amp;amp;ksu_modules, list) {
 if (module-&amp;gt;enabled) {
 ksu_mount_overlayfs(module-&amp;gt;path);
 }
 }

 filp_close(modules_dir, NULL);
 return 0;
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="43-magisk-模块兼容">&lt;span>4.3 Magisk 模块兼容&lt;/span>
 &lt;a href="#43-magisk-%e6%a8%a1%e5%9d%97%e5%85%bc%e5%ae%b9" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 实现了对 Magisk 模块格式的兼容：&lt;/p>
&lt;pre>&lt;code>// 解析 module.prop
static int ksu_parse_module_prop(const char *path, struct ksu_module *module)
{
 char buf[4096];
 struct file *f;

 f = filp_open(path, O_RDONLY, 0);
 if (IS_ERR(f))
 return PTR_ERR(f);

 kernel_read(f, buf, sizeof(buf), &amp;amp;f-&amp;gt;f_pos);
 filp_close(f, NULL);

 // 解析字段
 ksu_parse_prop_field(buf, &amp;#34;id&amp;#34;, module-&amp;gt;id, sizeof(module-&amp;gt;id));
 ksu_parse_prop_field(buf, &amp;#34;name&amp;#34;, module-&amp;gt;name, sizeof(module-&amp;gt;name));
 ksu_parse_prop_field(buf, &amp;#34;version&amp;#34;, module-&amp;gt;version, sizeof(module-&amp;gt;version));
 ksu_parse_prop_field(buf, &amp;#34;author&amp;#34;, module-&amp;gt;author, sizeof(module-&amp;gt;author));

 return 0;
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="5-隐蔽性设计">&lt;span>5. 隐蔽性设计&lt;/span>
 &lt;a href="#5-%e9%9a%90%e8%94%bd%e6%80%a7%e8%ae%be%e8%ae%a1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="51-内核级隐藏优势">&lt;span>5.1 内核级隐藏优势&lt;/span>
 &lt;a href="#51-%e5%86%85%e6%a0%b8%e7%ba%a7%e9%9a%90%e8%97%8f%e4%bc%98%e5%8a%bf" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 相比 Magisk 具有天然的隐蔽性优势：&lt;/p>
&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────┐
│ 检测点对比 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 检测方法 Magisk KernelSU │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ /system/bin/su 存在伪装文件 不存在 (内核直接处理) │
│ magiskd 进程 存在 不存在 │
│ /data/adb/magisk 存在 不存在 │
│ boot.img 修改 ramdisk 修改 内核修改 │
│ 属性检测 ro.boot.vbmeta.* 无明显特征 │
│ SELinux 上下文 需要额外处理 内核直接设置 │
│ 挂载点检测 存在 magisk 挂载 仅 overlayfs │
│ 内存特征 用户空间可检测 难以从用户空间检测 │
│ │
└─────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="52-隐藏策略实现">&lt;span>5.2 隐藏策略实现&lt;/span>
 &lt;a href="#52-%e9%9a%90%e8%97%8f%e7%ad%96%e7%95%a5%e5%ae%9e%e7%8e%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// kernel/ksu/hide.c

// 对未授权进程隐藏 KernelSU 存在
static bool ksu_should_hide(struct task_struct *task)
{
 // 1. 系统应用始终隐藏
 if (ksu_is_system_uid(task_uid(task).val))
 return true;

 // 2. 黑名单应用隐藏
 if (ksu_is_blacklisted(task))
 return true;

 // 3. 非授权应用隐藏
 if (!ksu_is_allowed(task))
 return true;

 return false;
}

// Hook open 系统调用，隐藏敏感文件
static int ksu_hide_open(struct file *file, const char __user *filename)
{
 char path[PATH_MAX];

 if (ksu_should_hide(current)) {
 if (strncpy_from_user(path, filename, PATH_MAX) &amp;gt; 0) {
 // 隐藏 /data/adb/ksu 目录
 if (strstr(path, &amp;#34;/data/adb/ksu&amp;#34;))
 return -ENOENT;

 // 隐藏 /proc/ksu 接口
 if (strstr(path, &amp;#34;/proc/ksu&amp;#34;))
 return -ENOENT;
 }
 }

 return 0; // 允许正常访问
}

// Hook stat 系统调用
static int ksu_hide_stat(const char __user *filename, struct stat *statbuf)
{
 if (ksu_should_hide(current)) {
 // 对敏感路径返回 ENOENT
 if (ksu_is_sensitive_path(filename))
 return -ENOENT;
 }
 return 0;
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="53-进程隐藏">&lt;span>5.3 进程隐藏&lt;/span>
 &lt;a href="#53-%e8%bf%9b%e7%a8%8b%e9%9a%90%e8%97%8f" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 从 /proc 隐藏 ksud 进程
static int ksu_hide_proc_pid(struct task_struct *task, struct task_struct *target)
{
 // 对黑名单应用隐藏 ksud
 if (ksu_should_hide(task)) {
 if (strcmp(target-&amp;gt;comm, &amp;#34;ksud&amp;#34;) == 0)
 return -ENOENT;
 }
 return 0;
}

// Hook proc_pid_readdir
static int ksu_proc_readdir_hook(struct file *file, struct dir_context *ctx)
{
 // 过滤掉 ksud 的 PID
 // ...
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="6-与-magisk-技术对比">&lt;span>6. 与 Magisk 技术对比&lt;/span>
 &lt;a href="#6-%e4%b8%8e-magisk-%e6%8a%80%e6%9c%af%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="61-root-实现对比">&lt;span>6.1 Root 实现对比&lt;/span>
 &lt;a href="#61-root-%e5%ae%9e%e7%8e%b0%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>方面&lt;/th>
 &lt;th>KernelSU&lt;/th>
 &lt;th>Magisk&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>su 实现位置&lt;/strong>&lt;/td>
 &lt;td>内核空间&lt;/td>
 &lt;td>用户空间 (magiskd)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>权限提升&lt;/strong>&lt;/td>
 &lt;td>直接修改 cred&lt;/td>
 &lt;td>IPC 请求 magiskd&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>进程数量&lt;/strong>&lt;/td>
 &lt;td>无额外守护进程&lt;/td>
 &lt;td>magiskd 常驻&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>系统调用&lt;/strong>&lt;/td>
 &lt;td>hook prctl&lt;/td>
 &lt;td>正常 execve su&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="62-代码对比">&lt;span>6.2 代码对比&lt;/span>
 &lt;a href="#62-%e4%bb%a3%e7%a0%81%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>&lt;strong>Magisk su 请求流程&lt;/strong>:&lt;/p>
&lt;pre>&lt;code>// 用户空间: su 进程
int main(int argc, char **argv) {
 // 连接到 magiskd
 int fd = connect_magiskd();

 // 发送 root 请求
 write(fd, &amp;amp;request, sizeof(request));

 // 等待授权结果
 read(fd, &amp;amp;response, sizeof(response));

 if (response.granted) {
 // magiskd 会 fork 一个 root shell
 // 通过 PTY 转发
 }
}&lt;/code>&lt;/pre>&lt;p>&lt;strong>KernelSU su 请求流程&lt;/strong>:&lt;/p>
&lt;pre>&lt;code>// 用户空间: 直接 syscall
int become_root(void) {
 // 一次 prctl 调用，内核直接处理
 return prctl(KSU_MAGIC, CMD_BECOME_ROOT, 0, 0, 0);
 // 返回后当前进程已经是 root
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="63-检测难度对比">&lt;span>6.3 检测难度对比&lt;/span>
 &lt;a href="#63-%e6%a3%80%e6%b5%8b%e9%9a%be%e5%ba%a6%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// Magisk 检测方法 (相对容易)
bool detect_magisk() {
 // 检查文件
 if (access(&amp;#34;/data/adb/magisk&amp;#34;, F_OK) == 0) return true;
 if (access(&amp;#34;/sbin/su&amp;#34;, F_OK) == 0) return true;

 // 检查进程
 if (find_process(&amp;#34;magiskd&amp;#34;)) return true;

 // 检查属性
 char value[PROP_VALUE_MAX];
 if (__system_property_get(&amp;#34;ro.boot.vbmeta.device_state&amp;#34;, value) &amp;gt; 0) {
 if (strcmp(value, &amp;#34;unlocked&amp;#34;) == 0) return true;
 }

 return false;
}

// KernelSU 检测方法 (非常困难)
bool detect_kernelsu() {
 // 尝试 prctl 探测 (KernelSU 可以针对性隐藏)
 int ret = prctl(0x4B535500, 0, 0, 0, 0);
 if (ret &amp;gt; 0) return true; // 但 KernelSU 可以对黑名单应用返回 -1

 // 检查内核模块 (需要 root 权限)
 // 用户空间几乎无法检测

 return false;
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="7-安全性分析">&lt;span>7. 安全性分析&lt;/span>
 &lt;a href="#7-%e5%ae%89%e5%85%a8%e6%80%a7%e5%88%86%e6%9e%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="71-攻击面">&lt;span>7.1 攻击面&lt;/span>
 &lt;a href="#71-%e6%94%bb%e5%87%bb%e9%9d%a2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────┐
│ KernelSU 攻击面分析 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 攻击向量 风险等级 缓解措施 │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ prctl 接口滥用 中 仅授权应用可调用 │
│ allowlist 篡改 高 内核空间存储，SELinux 保护 │
│ 内核模块漏洞 高 代码审计，安全开发 │
│ 提权漏洞利用 中 capability 最小化 │
│ Profile 注入 中 签名验证 │
│ │
└─────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="72-安全设计">&lt;span>7.2 安全设计&lt;/span>
 &lt;a href="#72-%e5%ae%89%e5%85%a8%e8%ae%be%e8%ae%a1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// 安全检查示例

// 1. 调用者验证
static bool ksu_verify_caller(struct task_struct *task)
{
 // 检查 UID 是否在允许列表
 if (!ksu_is_allowed_uid(task_uid(task).val))
 return false;

 // 检查包签名 (通过 ksud 验证)
 if (!ksu_verify_package_signature(task))
 return false;

 // 检查 SELinux 上下文
 if (!ksu_check_selinux_context(task))
 return false;

 return true;
}

// 2. Capability 限制
static int ksu_apply_profile_caps(struct cred *cred, struct ksu_profile *profile)
{
 // 只授予 profile 中声明的 capabilities
 // 而不是默认给全部
 if (profile-&amp;gt;capabilities) {
 cred-&amp;gt;cap_effective = profile-&amp;gt;cap_effective;
 cred-&amp;gt;cap_permitted = profile-&amp;gt;cap_permitted;
 }
 return 0;
}

// 3. 命名空间隔离
static int ksu_setup_namespace(struct ksu_profile *profile)
{
 if (profile-&amp;gt;namespace_flags.mount_namespace)
 unshare(CLONE_NEWNS);

 if (profile-&amp;gt;namespace_flags.pid_namespace)
 unshare(CLONE_NEWPID);

 return 0;
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="73-与-selinux-集成">&lt;span>7.3 与 SELinux 集成&lt;/span>
 &lt;a href="#73-%e4%b8%8e-selinux-%e9%9b%86%e6%88%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// SELinux 策略修改
static int ksu_patch_selinux_policy(void)
{
 // 添加 KernelSU 相关的 SELinux 规则
 // 允许授权进程执行特定操作

 const char *rules[] = {
 &amp;#34;allow ksu_client ksu_server:binder { call transfer }&amp;#34;,
 &amp;#34;allow ksu_client shell_data_file:file { read write }&amp;#34;,
 &amp;#34;allow ksu_client su:process { transition }&amp;#34;,
 NULL
 };

 for (int i = 0; rules[i]; i&amp;#43;&amp;#43;) {
 ksu_add_selinux_rule(rules[i]);
 }

 return 0;
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="相关章节">&lt;span>相关章节&lt;/span>
 &lt;a href="#%e7%9b%b8%e5%85%b3%e7%ab%a0%e8%8a%82" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="./kernelsu_guide.md">KernelSU 使用指南&lt;/a> - 安装配置和基本使用&lt;/li>
&lt;li>&lt;a href="../../04-Reference/Advanced/magisk_lsposed_internals.md">Magisk 与 LSPosed 原理&lt;/a> - 对比学习&lt;/li>
&lt;li>&lt;a href="./ebpf_internals.md">eBPF 内部原理&lt;/a> - 另一种内核技术&lt;/li>
&lt;li>&lt;a href="../../04-Reference/Advanced/android_sandbox_implementation.md">Android 沙箱实现&lt;/a> - Android 安全机制&lt;/li>
&lt;/ul></description></item><item><title>KernelSU 使用指南</title><link>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/kernelsu_guide/</link><pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/02-tools/dynamic/kernelsu_guide/</guid><description>&lt;h1 class="heading-element" id="kernelsu-使用指南">&lt;span>KernelSU 使用指南&lt;/span>
 &lt;a href="#kernelsu-%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>KernelSU 是一个基于内核的 Android Root 解决方案，通过修改内核来提供 root 权限，相比 Magisk 具有更强的隐蔽性和更底层的控制能力。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="1-kernelsu-简介">&lt;span>1. KernelSU 简介&lt;/span>
 &lt;a href="#1-kernelsu-%e7%ae%80%e4%bb%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>KernelSU 是一个运行在内核空间的 root 解决方案，它的核心理念是：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>内核级 Root&lt;/strong>: 直接在内核中实现 su，而非用户空间守护进程&lt;/li>
&lt;li>&lt;strong>按需授权&lt;/strong>: 应用程序需要主动声明 root 需求，而非被动授予&lt;/li>
&lt;li>&lt;strong>高度隐蔽&lt;/strong>: 对未授权应用完全透明，检测难度极大&lt;/li>
&lt;li>&lt;strong>GKI 兼容&lt;/strong>: 支持 Android 12+ 的 Generic Kernel Image&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="核心特性">&lt;span>核心特性&lt;/span>
 &lt;a href="#%e6%a0%b8%e5%bf%83%e7%89%b9%e6%80%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>内核模块&lt;/strong>&lt;/td>
 &lt;td>以 LKM (Loadable Kernel Module) 形式加载&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>UID 0 授权&lt;/strong>&lt;/td>
 &lt;td>直接在内核层面提升进程权限&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>App Profile&lt;/strong>&lt;/td>
 &lt;td>细粒度的应用权限控制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>模块系统&lt;/strong>&lt;/td>
 &lt;td>兼容 Magisk 模块 (systemless)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>OverlayFS&lt;/strong>&lt;/td>
 &lt;td>使用 overlayfs 实现系统文件修改&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="2-kernelsu-vs-magisk">&lt;span>2. KernelSU vs Magisk&lt;/span>
 &lt;a href="#2-kernelsu-vs-magisk" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="架构对比">&lt;span>架构对比&lt;/span>
 &lt;a href="#%e6%9e%b6%e6%9e%84%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────┐
│ Magisk 架构 │
├─────────────────────────────────────────────────────────────────┤
│ App 请求 root → magiskd (守护进程) → 授权/拒绝 │
│ ↓ │
│ 用户空间实现 su │
│ ↓ │
│ 修改 boot.img/ramdisk │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ KernelSU 架构 │
├─────────────────────────────────────────────────────────────────┤
│ App 请求 root → 内核模块直接处理 → 授权/拒绝 │
│ ↓ │
│ 内核空间实现 su │
│ ↓ │
│ 修改内核或加载内核模块 │
└─────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="详细对比">&lt;span>详细对比&lt;/span>
 &lt;a href="#%e8%af%a6%e7%bb%86%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>KernelSU&lt;/th>
 &lt;th>Magisk&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>实现层级&lt;/strong>&lt;/td>
 &lt;td>内核空间&lt;/td>
 &lt;td>用户空间&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Root 机制&lt;/strong>&lt;/td>
 &lt;td>内核直接授权&lt;/td>
 &lt;td>magiskd 守护进程&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>安装方式&lt;/strong>&lt;/td>
 &lt;td>刷入修改的内核&lt;/td>
 &lt;td>修改 boot.img&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>隐蔽性&lt;/strong>&lt;/td>
 &lt;td>极高 (内核级隐藏)&lt;/td>
 &lt;td>高 (DenyList)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>检测难度&lt;/strong>&lt;/td>
 &lt;td>非常难&lt;/td>
 &lt;td>较难&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>模块兼容&lt;/strong>&lt;/td>
 &lt;td>兼容大部分 Magisk 模块&lt;/td>
 &lt;td>原生支持&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>系统要求&lt;/strong>&lt;/td>
 &lt;td>Android 12+ GKI&lt;/td>
 &lt;td>Android 5.0+&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>设备支持&lt;/strong>&lt;/td>
 &lt;td>需要对应内核&lt;/td>
 &lt;td>几乎所有设备&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="选择建议">&lt;span>选择建议&lt;/span>
 &lt;a href="#%e9%80%89%e6%8b%a9%e5%bb%ba%e8%ae%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>
&lt;p>&lt;strong>选择 KernelSU&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>需要更强的隐蔽性（银行/支付应用）&lt;/li>
&lt;li>设备支持 GKI 内核&lt;/li>
&lt;li>想要更底层的系统控制&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>选择 Magisk&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>设备较旧，不支持 GKI&lt;/li>
&lt;li>需要更广泛的模块生态&lt;/li>
&lt;li>追求稳定和成熟的解决方案&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="3-安装-kernelsu">&lt;span>3. 安装 KernelSU&lt;/span>
 &lt;a href="#3-%e5%ae%89%e8%a3%85-kernelsu" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="31-检查设备兼容性">&lt;span>3.1 检查设备兼容性&lt;/span>
 &lt;a href="#31-%e6%a3%80%e6%9f%a5%e8%ae%be%e5%a4%87%e5%85%bc%e5%ae%b9%e6%80%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 检查内核版本
adb shell uname -r
# 输出示例: 5.10.101-android13-4-00001-g123456

# 检查是否为 GKI 内核
adb shell cat /proc/version
# GKI 内核通常包含 &amp;#34;android&amp;#34; 字样

# 检查架构
adb shell getprop ro.product.cpu.abi
# 常见: arm64-v8a&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="32-安装方法">&lt;span>3.2 安装方法&lt;/span>
 &lt;a href="#32-%e5%ae%89%e8%a3%85%e6%96%b9%e6%b3%95" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="方法一官方支持的设备推荐">&lt;span>方法一：官方支持的设备（推荐）&lt;/span>
 &lt;a href="#%e6%96%b9%e6%b3%95%e4%b8%80%e5%ae%98%e6%96%b9%e6%94%af%e6%8c%81%e7%9a%84%e8%ae%be%e5%a4%87%e6%8e%a8%e8%8d%90" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;ol>
&lt;li>访问 &lt;a href="https://github.com/tiann/KernelSU/releases" target="_blank" rel="external nofollow noopener noreferrer">KernelSU 官方发布页&lt;/a>&lt;/li>
&lt;li>下载适合你设备的 boot.img&lt;/li>
&lt;li>使用 fastboot 刷入：&lt;/li>
&lt;/ol>
&lt;pre>&lt;code># 进入 fastboot 模式
adb reboot bootloader

# 刷入 KernelSU boot 镜像
fastboot flash boot kernelsu_boot.img

# 重启设备
fastboot reboot&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="方法二gki-设备通用安装">&lt;span>方法二：GKI 设备通用安装&lt;/span>
 &lt;a href="#%e6%96%b9%e6%b3%95%e4%ba%8cgki-%e8%ae%be%e5%a4%87%e9%80%9a%e7%94%a8%e5%ae%89%e8%a3%85" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;pre>&lt;code># 1. 下载 AnyKernel3 格式的 KernelSU
# 从 GitHub Releases 下载 AnyKernel3-*.zip

# 2. 使用 TWRP 或其他 Recovery 刷入
adb reboot recovery
# 在 Recovery 中选择刷入 zip

# 或使用 fastboot boot 临时启动
fastboot boot twrp.img&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="方法三自行编译内核">&lt;span>方法三：自行编译内核&lt;/span>
 &lt;a href="#%e6%96%b9%e6%b3%95%e4%b8%89%e8%87%aa%e8%a1%8c%e7%bc%96%e8%af%91%e5%86%85%e6%a0%b8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>对于没有官方支持的设备，需要自行编译带 KernelSU 补丁的内核：&lt;/p>
&lt;pre>&lt;code># 1. 获取设备内核源码
git clone &amp;lt;your-device-kernel-source&amp;gt;

# 2. 集成 KernelSU
curl -LSs &amp;#34;https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh&amp;#34; | bash -

# 3. 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

# 4. 打包并刷入&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="33-安装-kernelsu-manager">&lt;span>3.3 安装 KernelSU Manager&lt;/span>
 &lt;a href="#33-%e5%ae%89%e8%a3%85-kernelsu-manager" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 从 GitHub 下载最新版 Manager APK
# https://github.com/tiann/KernelSU/releases

# 安装到设备
adb install KernelSU_*.apk&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="4-kernelsu-manager-使用">&lt;span>4. KernelSU Manager 使用&lt;/span>
 &lt;a href="#4-kernelsu-manager-%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="41-主界面">&lt;span>4.1 主界面&lt;/span>
 &lt;a href="#41-%e4%b8%bb%e7%95%8c%e9%9d%a2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>打开 KernelSU Manager 后，主界面显示：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>状态&lt;/strong>: 显示 KernelSU 是否正常工作&lt;/li>
&lt;li>&lt;strong>版本&lt;/strong>: 内核模块版本和 Manager 版本&lt;/li>
&lt;li>&lt;strong>超级用户&lt;/strong>: 管理 root 授权的应用&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="42-授权管理">&lt;span>4.2 授权管理&lt;/span>
 &lt;a href="#42-%e6%8e%88%e6%9d%83%e7%ae%a1%e7%90%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 采用&lt;strong>主动声明&lt;/strong>模式，应用需要在 AndroidManifest.xml 中声明：&lt;/p>
&lt;pre>&lt;code>&amp;lt;!-- 应用声明需要 root 权限 --&amp;gt;
&amp;lt;uses-permission android:name=&amp;#34;com.topjohnwu.magisk.permission.ROOT&amp;#34; /&amp;gt;&lt;/code>&lt;/pre>&lt;p>或者使用 KernelSU 特有的声明方式：&lt;/p>
&lt;pre>&lt;code>&amp;lt;meta-data
 android:name=&amp;#34;com.topjohnwu.superuser.REQUESTER&amp;#34;
 android:value=&amp;#34;true&amp;#34; /&amp;gt;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="43-app-profile应用配置文件">&lt;span>4.3 App Profile（应用配置文件）&lt;/span>
 &lt;a href="#43-app-profile%e5%ba%94%e7%94%a8%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 的独特功能，允许为每个应用定义详细的权限：&lt;/p>
&lt;pre>&lt;code>{
 &amp;#34;name&amp;#34;: &amp;#34;frida-server&amp;#34;,
 &amp;#34;uid&amp;#34;: 0,
 &amp;#34;gid&amp;#34;: 0,
 &amp;#34;groups&amp;#34;: [0, 1000, 1001],
 &amp;#34;capabilities&amp;#34;: [&amp;#34;CAP_SYS_PTRACE&amp;#34;, &amp;#34;CAP_DAC_OVERRIDE&amp;#34;],
 &amp;#34;context&amp;#34;: &amp;#34;u:r:su:s0&amp;#34;,
 &amp;#34;namespace&amp;#34;: {
 &amp;#34;mnt&amp;#34;: true,
 &amp;#34;pid&amp;#34;: false
 }
}&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="profile-配置项说明">&lt;span>Profile 配置项说明&lt;/span>
 &lt;a href="#profile-%e9%85%8d%e7%bd%ae%e9%a1%b9%e8%af%b4%e6%98%8e" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>字段&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>uid/gid&lt;/code>&lt;/td>
 &lt;td>进程的用户/组 ID&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>groups&lt;/code>&lt;/td>
 &lt;td>附加组 ID 列表&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>capabilities&lt;/code>&lt;/td>
 &lt;td>Linux capabilities 列表&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>context&lt;/code>&lt;/td>
 &lt;td>SELinux 上下文&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>namespace&lt;/code>&lt;/td>
 &lt;td>命名空间隔离设置&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="5-模块系统">&lt;span>5. 模块系统&lt;/span>
 &lt;a href="#5-%e6%a8%a1%e5%9d%97%e7%b3%bb%e7%bb%9f" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="51-模块兼容性">&lt;span>5.1 模块兼容性&lt;/span>
 &lt;a href="#51-%e6%a8%a1%e5%9d%97%e5%85%bc%e5%ae%b9%e6%80%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 兼容大部分 Magisk 模块，但有一些注意事项：&lt;/p>
&lt;ul>
&lt;li>✅ 纯 systemless 修改模块&lt;/li>
&lt;li>✅ 使用 OverlayFS 的模块&lt;/li>
&lt;li>⚠️ 依赖 Magisk 特定 API 的模块可能不兼容&lt;/li>
&lt;li>❌ 需要 Zygisk 的模块（需要额外配置）&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="52-安装模块">&lt;span>5.2 安装模块&lt;/span>
 &lt;a href="#52-%e5%ae%89%e8%a3%85%e6%a8%a1%e5%9d%97" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 方法一：通过 Manager 安装
# 在 KernelSU Manager 中点击 &amp;#34;模块&amp;#34; → &amp;#34;从本地安装&amp;#34;

# 方法二：命令行安装
adb push module.zip /data/local/tmp/
adb shell su -c &amp;#34;ksud module install /data/local/tmp/module.zip&amp;#34;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="53-zygisk-支持">&lt;span>5.3 Zygisk 支持&lt;/span>
 &lt;a href="#53-zygisk-%e6%94%af%e6%8c%81" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 通过 ZygiskNext 提供 Zygisk 兼容：&lt;/p>
&lt;pre>&lt;code># 1. 下载 ZygiskNext
# https://github.com/Dr-TSNG/ZygiskNext/releases

# 2. 作为 KernelSU 模块安装
adb push ZygiskNext-*.zip /data/local/tmp/
adb shell su -c &amp;#34;ksud module install /data/local/tmp/ZygiskNext-*.zip&amp;#34;

# 3. 重启设备
adb reboot&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="6-与逆向工具配合使用">&lt;span>6. 与逆向工具配合使用&lt;/span>
 &lt;a href="#6-%e4%b8%8e%e9%80%86%e5%90%91%e5%b7%a5%e5%85%b7%e9%85%8d%e5%90%88%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="61-配合-frida-使用">&lt;span>6.1 配合 Frida 使用&lt;/span>
 &lt;a href="#61-%e9%85%8d%e5%90%88-frida-%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 提供了优秀的 Frida 运行环境：&lt;/p>
&lt;pre>&lt;code># 1. 下载 frida-server
# https://github.com/frida/frida/releases
# 选择 frida-server-*-android-arm64.xz

# 2. 推送到设备
adb push frida-server /data/local/tmp/
adb shell chmod 755 /data/local/tmp/frida-server

# 3. 使用 KernelSU 运行 (通过 su)
adb shell
su
/data/local/tmp/frida-server &amp;amp;

# 4. 验证运行
frida-ps -U&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="使用-app-profile-优化-frida">&lt;span>使用 App Profile 优化 Frida&lt;/span>
 &lt;a href="#%e4%bd%bf%e7%94%a8-app-profile-%e4%bc%98%e5%8c%96-frida" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>创建专门的 Frida Profile 以获得必要权限：&lt;/p>
&lt;pre>&lt;code># 在 /data/adb/ksu/profile/ 创建配置
cat &amp;gt; /data/adb/ksu/profile/frida-server.json &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
{
 &amp;#34;uid&amp;#34;: 0,
 &amp;#34;gid&amp;#34;: 0,
 &amp;#34;groups&amp;#34;: [0, 1000, 1001, 1002, 3001, 3002, 3003],
 &amp;#34;capabilities&amp;#34;: [
 &amp;#34;CAP_SYS_PTRACE&amp;#34;,
 &amp;#34;CAP_DAC_OVERRIDE&amp;#34;,
 &amp;#34;CAP_DAC_READ_SEARCH&amp;#34;,
 &amp;#34;CAP_SYS_ADMIN&amp;#34;
 ],
 &amp;#34;context&amp;#34;: &amp;#34;u:r:su:s0&amp;#34;
}
EOF&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="62-配合-lsposed-使用">&lt;span>6.2 配合 LSPosed 使用&lt;/span>
 &lt;a href="#62-%e9%85%8d%e5%90%88-lsposed-%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 可以与 LSPosed 配合使用：&lt;/p>
&lt;pre>&lt;code># 1. 安装 ZygiskNext (如果还没安装)
ksud module install ZygiskNext.zip

# 2. 安装 LSPosed Zygisk 版本
# 从 https://github.com/LSPosed/LSPosed/releases 下载
ksud module install LSPosed-*.zip

# 3. 重启设备
reboot&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="63-隐藏-root-检测">&lt;span>6.3 隐藏 Root 检测&lt;/span>
 &lt;a href="#63-%e9%9a%90%e8%97%8f-root-%e6%a3%80%e6%b5%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 天生具有很强的隐蔽性，但某些应用仍可能检测到。配合以下模块可以增强隐藏效果：&lt;/p>
&lt;pre>&lt;code># Shamiko - 隐藏 root 和 Zygisk
ksud module install Shamiko-*.zip

# 在 KernelSU Manager 中配置:
# 1. 启用 &amp;#34;隐藏超级用户授权&amp;#34;
# 2. 将目标应用加入黑名单&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="64-配合-ebpf-使用">&lt;span>6.4 配合 eBPF 使用&lt;/span>
 &lt;a href="#64-%e9%85%8d%e5%90%88-ebpf-%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>KernelSU 提供了良好的内核访问能力，适合 eBPF 逆向：&lt;/p>
&lt;pre>&lt;code># 检查 eBPF 支持
adb shell su -c &amp;#34;ls /sys/fs/bpf&amp;#34;

# 运行 bpftrace (需要 root)
adb shell su -c &amp;#34;bpftrace -e &amp;#39;tracepoint:syscalls:sys_enter_openat { printf(\&amp;#34;%s %s\\n\&amp;#34;, comm, str(args-&amp;gt;filename)); }&amp;#39;&amp;#34;&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="7-常见问题与排查">&lt;span>7. 常见问题与排查&lt;/span>
 &lt;a href="#7-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e4%b8%8e%e6%8e%92%e6%9f%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="71-安装后无法启动">&lt;span>7.1 安装后无法启动&lt;/span>
 &lt;a href="#71-%e5%ae%89%e8%a3%85%e5%90%8e%e6%97%a0%e6%b3%95%e5%90%af%e5%8a%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 进入 fastboot 模式
# 长按 电源 &amp;#43; 音量下

# 刷回原版 boot
fastboot flash boot stock_boot.img
fastboot reboot&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="72-kernelsu-状态显示异常">&lt;span>7.2 KernelSU 状态显示异常&lt;/span>
 &lt;a href="#72-kernelsu-%e7%8a%b6%e6%80%81%e6%98%be%e7%a4%ba%e5%bc%82%e5%b8%b8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 检查内核模块是否加载
adb shell su -c &amp;#34;lsmod | grep kernelsu&amp;#34;

# 检查 ksudb 进程
adb shell su -c &amp;#34;ps -A | grep ksu&amp;#34;

# 查看内核日志
adb shell su -c &amp;#34;dmesg | grep -i ksu&amp;#34;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="73-应用无法获得-root">&lt;span>7.3 应用无法获得 root&lt;/span>
 &lt;a href="#73-%e5%ba%94%e7%94%a8%e6%97%a0%e6%b3%95%e8%8e%b7%e5%be%97-root" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 检查应用是否在授权列表
# KernelSU Manager → 超级用户 → 检查目标应用

# 检查 SELinux 状态
adb shell getenforce
# 如果是 Enforcing，某些操作可能被阻止

# 检查应用的 Profile 设置
cat /data/adb/ksu/profile/&amp;lt;package_name&amp;gt;.json&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="74-模块安装失败">&lt;span>7.4 模块安装失败&lt;/span>
 &lt;a href="#74-%e6%a8%a1%e5%9d%97%e5%ae%89%e8%a3%85%e5%a4%b1%e8%b4%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 查看模块安装日志
adb shell su -c &amp;#34;cat /data/adb/ksu/log/module_install.log&amp;#34;

# 手动安装模块进行调试
adb shell su -c &amp;#34;unzip -o /path/to/module.zip -d /data/adb/modules/&amp;lt;module_id&amp;gt;&amp;#34;&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="75-与其他-root-方案冲突">&lt;span>7.5 与其他 Root 方案冲突&lt;/span>
 &lt;a href="#75-%e4%b8%8e%e5%85%b6%e4%bb%96-root-%e6%96%b9%e6%a1%88%e5%86%b2%e7%aa%81" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># KernelSU 与 Magisk 不能同时使用
# 如果之前安装了 Magisk，需要先卸载

# 检查是否存在 Magisk
adb shell ls /data/adb/magisk

# 卸载 Magisk (如果存在)
# 在 Magisk Manager 中选择 &amp;#34;卸载&amp;#34; → &amp;#34;完全卸载&amp;#34;&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="相关章节">&lt;span>相关章节&lt;/span>
 &lt;a href="#%e7%9b%b8%e5%85%b3%e7%ab%a0%e8%8a%82" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ul>
&lt;li>&lt;a href="./kernelsu_internals.md">KernelSU 内部原理&lt;/a> - 深入理解 KernelSU 的技术实现&lt;/li>
&lt;li>&lt;a href="../../04-Reference/Advanced/magisk_lsposed_internals.md">Magisk 与 LSPosed 原理&lt;/a> - 对比学习 Magisk 方案&lt;/li>
&lt;li>&lt;a href="./frida_guide.md">Frida 完整指南&lt;/a> - 配合 Frida 进行动态分析&lt;/li>
&lt;li>&lt;a href="./ebpf_guide.md">eBPF 使用指南&lt;/a> - 使用 eBPF 进行内核级追踪&lt;/li>
&lt;/ul></description></item><item><title>构建最小化 Android 系统 (RootFS) 指南</title><link>https://overkazaf.github.io/reverse_engineering/android/04-reference/advanced/minimal_android_rootfs/</link><pubDate>Thu, 02 Oct 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/04-reference/advanced/minimal_android_rootfs/</guid><description>&lt;h1 class="heading-element" id="构建最小化-android-系统-rootfs-指南">&lt;span>构建最小化 Android 系统 (RootFS) 指南&lt;/span>
 &lt;a href="#%e6%9e%84%e5%bb%ba%e6%9c%80%e5%b0%8f%e5%8c%96-android-%e7%b3%bb%e7%bb%9f-rootfs-%e6%8c%87%e5%8d%97" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>构建一个完整的 AOSP (Android Open Source Project) 耗时巨大且对硬件要求苛刻。而构建一个最小化的 Android RootFS (Root File System) 是一个能让我们深刻理解 Android 启动流程和核心组件的绝佳实践。其目标是创建一个仅包含最基本组件、能够引导 Linux 内核并最终启动一个交互式 Shell 的系统。&lt;/p>
&lt;h2 class="heading-element" id="本文将指导你完成这一过程主要使用-qemu-作为目标平台">&lt;span>本文将指导你完成这一过程，主要使用 QEMU 作为目标平台。&lt;/span>
 &lt;a href="#%e6%9c%ac%e6%96%87%e5%b0%86%e6%8c%87%e5%af%bc%e4%bd%a0%e5%ae%8c%e6%88%90%e8%bf%99%e4%b8%80%e8%bf%87%e7%a8%8b%e4%b8%bb%e8%a6%81%e4%bd%bf%e7%94%a8-qemu-%e4%bd%9c%e4%b8%ba%e7%9b%ae%e6%a0%87%e5%b9%b3%e5%8f%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h2 class="heading-element" id="最小-android-根文件系统概述">&lt;span>最小 Android 根文件系统概述&lt;/span>
 &lt;a href="#%e6%9c%80%e5%b0%8f-android-%e6%a0%b9%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e6%a6%82%e8%bf%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>最小 Android 根文件系统（Minimal Android RootFS）是一个被精简到最低限度的 Android 用户空间环境，仅保留运行 Native 二进制文件所必需的核心组件。与完整的 Android 系统（通常包含数 GB 的框架、应用和服务）不同，一个最小 RootFS 通常只有几十 MB：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>组件&lt;/th>
 &lt;th>大小（约）&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>linker64&lt;/code>&lt;/td>
 &lt;td>~1 MB&lt;/td>
 &lt;td>动态链接器&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>libc.so&lt;/code>&lt;/td>
 &lt;td>~1 MB&lt;/td>
 &lt;td>C 标准库&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>libm.so&lt;/code> / &lt;code>libdl.so&lt;/code>&lt;/td>
 &lt;td>~200 KB&lt;/td>
 &lt;td>数学库 / 动态加载接口&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>sh&lt;/code> / &lt;code>toybox&lt;/code>&lt;/td>
 &lt;td>~500 KB&lt;/td>
 &lt;td>Shell 和基础命令&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>init&lt;/code>&lt;/td>
 &lt;td>~300 KB&lt;/td>
 &lt;td>初始化进程&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="为什么逆向工程师需要它">&lt;span>为什么逆向工程师需要它&lt;/span>
 &lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%86%e5%90%91%e5%b7%a5%e7%a8%8b%e5%b8%88%e9%9c%80%e8%a6%81%e5%ae%83" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>隔离的执行环境&lt;/strong>：不启动完整 Android 框架即可运行目标 SO，排除框架层干扰&lt;/li>
&lt;li>&lt;strong>可控的测试条件&lt;/strong>：精确控制环境中存在哪些库和文件，方便绕过环境检测&lt;/li>
&lt;li>&lt;strong>快速迭代&lt;/strong>：无需刷机或重启设备，修改环境后立即测试&lt;/li>
&lt;li>&lt;strong>反检测规避&lt;/strong>：APP 的反调试逻辑依赖完整环境中的特定文件和进程，在最小 RootFS 中这些检查点天然缺失&lt;/li>
&lt;li>&lt;strong>底层学习&lt;/strong>：深入理解 linker 如何加载 SO、依赖如何解析、JNI 如何初始化&lt;/li>
&lt;/ol>
&lt;h3 class="heading-element" id="典型使用场景">&lt;span>典型使用场景&lt;/span>
 &lt;a href="#%e5%85%b8%e5%9e%8b%e4%bd%bf%e7%94%a8%e5%9c%ba%e6%99%af" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>场景 1：分析某 APP 的加密 SO
 完整设备 → 反调试检测 → 被杀进程
 最小 RootFS → 无检测 → 自由调试

场景 2：批量调用签名函数
 Frida Hook → 依赖设备、慢
 最小 RootFS &amp;#43; dlopen → 脱离设备、快&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="核心概念与启动流程">&lt;span>核心概念与启动流程&lt;/span>
 &lt;a href="#%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5%e4%b8%8e%e5%90%af%e5%8a%a8%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>Bootloader&lt;/strong>: 设备上电后执行的第一段代码，负责初始化硬件并加载 Linux 内核到内存。&lt;/li>
&lt;li>&lt;strong>Kernel&lt;/strong>: 内核被加载后，开始初始化各种驱动、内存管理等，然后挂载一个临时的根文件系统 (ramdisk)。&lt;/li>
&lt;li>&lt;strong>&lt;code>init&lt;/code> 进程&lt;/strong>: 内核在用户空间启动的第一个进程，其 PID 为 1。它是所有其他用户空间进程的祖先。&lt;/li>
&lt;li>&lt;strong>&lt;code>init.rc&lt;/code>&lt;/strong>: &lt;code>init&lt;/code> 进程会解析这个配置文件，根据其中的指令执行动作，如挂载文件系统、设置系统属性、启动服务等。&lt;/li>
&lt;/ol>
&lt;p>我们的目标就是创建一个极简的 RootFS，其中包含 &lt;code>init&lt;/code> 程序和一个能被它启动的 Shell。&lt;/p>
&lt;h2 class="heading-element" id="最小系统的核心组件">&lt;span>最小系统的核心组件&lt;/span>
 &lt;a href="#%e6%9c%80%e5%b0%8f%e7%b3%bb%e7%bb%9f%e7%9a%84%e6%a0%b8%e5%bf%83%e7%bb%84%e4%bb%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>一个能启动到 Shell 的最小 Android 系统，必须包含以下组件：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Linux Kernel&lt;/strong>: 操作系统的核心。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>init&lt;/code>&lt;/strong>: 用户空间的守护神，来自 AOSP 源码 &lt;code>system/core/init&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>C 库&lt;/strong>: &lt;code>libc.so&lt;/code> (C 标准库), &lt;code>libm.so&lt;/code> (数学库)。所有原生程序都依赖它。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>动态链接器&lt;/strong>: &lt;code>linker&lt;/code> 或 &lt;code>linker64&lt;/code>，用于加载 &lt;code>.so&lt;/code> 动态库。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Shell&lt;/strong>: &lt;code>sh&lt;/code>，我们的交互界面，通常由 &lt;code>toybox&lt;/code> 或 &lt;code>toolbox&lt;/code> 提供。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>init.rc&lt;/code>&lt;/strong>: 一个最简单的配置文件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>基本目录结构&lt;/strong>: &lt;code>/dev&lt;/code>, &lt;code>/proc&lt;/code>, &lt;code>/sys&lt;/code>, &lt;code>/system/bin&lt;/code>。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="构建方法">&lt;span>构建方法&lt;/span>
 &lt;a href="#%e6%9e%84%e5%bb%ba%e6%96%b9%e6%b3%95" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>除了后续详细讲解的&amp;quot;从 AOSP 源码交叉编译&amp;quot;方式外，还有几种常见策略：&lt;/p>
&lt;h3 class="heading-element" id="方法一从-aosp-编译产物中提取">&lt;span>方法一：从 AOSP 编译产物中提取&lt;/span>
 &lt;a href="#%e6%96%b9%e6%b3%95%e4%b8%80%e4%bb%8e-aosp-%e7%bc%96%e8%af%91%e4%ba%a7%e7%89%a9%e4%b8%ad%e6%8f%90%e5%8f%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>从完整 AOSP 编译后的 &lt;code>out/target/product/&amp;lt;device&amp;gt;/&lt;/code> 目录中提取所需文件：&lt;/p>
&lt;pre>&lt;code>PRODUCT_DIR=/aosp/out/target/product/generic_arm64
ROOTFS=./my_rootfs

mkdir -p $ROOTFS/{system/bin,system/lib64,dev,proc,sys,data}

# 提取核心二进制和库
cp $PRODUCT_DIR/system/bin/{linker64,toybox,sh} $ROOTFS/system/bin/
cp $PRODUCT_DIR/system/lib64/{libc.so,libm.so,libdl.so,liblog.so} $ROOTFS/system/lib64/&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="方法二从现有设备提取">&lt;span>方法二：从现有设备提取&lt;/span>
 &lt;a href="#%e6%96%b9%e6%b3%95%e4%ba%8c%e4%bb%8e%e7%8e%b0%e6%9c%89%e8%ae%be%e5%a4%87%e6%8f%90%e5%8f%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>如果有已 Root 的设备，通过 &lt;code>adb&lt;/code> 直接拉取：&lt;/p>
&lt;pre>&lt;code>ROOTFS=./my_rootfs
mkdir -p $ROOTFS/{system/bin,system/lib64}

adb pull /system/bin/linker64 $ROOTFS/system/bin/
adb pull /system/bin/toybox $ROOTFS/system/bin/
adb pull /system/lib64/libc.so $ROOTFS/system/lib64/
adb pull /system/lib64/libm.so $ROOTFS/system/lib64/
adb pull /system/lib64/libdl.so $ROOTFS/system/lib64/&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="方法三从-factory-image-解包">&lt;span>方法三：从 Factory Image 解包&lt;/span>
 &lt;a href="#%e6%96%b9%e6%b3%95%e4%b8%89%e4%bb%8e-factory-image-%e8%a7%a3%e5%8c%85" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>适用于没有设备也没有编译环境的情况。从 &lt;a href="https://developers.google.com/android/images" target="_blank" rel="external nofollow noopener noreferrer">Google 官方&lt;/a> 下载 Factory Image，解包 &lt;code>system.img&lt;/code> 后提取：&lt;/p>
&lt;pre>&lt;code>unzip image-xxx.zip
simg2img system.img system.raw.img
mkdir /mnt/android_system
sudo mount -o ro system.raw.img /mnt/android_system
cp /mnt/android_system/bin/linker64 ./my_rootfs/system/bin/
# ... 提取其他所需文件
sudo umount /mnt/android_system&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="关键目录结构">&lt;span>关键目录结构&lt;/span>
 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;pre>&lt;code>/ (根目录)
├── system/ # 系统分区（只读）
│ ├── bin/ # 系统二进制 (linker64, sh, toybox)
│ ├── lib64/ # 64位系统共享库
│ └── lib/ # 32位系统共享库
├── vendor/ # 厂商分区（硬件相关库）
│ ├── lib64/ # 厂商64位库
│ └── lib/ # 厂商32位库
├── data/ # 用户数据分区（可读写）
│ ├── app/ # 已安装应用
│ └── local/tmp/ # 临时文件（逆向常用）
├── proc/ # 进程信息（虚拟文件系统）
├── sys/ # 内核参数（虚拟文件系统）
├── dev/ # 设备节点 (null, zero, urandom, pts/)
└── init.rc # 初始化配置&lt;/code>&lt;/pre>&lt;p>各目录在最小 RootFS 中的优先级：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>目录&lt;/th>
 &lt;th>优先级&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>/system/bin/&lt;/code>&lt;/td>
 &lt;td>&lt;strong>必需&lt;/strong>&lt;/td>
 &lt;td>必须包含 &lt;code>linker64&lt;/code> 和 &lt;code>sh&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>/system/lib64/&lt;/code>&lt;/td>
 &lt;td>&lt;strong>必需&lt;/strong>&lt;/td>
 &lt;td>必须包含 &lt;code>libc.so&lt;/code>、&lt;code>libm.so&lt;/code>、&lt;code>libdl.so&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>/proc/&lt;/code>&lt;/td>
 &lt;td>&lt;strong>必需&lt;/strong>&lt;/td>
 &lt;td>需挂载 procfs，很多程序读取 &lt;code>/proc/self/maps&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>/dev/&lt;/code>&lt;/td>
 &lt;td>&lt;strong>必需&lt;/strong>&lt;/td>
 &lt;td>需挂载 tmpfs 并创建基础设备节点&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>/sys/&lt;/code>&lt;/td>
 &lt;td>推荐&lt;/td>
 &lt;td>部分程序检测 sysfs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>/data/local/tmp/&lt;/code>&lt;/td>
 &lt;td>推荐&lt;/td>
 &lt;td>常用的工作目录&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>/vendor/&lt;/code>&lt;/td>
 &lt;td>可选&lt;/td>
 &lt;td>仅当目标 SO 依赖厂商库时需要&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="构建步骤详解">&lt;span>构建步骤详解&lt;/span>
 &lt;a href="#%e6%9e%84%e5%bb%ba%e6%ad%a5%e9%aa%a4%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="step-1-准备环境与工具链">&lt;span>Step 1: 准备环境与工具链&lt;/span>
 &lt;a href="#step-1-%e5%87%86%e5%a4%87%e7%8e%af%e5%a2%83%e4%b8%8e%e5%b7%a5%e5%85%b7%e9%93%be" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>你需要一个 Linux 环境（如 Ubuntu）和用于交叉编译的工具链。最简单的方法是从 AOSP 预编译库中获取。&lt;/p>
&lt;pre>&lt;code># Download AOSP prebuilt aarch64 (ARM64) Toolchain
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

# Add Toolchain Path to Environment variables
export PATH=$(pwd)/aarch64-linux-android-4.9/bin:$PATH
export CROSS_COMPILE=aarch64-linux-android-&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="step-2-获取并编译-linux-内核">&lt;span>Step 2: 获取并编译 Linux 内核&lt;/span>
 &lt;a href="#step-2-%e8%8e%b7%e5%8f%96%e5%b9%b6%e7%bc%96%e8%af%91-linux-%e5%86%85%e6%a0%b8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>git clone https://android.googlesource.com/kernel/common.git
cd common

# Switch to a Stable branch
git checkout android-xxxx

# 配置内核
export ARCH=arm64
make defconfig

# 编译内核
make -j$(nproc)

# Compile Success. After this, Image.gz will be generated in arch/arm64/boot/ directory&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="step-3-构建最小化-rootfs">&lt;span>Step 3: 构建最小化 RootFS&lt;/span>
 &lt;a href="#step-3-%e6%9e%84%e5%bb%ba%e6%9c%80%e5%b0%8f%e5%8c%96-rootfs" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>mkdir -p my_rootfs/{dev,proc,sys,system/bin,system/lib64}
cd my_rootfs&lt;/code>&lt;/pre>&lt;p>这一步比较复杂，因为需要从完整的 AOSP 源码中单独编译。一个简化的方法是&lt;strong>直接从一个现有的 Android 系统或 AOSP 编译产物中提取这些预编译好的二进制文件&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>从 AOSP 编译产物 &lt;code>out/target/product/&amp;lt;device&amp;gt;/system/&lt;/code> 中找到以下文件：&lt;/p>
&lt;ul>
&lt;li>&lt;code>bin/linker64&lt;/code> -&amp;gt; 复制到 &lt;code>my_rootfs/system/bin/&lt;/code>&lt;/li>
&lt;li>&lt;code>bin/init&lt;/code> -&amp;gt; 复制到 &lt;code>my_rootfs/&lt;/code>&lt;/li>
&lt;li>&lt;code>bin/toybox&lt;/code> -&amp;gt; 复制到 &lt;code>my_rootfs/system/bin/&lt;/code>&lt;/li>
&lt;li>&lt;code>lib64/libc.so&lt;/code>, &lt;code>lib64/libm.so&lt;/code> -&amp;gt; 复制到 &lt;code>my_rootfs/system/lib64/&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>为 &lt;code>toybox&lt;/code> 创建各种命令的软链接：&lt;/p>
&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>cd my_rootfs/system/bin
for cmd in $(./toybox); do
 ln -s toybox $cmd
done
cd ../../&lt;/code>&lt;/pre>&lt;p>在 &lt;code>my_rootfs/&lt;/code> 目录下创建一个 &lt;code>init.rc&lt;/code> 文件，内容如下：&lt;/p>
&lt;pre>&lt;code># init.rc for minimal android

on early-init
 mount tmpfs tmpfs /dev
 mkdir /dev/pts
 mount devpts devpts /dev/pts
 mount proc proc /proc
 mount sysfs sysfs /sys

on init
 export PATH /system/bin
 export LD_LIBRARY_PATH /system/lib64

on post-fs
 # In a real system, we would mount /data, /cache, etc.
 # Here we just start the shell.

service shell /system/bin/sh
 class core
 console
 disabled
 user shell
 group shell
 seclabel u:r:shell:s0

on property:sys.boot_completed=1
 start shell&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="step-4-打包并运行">&lt;span>Step 4: 打包并运行&lt;/span>
 &lt;a href="#step-4-%e6%89%93%e5%8c%85%e5%b9%b6%e8%bf%90%e8%a1%8c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>打包 RootFS&lt;/strong>: 我们需要将 &lt;code>my_rootfs&lt;/code> 目录打包成一个 &lt;code>cpio&lt;/code> 归档，并用 &lt;code>gzip&lt;/code> 压缩，作为内核的 &lt;code>initramfs&lt;/code>。
&lt;pre>&lt;code>cd my_rootfs
find . | cpio -o -H newc | gzip &amp;gt; ../rootfs.cpio.gz
cd ..&lt;/code>&lt;/pre>&lt;/li>
&lt;li>&lt;strong>运行 QEMU&lt;/strong>: 确保 &lt;code>common/arch/arm64/boot/Image.gz&lt;/code> 和 &lt;code>rootfs.cpio.gz&lt;/code> 在当前目录下。
&lt;pre>&lt;code>qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -kernel common/arch/arm64/boot/Image.gz -initrd rootfs.cpio.gz -nographic -append &amp;#34;console=ttyAMA0&amp;#34;&lt;/code>&lt;/pre>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 class="heading-element" id="linker-与动态库">&lt;span>Linker 与动态库&lt;/span>
 &lt;a href="#linker-%e4%b8%8e%e5%8a%a8%e6%80%81%e5%ba%93" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Android 的动态链接机制是理解和运用最小 RootFS 的核心。与标准 Linux 使用 &lt;code>ld-linux.so&lt;/code> 不同，Android 使用自己的 &lt;code>linker&lt;/code>（32位）或 &lt;code>linker64&lt;/code>（64位）。&lt;/p>
&lt;h3 class="heading-element" id="linker-的工作流程">&lt;span>linker 的工作流程&lt;/span>
 &lt;a href="#linker-%e7%9a%84%e5%b7%a5%e4%bd%9c%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>Kernel 加载 ELF → 读取 PT_INTERP → 找到 /system/bin/linker64
 ↓
linker64: 解析 PT_LOAD 段 → 映射到内存
 ↓
解析 DT_NEEDED → 递归加载所有依赖库
 ↓
处理重定位（GOT/PLT 表） → 调用 .init_array → 跳转入口点&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="ld_library_path-与库搜索">&lt;span>LD_LIBRARY_PATH 与库搜索&lt;/span>
 &lt;a href="#ld_library_path-%e4%b8%8e%e5%ba%93%e6%90%9c%e7%b4%a2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># linker 搜索 SO 的顺序：
# 1. DT_RUNPATH (编译时嵌入 ELF)
# 2. LD_LIBRARY_PATH 环境变量
# 3. 默认路径 (/system/lib64 等)

export LD_LIBRARY_PATH=/system/lib64:/vendor/lib64:/data/local/tmp

# 查看 SO 的依赖
readelf -d target.so | grep NEEDED&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="在最小环境中手动加载-so">&lt;span>在最小环境中手动加载 SO&lt;/span>
 &lt;a href="#%e5%9c%a8%e6%9c%80%e5%b0%8f%e7%8e%af%e5%a2%83%e4%b8%ad%e6%89%8b%e5%8a%a8%e5%8a%a0%e8%bd%bd-so" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// loader.c - 通用 SO 加载器
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;dlfcn.h&amp;gt;

int main(int argc, char *argv[]) {
 if (argc &amp;lt; 3) {
 printf(&amp;#34;Usage: %s &amp;lt;so_path&amp;gt; &amp;lt;func_name&amp;gt;\n&amp;#34;, argv[0]);
 return 1;
 }
 void *handle = dlopen(argv[1], RTLD_NOW);
 if (!handle) { printf(&amp;#34;dlopen: %s\n&amp;#34;, dlerror()); return 1; }

 void *func = dlsym(handle, argv[2]);
 if (!func) { printf(&amp;#34;dlsym: %s\n&amp;#34;, dlerror()); dlclose(handle); return 1; }

 printf(&amp;#34;[&amp;#43;] %s @ %p\n&amp;#34;, argv[2], func);
 int (*f)(void) = (int (*)(void))func;
 printf(&amp;#34;[&amp;#43;] Result: %d\n&amp;#34;, f());
 dlclose(handle);
 return 0;
}&lt;/code>&lt;/pre>&lt;pre>&lt;code># 使用 NDK 交叉编译
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang \
 -o loader loader.c -ldl
cp loader my_rootfs/system/bin/&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="常见-linker-错误">&lt;span>常见 linker 错误&lt;/span>
 &lt;a href="#%e5%b8%b8%e8%a7%81-linker-%e9%94%99%e8%af%af" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>错误信息&lt;/th>
 &lt;th>原因&lt;/th>
 &lt;th>解决方法&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>CANNOT FIND library &amp;quot;libxxx.so&amp;quot;&lt;/code>&lt;/td>
 &lt;td>依赖库不在搜索路径中&lt;/td>
 &lt;td>复制到 &lt;code>/system/lib64/&lt;/code> 或设置 &lt;code>LD_LIBRARY_PATH&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>has text relocations&lt;/code>&lt;/td>
 &lt;td>文本重定位（6.0+ 禁止）&lt;/td>
 &lt;td>用 &lt;code>-fPIC&lt;/code> 重编译或用旧版 linker&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>cannot locate symbol &amp;quot;xxx&amp;quot;&lt;/code>&lt;/td>
 &lt;td>缺少符号定义&lt;/td>
 &lt;td>检查依赖库或提供 stub 实现&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="在-chroot-环境中运行">&lt;span>在 chroot 环境中运行&lt;/span>
 &lt;a href="#%e5%9c%a8-chroot-%e7%8e%af%e5%a2%83%e4%b8%ad%e8%bf%90%e8%a1%8c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>在已 Root 的 Android 设备上，&lt;code>chroot&lt;/code> 是使用最小 RootFS 最直接的方式。&lt;/p>
&lt;h3 class="heading-element" id="设置与进入">&lt;span>设置与进入&lt;/span>
 &lt;a href="#%e8%ae%be%e7%bd%ae%e4%b8%8e%e8%bf%9b%e5%85%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>adb push my_rootfs /data/local/tmp/rootfs
adb shell
su

ROOTFS=/data/local/tmp/rootfs

# 挂载虚拟文件系统
mount -t proc proc $ROOTFS/proc
mount -t sysfs sysfs $ROOTFS/sys
mount -t tmpfs tmpfs $ROOTFS/dev
mknod $ROOTFS/dev/null c 1 3
mknod $ROOTFS/dev/zero c 1 5
mknod $ROOTFS/dev/urandom c 1 9
mkdir -p $ROOTFS/dev/pts
mount -o bind /dev/pts $ROOTFS/dev/pts

# 进入 chroot
chroot $ROOTFS /system/bin/sh&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="bind-mount-映射目标文件">&lt;span>Bind Mount 映射目标文件&lt;/span>
 &lt;a href="#bind-mount-%e6%98%a0%e5%b0%84%e7%9b%ae%e6%a0%87%e6%96%87%e4%bb%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>通过 bind mount 将设备上的目录映射到 chroot 环境中，无需复制文件：&lt;/p>
&lt;pre>&lt;code># 映射目标 APP 的库目录
mkdir -p $ROOTFS/data/app_libs
mount -o bind /data/app/com.target.app/lib/arm64 $ROOTFS/data/app_libs

# 映射 vendor 库（如果目标 SO 依赖厂商库）
mkdir -p $ROOTFS/vendor/lib64
mount -o bind /vendor/lib64 $ROOTFS/vendor/lib64

# 进入后设置路径
chroot $ROOTFS /system/bin/sh
export LD_LIBRARY_PATH=/system/lib64:/vendor/lib64:/data/app_libs
/system/bin/loader /data/app_libs/libtarget.so targetFunction&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="退出和清理">&lt;span>退出和清理&lt;/span>
 &lt;a href="#%e9%80%80%e5%87%ba%e5%92%8c%e6%b8%85%e7%90%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>exit
# 按反序卸载
umount $ROOTFS/dev/pts
umount $ROOTFS/dev
umount $ROOTFS/proc
umount $ROOTFS/sys
umount $ROOTFS/vendor/lib64 2&amp;gt;/dev/null
umount $ROOTFS/data/app_libs 2&amp;gt;/dev/null&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="docker-android-环境">&lt;span>Docker Android 环境&lt;/span>
 &lt;a href="#docker-android-%e7%8e%af%e5%a2%83" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>Docker 提供了在 PC 上运行最小 Android 环境的便捷方式，配合 QEMU 用户态模拟可在 x86 上运行 ARM 二进制。&lt;/p>
&lt;h3 class="heading-element" id="dockerfile-示例">&lt;span>Dockerfile 示例&lt;/span>
 &lt;a href="#dockerfile-%e7%a4%ba%e4%be%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>FROM ubuntu:22.04

RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \
 qemu-user-static binfmt-support \
 &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*

RUN update-binfmts --enable qemu-aarch64
RUN mkdir -p /android/{system/bin,system/lib64,data/local/tmp}

COPY rootfs/system/bin/ /android/system/bin/
COPY rootfs/system/lib64/ /android/system/lib64/

ENV LD_LIBRARY_PATH=/android/system/lib64
ENV PATH=/android/system/bin:$PATH
WORKDIR /android/data/local/tmp&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="构建和使用">&lt;span>构建和使用&lt;/span>
 &lt;a href="#%e6%9e%84%e5%bb%ba%e5%92%8c%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>docker build -t android-rootfs .

# 运行容器，挂载目标库目录
docker run -it --rm \
 -v $(pwd)/target_libs:/android/data/local/tmp/libs \
 android-rootfs \
 qemu-aarch64-static -L /android /android/system/bin/sh

# 在容器中加载目标 SO
export LD_LIBRARY_PATH=/android/system/lib64:/android/data/local/tmp/libs
qemu-aarch64-static -L /android /android/system/bin/loader \
 /android/data/local/tmp/libs/libtarget.so targetFunction&lt;/code>&lt;/pre>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>方面&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>可复现性&lt;/td>
 &lt;td>环境封装在镜像中，团队共享一致的分析环境&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>无需设备&lt;/td>
 &lt;td>在 x86 PC 上即可运行 ARM64 二进制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>性能&lt;/td>
 &lt;td>QEMU 用户态模拟比硬件慢 5-10 倍&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>JNI 限制&lt;/td>
 &lt;td>无法提供真实的 JNI 环境（没有 ART）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;hr>
&lt;h2 class="heading-element" id="proot-方案">&lt;span>proot 方案&lt;/span>
 &lt;a href="#proot-%e6%96%b9%e6%a1%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>&lt;code>proot&lt;/code> 是无需 root 权限的 &lt;code>chroot&lt;/code> 替代方案，通过 &lt;code>ptrace&lt;/code> 拦截和重写文件路径相关的系统调用来模拟根目录切换。&lt;/p>
&lt;h3 class="heading-element" id="基本使用">&lt;span>基本使用&lt;/span>
 &lt;a href="#%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 推送 proot 和 RootFS 到设备（无需 root）
adb push proot-aarch64 /data/local/tmp/proot
adb push my_rootfs /data/local/tmp/rootfs
adb shell chmod &amp;#43;x /data/local/tmp/proot

adb shell
cd /data/local/tmp

# 进入环境（绑定必要的虚拟文件系统）
./proot -r ./rootfs -b /proc -b /dev -b /sys /system/bin/sh

# 绑定目标 APP 的 SO 目录
./proot -r ./rootfs \
 -b /proc -b /dev \
 -b /data/app/com.target.app/lib/arm64:/data/libs \
 /system/bin/sh&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="proot-的局限性">&lt;span>proot 的局限性&lt;/span>
 &lt;a href="#proot-%e7%9a%84%e5%b1%80%e9%99%90%e6%80%a7" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>限制&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>性能开销&lt;/td>
 &lt;td>&lt;code>ptrace&lt;/code> 拦截每个系统调用，性能损失约 10-30%&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>兼容性&lt;/td>
 &lt;td>部分系统调用无法完美拦截&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>SELinux&lt;/td>
 &lt;td>在 enforcing 模式下可能受限&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Android 限制&lt;/td>
 &lt;td>Android 10+ 限制了 &lt;code>ptrace&lt;/code> 的使用范围&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>提示&lt;/strong>：设备已 Root 时优先使用 &lt;code>chroot&lt;/code>；只在无法获得 Root 权限时使用 &lt;code>proot&lt;/code>。&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 class="heading-element" id="实战在最小环境中运行-so">&lt;span>实战：在最小环境中运行 SO&lt;/span>
 &lt;a href="#%e5%ae%9e%e6%88%98%e5%9c%a8%e6%9c%80%e5%b0%8f%e7%8e%af%e5%a2%83%e4%b8%ad%e8%bf%90%e8%a1%8c-so" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>💡 思路一句话&lt;/strong>: 当你需要脱离 Android 设备运行 SO（如 CI/CD 中自动化调用签名函数）— 用 Docker 搭建最小 Android 根文件系统 + linker + libc，就能在服务器上直接执行 SO 中的函数。&lt;/p>&lt;/blockquote>
&lt;p>以下是完整的端到端示例：在最小 RootFS 中加载并调用目标 SO 的 Native 函数。&lt;/p>
&lt;h3 class="heading-element" id="提取目标-so-及其依赖">&lt;span>提取目标 SO 及其依赖&lt;/span>
 &lt;a href="#%e6%8f%90%e5%8f%96%e7%9b%ae%e6%a0%87-so-%e5%8f%8a%e5%85%b6%e4%be%9d%e8%b5%96" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 获取目标 SO 并查看依赖
adb pull /data/app/com.example.target/lib/arm64/libtarget.so ./
readelf -d libtarget.so | grep NEEDED
# (NEEDED) Shared library: [libc.so]
# (NEEDED) Shared library: [libm.so]
# (NEEDED) Shared library: [liblog.so]
# (NEEDED) Shared library: [libz.so]

# 拉取所有依赖库
for lib in libc.so libm.so liblog.so libz.so libdl.so; do
 adb pull /system/lib64/$lib ./rootfs/system/lib64/
done&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="编写调用程序并部署">&lt;span>编写调用程序并部署&lt;/span>
 &lt;a href="#%e7%bc%96%e5%86%99%e8%b0%83%e7%94%a8%e7%a8%8b%e5%ba%8f%e5%b9%b6%e9%83%a8%e7%bd%b2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>// call_target.c
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;dlfcn.h&amp;gt;

int main() {
 void *handle = dlopen(&amp;#34;/data/local/tmp/libtarget.so&amp;#34;, RTLD_NOW);
 if (!handle) { fprintf(stderr, &amp;#34;[-] %s\n&amp;#34;, dlerror()); return 1; }

 typedef int (*sign_func_t)(const char *, int);
 sign_func_t do_sign = (sign_func_t)dlsym(handle, &amp;#34;do_sign&amp;#34;);
 if (!do_sign) { fprintf(stderr, &amp;#34;[-] %s\n&amp;#34;, dlerror()); return 1; }

 const char *input = &amp;#34;hello_reverse&amp;#34;;
 int result = do_sign(input, strlen(input));
 printf(&amp;#34;[&amp;#43;] do_sign(\&amp;#34;%s\&amp;#34;) = 0x%x\n&amp;#34;, input, result);

 dlclose(handle);
 return 0;
}&lt;/code>&lt;/pre>&lt;pre>&lt;code># 编译并部署
NDK_CC=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang
$NDK_CC -o call_target call_target.c -ldl -pie

adb push call_target /data/local/tmp/rootfs/system/bin/
adb push libtarget.so /data/local/tmp/rootfs/data/local/tmp/&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="在-chroot-中执行">&lt;span>在 chroot 中执行&lt;/span>
 &lt;a href="#%e5%9c%a8-chroot-%e4%b8%ad%e6%89%a7%e8%a1%8c" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>adb shell
su
ROOTFS=/data/local/tmp/rootfs
mount -t proc proc $ROOTFS/proc
mount -t tmpfs tmpfs $ROOTFS/dev
mknod $ROOTFS/dev/null c 1 3
mknod $ROOTFS/dev/urandom c 1 9

chroot $ROOTFS /system/bin/sh -c &amp;#39;
 export LD_LIBRARY_PATH=/system/lib64
 /system/bin/call_target
&amp;#39;
# [&amp;#43;] do_sign(&amp;#34;hello_reverse&amp;#34;) = 0xa3f2b1c0&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="常见问题排查">&lt;span>常见问题排查&lt;/span>
 &lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code># 缺少依赖库 → 从设备拉取
adb pull /system/lib64/libxxx.so $ROOTFS/system/lib64/

# .init_array 崩溃 → 开启调试日志
export LD_DEBUG=all
/system/bin/call_target 2&amp;gt;&amp;amp;1 | head -100

# JNI_OnLoad 需要 JNIEnv → 构造 fake JNIEnv 或 patch 掉 JNI_OnLoad&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="与-unidbg-对比">&lt;span>与 unidbg 对比&lt;/span>
 &lt;a href="#%e4%b8%8e-unidbg-%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>最小 RootFS 和 unidbg 都能脱离完整 Android 环境运行 SO 函数，但原理和适用场景有显著差异。&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>最小 RootFS&lt;/th>
 &lt;th>unidbg&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>运行方式&lt;/td>
 &lt;td>真实 ARM 硬件 / QEMU 全系统模拟&lt;/td>
 &lt;td>Unicorn 指令级模拟&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>linker&lt;/td>
 &lt;td>Android 原生 linker&lt;/td>
 &lt;td>自行实现的 ELF 加载器&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>系统调用&lt;/td>
 &lt;td>真实内核处理&lt;/td>
 &lt;td>手动 Mock&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>JNI 支持&lt;/td>
 &lt;td>需自行构造&lt;/td>
 &lt;td>内置完整 JNI 模拟&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>运行平台&lt;/td>
 &lt;td>ARM 设备 / QEMU&lt;/td>
 &lt;td>任意 PC（Java/Python）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>性能&lt;/td>
 &lt;td>接近原生（设备）/ 中等（QEMU）&lt;/td>
 &lt;td>较慢（指令模拟）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>调试&lt;/td>
 &lt;td>GDB、strace 等标准工具&lt;/td>
 &lt;td>内置 Trace、寄存器查看&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>环境复杂度&lt;/td>
 &lt;td>需要准备文件系统&lt;/td>
 &lt;td>开箱即用&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="选择建议">&lt;span>选择建议&lt;/span>
 &lt;a href="#%e9%80%89%e6%8b%a9%e5%bb%ba%e8%ae%ae" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>纯 Native 函数 + 有 ARM 设备&lt;/strong> → 最小 RootFS + chroot（性能最优）&lt;/li>
&lt;li>&lt;strong>需要 JNI 环境或复杂 Java 回调&lt;/strong> → unidbg（JNI Mock 更成熟）&lt;/li>
&lt;li>&lt;strong>批量自动化调用&lt;/strong> → unidbg（Java/Python 集成方便）&lt;/li>
&lt;li>&lt;strong>无 ARM 设备&lt;/strong> → unidbg 或 Docker + QEMU&lt;/li>
&lt;/ul>
&lt;h3 class="heading-element" id="互补使用策略">&lt;span>互补使用策略&lt;/span>
 &lt;a href="#%e4%ba%92%e8%a1%a5%e4%bd%bf%e7%94%a8%e7%ad%96%e7%95%a5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>在实际逆向项目中，两者往往配合使用：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>初始分析&lt;/strong>：unidbg 快速验证函数调用，确认入参和返回值格式&lt;/li>
&lt;li>&lt;strong>深度调试&lt;/strong>：最小 RootFS 中使用 GDB 调试崩溃和逻辑问题&lt;/li>
&lt;li>&lt;strong>自动化&lt;/strong>：将可用的调用封装到 unidbg，批量生成签名或解密数据&lt;/li>
&lt;li>&lt;strong>对抗升级&lt;/strong>：当 unidbg 的 Mock 无法满足需求时，切换到最小 RootFS 获得更真实的环境&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 class="heading-element" id="从-shell-到-zygote下一步是什么">&lt;span>从 Shell 到 Zygote：下一步是什么？&lt;/span>
 &lt;a href="#%e4%bb%8e-shell-%e5%88%b0-zygote%e4%b8%8b%e4%b8%80%e6%ad%a5%e6%98%af%e4%bb%80%e4%b9%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>我们已经有了一个最小的 Linux 环境，但它还不是&amp;quot;Android&amp;quot;。要让它成为 Android，还需要以下关键步骤：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>启动 &lt;code>servicemanager&lt;/code>&lt;/strong>: 编译并运行它，它是 Android Binder IPC 机制的核心。&lt;/li>
&lt;li>&lt;strong>启动 Zygote&lt;/strong>: 编译 &lt;code>app_process&lt;/code> 并通过 &lt;code>init.rc&lt;/code> 启动它。Zygote 会预加载 Android 框架的核心类 (&lt;code>framework.jar&lt;/code>) 并监听一个 socket，等待孵化新的 App 进程。&lt;/li>
&lt;li>&lt;strong>启动 &lt;code>system_server&lt;/code>&lt;/strong>: Zygote 启动的第一个 Java 进程，它会创建所有的 Android 系统服务 (AMS, WMS, PMS 等)。&lt;/li>
&lt;/ol>
&lt;p>完成这些后，系统才能真正地运行 Android 应用。但这已经超出了&amp;quot;最小化 RootFS&amp;quot;的范畴，进入了完整的系统移植和开发领域。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="开源实现mini_rootfs">&lt;span>开源实现：mini_rootfs&lt;/span>
 &lt;a href="#%e5%bc%80%e6%ba%90%e5%ae%9e%e7%8e%b0mini_rootfs" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>基于本文介绍的构建技术，我实现了一个精简的开源项目：&lt;a href="https://github.com/overkazaf/mini_rootfs" target="_blank" rel="external nofollow noopener noreferrer">mini_rootfs&lt;/a>&lt;/p>
&lt;p>该项目演示了最小化rootfs环境下的动态库加载机制，提供两种实现方式：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Android方式&lt;/strong>: 使用系统内置 &lt;code>dlopen/dlsym&lt;/code> API 进行动态库加载&lt;/li>
&lt;li>&lt;strong>Linux方式&lt;/strong>: 从头实现自定义ELF加载器，模拟Android linker架构&lt;/li>
&lt;li>&lt;strong>ELF解析&lt;/strong>: 包含完整的ELF文件解析、内存映射、符号解析、重定位处理&lt;/li>
&lt;li>&lt;strong>教育导向&lt;/strong>: 深入理解操作系统如何加载和执行动态链接的二进制文件&lt;/li>
&lt;/ul>
&lt;p>如果你对最小化 RootFS 环境下的动态链接机制感兴趣，欢迎参考该项目的实现，也欢迎贡献代码。&lt;/p></description></item><item><title>Magisk 与 LSPosed 技术原理</title><link>https://overkazaf.github.io/reverse_engineering/android/04-reference/advanced/magisk_lsposed_internals/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate><author>overkazaf@gmail.com (+5)</author><guid>https://overkazaf.github.io/reverse_engineering/android/04-reference/advanced/magisk_lsposed_internals/</guid><description>&lt;h1 class="heading-element" id="magisk-与-lsposed-技术原理">&lt;span>Magisk 与 LSPosed 技术原理&lt;/span>
 &lt;a href="#magisk-%e4%b8%8e-lsposed-%e6%8a%80%e6%9c%af%e5%8e%9f%e7%90%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h1>&lt;p>Magisk 和 LSPosed 是 Android 平台上最流行的 Root 和 Hook 解决方案。本文深入分析其技术实现原理，帮助理解现代 Android 系统修改技术的核心机制。&lt;/p>
&lt;hr>
&lt;h2 class="heading-element" id="1-技术架构总览">&lt;span>1. 技术架构总览&lt;/span>
 &lt;a href="#1-%e6%8a%80%e6%9c%af%e6%9e%b6%e6%9e%84%e6%80%bb%e8%a7%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────┐
│ Android 系统修改技术栈 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 用户层 (User Space) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ LSPosed │ │ 模块 App │ │ 目标 App │ │ │
│ │ │ Manager │ │ (Xposed │ │ (被 Hook) │ │ │
│ │ │ │ │ Module) │ │ │ │ │
│ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │
│ │ │ │ │ │ │
│ │ └────────────────┼────────────────┘ │ │
│ │ │ │ │
│ │ ┌───────────┴───────────┐ │ │
│ │ │ LSPosed Core │ │ │
│ │ │ (libxposed_art.so) │ │ │
│ │ │ - ART Hook │ │ │
│ │ │ - 方法替换 │ │ │
│ │ └───────────┬───────────┘ │ │
│ │ │ │ │
│ └──────────────────────────┼────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────┼────────────────────────────────────┐ │
│ │ ┌───────────┴───────────┐ │ │
│ │ │ Zygisk │ │ │
│ │ │ (Magisk 注入机制) │ │ │
│ │ │ - 注入 Zygote │ │ │
│ │ │ - 加载模块 │ │ │
│ │ └───────────┬───────────┘ │ │
│ │ │ │ │
│ │ ┌───────────┴───────────┐ │ │
│ │ │ Magisk │ │ │
│ │ │ - Systemless Root │ │ │
│ │ │ - MagiskSU │ │ │
│ │ │ - MagiskHide/ │ │ │
│ │ │ DenyList │ │ │
│ │ └───────────┬───────────┘ │ │
│ │ │ │ │
│ │ 内核层 (Kernel) │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ Boot 阶段 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Boot.img │ │ Magisk 补丁 │ │ ramdisk │ │ │
│ │ │ (原始) │──►│ 处理 │──►│ (修改后) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="2-框架演进历史">&lt;span>2. 框架演进历史&lt;/span>
 &lt;a href="#2-%e6%a1%86%e6%9e%b6%e6%bc%94%e8%bf%9b%e5%8e%86%e5%8f%b2" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>理解 LSPosed，需要先理清 Xposed 框架的演进历史：&lt;/p>
&lt;pre>&lt;code>Xposed (元祖) ──► EdXposed (过渡) ──► LSPosed (现代标准)
 │ │ │
 │ │ │
 ▼ ▼ ▼
替换 app_process Riru 注入 Zygote Zygisk/Riru 注入
 (修改 /system) (Systemless) (Magisk 生态)&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="21-xposed-原版-2012-2018">&lt;span>2.1 Xposed 原版 (2012-2018)&lt;/span>
 &lt;a href="#21-xposed-%e5%8e%9f%e7%89%88-2012-2018" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Xposed 是由 rovo89 开发的 Android Hook 框架，开创了 Java 层方法 Hook 的先河。&lt;/p>
&lt;p>&lt;strong>核心特点&lt;/strong>：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>实现方式&lt;/td>
 &lt;td>替换 &lt;code>/system/bin/app_process&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Root 方式&lt;/td>
 &lt;td>需要传统 Root (修改 /system)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>支持版本&lt;/td>
 &lt;td>Android 4.0 - 8.x (Dalvik/ART)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>注入范围&lt;/td>
 &lt;td>全局注入所有进程&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>维护状态&lt;/td>
 &lt;td>2018 年停止更新&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;p>&lt;strong>技术原理&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>/**
 * Xposed 原版通过替换 app_process 实现全局注入
 *
 * 原始启动流程:
 * init → zygote (app_process) → fork → App
 *
 * Xposed 修改后:
 * init → zygote (app_process_xposed) → XposedBridge 加载 → fork → App
 */

// app_process 被替换为 Xposed 修改版
// 在 ZygoteInit 阶段加载 XposedBridge.jar
// 所有 fork 出的 App 都继承了 Xposed 的 Hook 能力&lt;/code>&lt;/pre>&lt;p>&lt;strong>致命缺陷&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>修改 &lt;code>/system&lt;/code> 分区，无法通过 SafetyNet/Play Integrity&lt;/li>
&lt;li>全局注入导致系统卡顿、耗电&lt;/li>
&lt;li>兼容性差，不支持新版 Android&lt;/li>
&lt;/ol>
&lt;h3 class="heading-element" id="22-edxposed-过渡期-2018-2020">&lt;span>2.2 EdXposed 过渡期 (2018-2020)&lt;/span>
 &lt;a href="#22-edxposed-%e8%bf%87%e6%b8%a1%e6%9c%9f-2018-2020" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>EdXposed (Elder Xposed) 是 Xposed 的社区接力项目，解决了原版 Xposed 的一些问题。&lt;/p>
&lt;p>&lt;strong>核心改进&lt;/strong>：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>Xposed 原版&lt;/th>
 &lt;th>EdXposed&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Root 方式&lt;/td>
 &lt;td>修改 /system&lt;/td>
 &lt;td>基于 Magisk&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>注入方式&lt;/td>
 &lt;td>替换 app_process&lt;/td>
 &lt;td>Riru 注入&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>支持版本&lt;/td>
 &lt;td>≤ Android 8&lt;/td>
 &lt;td>Android 8-11&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>作用域&lt;/td>
 &lt;td>全局&lt;/td>
 &lt;td>部分支持白名单&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;p>&lt;strong>EdXposed 架构&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────┐
│ EdXposed 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ │
│ │ EdXposed Manager│ ←── 管理模块、配置 │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ EdXposed Core │ ←── libxposed_art.so (ART Hook) │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Riru │ ←── Zygote 注入框架 │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Magisk │ ←── Systemless Root 基础 │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="23-riru-注入框架">&lt;span>2.3 Riru 注入框架&lt;/span>
 &lt;a href="#23-riru-%e6%b3%a8%e5%85%a5%e6%a1%86%e6%9e%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Riru 是一个通用的 Zygote 注入框架，允许模块在 Zygote 进程中运行代码。&lt;/p>
&lt;p>&lt;strong>核心原理&lt;/strong>：利用 Android 的 &lt;code>native bridge&lt;/code> 机制注入 Zygote。&lt;/p>
&lt;pre>&lt;code>/**
 * Riru 注入原理
 *
 * Android 的 native bridge 用于运行非原生架构的代码
 * (例如在 ARM64 设备上运行 x86 应用)
 *
 * Riru 劫持了这个机制:
 */

// 1. Magisk 模块将 libriru.so 放入指定位置
// /system/lib64/libriruloader.so

// 2. 修改系统属性
// ro.dalvik.vm.native.bridge=libriruloader.so

// 3. Zygote 启动时加载 native bridge
// 实际上加载的是 Riru

// 4. Riru 加载所有 Riru 模块
void riru_init() {
 // 读取 /data/adb/riru/modules/ 目录
 // 加载每个模块的 .so 文件
 for (auto&amp;amp; module : riru_modules) {
 dlopen(module.path, RTLD_NOW);
 }
}

// 5. 模块可以 Hook Zygote 的关键函数
// 如 nativeForkAndSpecialize, nativeSpecializeAppProcess&lt;/code>&lt;/pre>&lt;p>&lt;strong>Riru 模块结构&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>/data/adb/riru/modules/
└── edxposed/
 ├── lib/
 │ ├── arm64-v8a/
 │ │ └── libriru_edxposed.so
 │ └── armeabi-v7a/
 │ └── libriru_edxposed.so
 └── module.prop&lt;/code>&lt;/pre>&lt;p>&lt;strong>Riru API (模块开发)&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>// Riru 模块入口
extern &amp;#34;C&amp;#34; void* init(void* handle) {
 // 注册回调
 return riruInit(handle, riruApiVersion, &amp;amp;riruModuleInfo);
}

// nativeForkAndSpecialize 前回调
extern &amp;#34;C&amp;#34; void nativeForkAndSpecializePre(
 JNIEnv *env, jclass clazz, jint uid, jint gid,
 jintArray gids, jint runtimeFlags, ...
) {
 // 在 fork 前执行
 // 可以修改参数
}

// nativeForkAndSpecialize 后回调
extern &amp;#34;C&amp;#34; void nativeForkAndSpecializePost(
 JNIEnv *env, jclass clazz, jint result
) {
 if (result == 0) {
 // 子进程 (新 App)
 // 执行 Hook 逻辑
 }
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="24-zygisk-注入框架">&lt;span>2.4 Zygisk 注入框架&lt;/span>
 &lt;a href="#24-zygisk-%e6%b3%a8%e5%85%a5%e6%a1%86%e6%9e%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Zygisk 是 Magisk v24+ 引入的官方 Zygote 注入机制，作为 Riru 的替代方案。&lt;/p>
&lt;p>&lt;strong>Zygisk vs Riru&lt;/strong>：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>Riru&lt;/th>
 &lt;th>Zygisk&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>维护者&lt;/td>
 &lt;td>第三方&lt;/td>
 &lt;td>Magisk 官方&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>注入方式&lt;/td>
 &lt;td>Native Bridge 劫持&lt;/td>
 &lt;td>直接修补 app_process&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>隐藏能力&lt;/td>
 &lt;td>依赖额外模块&lt;/td>
 &lt;td>内置 DenyList&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>稳定性&lt;/td>
 &lt;td>良好&lt;/td>
 &lt;td>更好&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>模块兼容&lt;/td>
 &lt;td>Riru 模块格式&lt;/td>
 &lt;td>Zygisk 模块格式&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>当前状态&lt;/td>
 &lt;td>停止维护&lt;/td>
 &lt;td>活跃开发&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;p>&lt;strong>Zygisk 核心原理&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>/**
 * Zygisk 直接修补 app_process (在内存中)
 * 比 Riru 的 native bridge 劫持更优雅
 */

// 1. Magisk 在 post-fs-data 阶段
// 将 app_process32/64 替换为修改版

// 2. 修改版 app_process 在 main() 开始时
// 加载 libzygisk.so

// 3. libzygisk.so Hook Zygote 的 fork 函数
void* zygisk_loader(void*) {
 // 加载 Zygisk 核心
 void* handle = dlopen(&amp;#34;/data/adb/magisk/zygisk/libzygisk.so&amp;#34;, RTLD_NOW);

 // 初始化
 auto entry = dlsym(handle, &amp;#34;zygisk_init&amp;#34;);
 ((void(*)())entry)();

 return nullptr;
}

// 4. Zygisk 模块 API
struct ZygiskModule {
 // 在 App fork 前调用
 void (*preAppSpecialize)(void* args);

 // 在 App fork 后调用
 void (*postAppSpecialize)(const char* process_name);

 // 在系统服务 fork 前调用
 void (*preServerSpecialize)(void* args);

 // 在系统服务 fork 后调用
 void (*postServerSpecialize)();
};&lt;/code>&lt;/pre>&lt;p>&lt;strong>Zygisk 模块结构&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>/data/adb/modules/lsposed/
├── module.prop
├── post-fs-data.sh
├── service.sh
└── zygisk/
 ├── arm64-v8a.so # 64位模块
 ├── armeabi-v7a.so # 32位模块
 └── unloaded # 控制卸载行为的标记&lt;/code>&lt;/pre>&lt;p>&lt;strong>Zygisk 模块开发&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>// Zygisk 模块示例
#include &amp;lt;zygisk.hpp&amp;gt;

class MyModule : public zygisk::ModuleBase {
public:
 void onLoad(zygisk::Api* api, JNIEnv* env) override {
 this-&amp;gt;api = api;
 this-&amp;gt;env = env;
 }

 void preAppSpecialize(zygisk::AppSpecializeArgs* args) override {
 // 获取包名
 const char* process = env-&amp;gt;GetStringUTFChars(args-&amp;gt;nice_name, nullptr);

 // 判断是否需要 Hook
 if (strcmp(process, &amp;#34;com.target.app&amp;#34;) == 0) {
 // 请求在 fork 后继续运行
 api-&amp;gt;setOption(zygisk::DLCLOSE_MODULE_LIBRARY, false);
 }

 env-&amp;gt;ReleaseStringUTFChars(args-&amp;gt;nice_name, process);
 }

 void postAppSpecialize(const zygisk::AppSpecializeArgs* args) override {
 // fork 完成后，在目标 App 中执行 Hook
 initHooks();
 }

private:
 zygisk::Api* api;
 JNIEnv* env;
};

// 注册模块
REGISTER_ZYGISK_MODULE(MyModule)&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="25-lsposed-现代标准-2020-至今">&lt;span>2.5 LSPosed 现代标准 (2020-至今)&lt;/span>
 &lt;a href="#25-lsposed-%e7%8e%b0%e4%bb%a3%e6%a0%87%e5%87%86-2020-%e8%87%b3%e4%bb%8a" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>LSPosed 是目前最主流的 Xposed 实现，采用 Zygisk (或 Riru) 作为注入基础。&lt;/p>
&lt;p>&lt;strong>核心定位&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Magisk&lt;/strong> 负责 Root 权限和文件系统修改&lt;/li>
&lt;li>&lt;strong>Zygisk/Riru&lt;/strong> 负责 Zygote 注入&lt;/li>
&lt;li>&lt;strong>LSPosed&lt;/strong> 负责 Java 方法 Hook&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>简单说：Magisk 帮你开了门，LSPosed 帮你进去改代码。&lt;/code>&lt;/pre>&lt;p>&lt;strong>LSPosed 关键创新&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>按需注入 (Scope)&lt;/strong>：只注入勾选的目标 App&lt;/li>
&lt;li>&lt;strong>随机包名&lt;/strong>：LSPosed Manager 使用随机包名避免检测&lt;/li>
&lt;li>&lt;strong>寄生模式&lt;/strong>：可将管理器寄生到其他 App 中&lt;/li>
&lt;li>&lt;strong>Binder 通信&lt;/strong>：Manager 与 Core 通过 Binder 通信&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>LSPosed 启动流程&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>系统启动
 │
 ▼
Magisk 启动 ──► 加载 Zygisk/Riru
 │
 ▼
Zygisk 注入 Zygote ──► 加载 LSPosed Core
 │
 ▼
App 启动请求 (fork from Zygote)
 │
 ▼
LSPosed 检查: 这个 App 在哪些模块的作用域中?
 │
 ├── 在 &amp;#34;微信防撤回&amp;#34; 作用域中 ──► 加载该模块
 │
 ├── 不在任何作用域中 ──► 不加载任何模块
 │
 ▼
App 正常运行 (仅加载必要模块)&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="3-magisk-原理详解">&lt;span>3. Magisk 原理详解&lt;/span>
 &lt;a href="#3-magisk-%e5%8e%9f%e7%90%86%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="31-systemless-root-概念">&lt;span>3.1 Systemless Root 概念&lt;/span>
 &lt;a href="#31-systemless-root-%e6%a6%82%e5%bf%b5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>Magisk 的核心创新是 &lt;strong>Systemless Root&lt;/strong> - 在不修改 &lt;code>/system&lt;/code> 分区的情况下获取 Root 权限。&lt;/p>
&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────┐
│ 传统 Root vs Systemless Root │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 【传统 Root】 │
│ │
│ /system/ │
│ ├── bin/ │
│ │ └── su ◄── 直接修改 /system 分区 │
│ ├── xbin/ │
│ │ └── su │
│ └── app/ │
│ └── Superuser/ ◄── Root 管理 App │
│ │
│ 问题: │
│ - 无法通过 OTA 升级 │
│ - 无法通过 SafetyNet │
│ - 修改系统分区可能变砖 │
│ │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 【Systemless Root (Magisk)】 │
│ │
│ /system/ ◄── 完全不修改 │
│ │
│ /data/adb/magisk/ │
│ ├── magisk ◄── Magisk 二进制 │
│ ├── magiskinit │
│ ├── magiskpolicy │
│ └── busybox │
│ │
│ Boot Image 修改: │
│ boot.img │
│ └── ramdisk/ │
│ └── init ──► magiskinit ◄── 替换 init 进程 │
│ │
│ 优势: │
│ - 系统分区完整，可正常 OTA │
│ - 可绕过部分检测 │
│ - 恢复简单，刷入原始 boot.img 即可 │
│ │
└─────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="22-magisk-启动流程">&lt;span>2.2 Magisk 启动流程&lt;/span>
 &lt;a href="#22-magisk-%e5%90%af%e5%8a%a8%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────┐
│ Magisk 启动流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Bootloader 加载修补后的 boot.img │
│ │ │
│ ▼ │
│ 2. Kernel 启动，执行 ramdisk 中的 init │
│ │ (实际是 magiskinit) │
│ │ │
│ ▼ │
│ 3. magiskinit 执行初始化 │
│ ├── 解析 /system, /vendor 等分区 │
│ ├── 注入 Magisk 到 /sbin │
│ ├── 修补 sepolicy (SELinux 策略) │
│ └── 启动原始 init │
│ │ │
│ ▼ │
│ 4. 原始 init 执行系统初始化 │
│ │ │
│ ▼ │
│ 5. post-fs-data 阶段 │
│ ├── Magisk 挂载模块 │
│ ├── 执行 post-fs-data.d 脚本 │
│ └── 设置 MagiskSU 守护进程 │
│ │ │
│ ▼ │
│ 6. late_start 阶段 │
│ ├── 执行 service.d 脚本 │
│ └── Zygisk 初始化 (如果启用) │
│ │ │
│ ▼ │
│ 7. 系统完全启动，Magisk 功能就绪 │
│ │
└─────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="23-magisksu-实现原理">&lt;span>2.3 MagiskSU 实现原理&lt;/span>
 &lt;a href="#23-magisksu-%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * MagiskSU 核心实现原理 (简化版)
 *
 * Magisk 的 su 实现不是传统的 SUID 二进制，
 * 而是通过 Unix Domain Socket 与守护进程通信
 */

// ==================== su 客户端 ====================

/**
 * su_client.c - su 命令的客户端实现
 */

#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/un.h&amp;gt;

#define MAGISK_SOCKET &amp;#34;/dev/socket/magisk&amp;#34;

// su 请求结构
struct su_request {
 int uid; // 请求的 UID
 int login; // 是否使用 login shell
 int keepenv; // 是否保留环境变量
 char *shell; // 指定 shell
 char *command; // 要执行的命令
};

// su 响应
struct su_response {
 int allow; // 是否允许
 int uid; // 授权的 UID
 int gid; // 授权的 GID
};

int su_client_main(int argc, char **argv) {
 // 1. 解析命令行参数
 struct su_request req = parse_args(argc, argv);

 // 2. 连接到 Magisk 守护进程
 int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

 struct sockaddr_un addr;
 addr.sun_family = AF_UNIX;
 strcpy(addr.sun_path, MAGISK_SOCKET);

 if (connect(sockfd, (struct sockaddr*)&amp;amp;addr, sizeof(addr)) &amp;lt; 0) {
 fprintf(stderr, &amp;#34;Cannot connect to Magisk daemon\n&amp;#34;);
 return 1;
 }

 // 3. 发送 su 请求
 // 包含调用者 PID、UID、请求的权限等
 send_su_request(sockfd, &amp;amp;req);

 // 4. 等待守护进程响应
 struct su_response resp;
 recv_su_response(sockfd, &amp;amp;resp);

 if (!resp.allow) {
 fprintf(stderr, &amp;#34;Permission denied\n&amp;#34;);
 return 1;
 }

 // 5. 守护进程通过 socket 传递 pts (伪终端)
 int pts_fd = recv_fd(sockfd);

 // 6. 使用新的 pts 执行 shell
 // 此时已经在守护进程创建的 Root 环境中
 dup2(pts_fd, STDIN_FILENO);
 dup2(pts_fd, STDOUT_FILENO);
 dup2(pts_fd, STDERR_FILENO);

 execvp(req.shell ?: &amp;#34;/system/bin/sh&amp;#34;, argv);

 return 0;
}

// ==================== su 守护进程 ====================

/**
 * su_daemon.c - Magisk 守护进程中处理 su 请求
 */

void handle_su_request(int client_fd) {
 // 1. 接收客户端信息
 struct su_request req;
 recv_su_request(client_fd, &amp;amp;req);

 // 2. 获取调用者信息
 struct ucred cred;
 socklen_t len = sizeof(cred);
 getsockopt(client_fd, SOL_SOCKET, SO_PEERCRED, &amp;amp;cred, &amp;amp;len);

 int caller_uid = cred.uid;
 int caller_pid = cred.pid;

 // 3. 查找调用者的应用信息
 char *pkg_name = get_package_name(caller_uid);
 char *app_name = get_app_name(caller_pid);

 // 4. 检查数据库中的授权状态
 int policy = check_su_policy(pkg_name);

 struct su_response resp;

 switch (policy) {
 case POLICY_ALLOW:
 // 已授权，直接允许
 resp.allow = 1;
 break;

 case POLICY_DENY:
 // 已拒绝
 resp.allow = 0;
 break;

 case POLICY_QUERY:
 default:
 // 需要询问用户
 resp.allow = prompt_user_for_su(pkg_name, app_name, caller_uid);

 // 记录用户选择
 save_su_policy(pkg_name, resp.allow);
 break;
 }

 // 5. 发送响应
 send_su_response(client_fd, &amp;amp;resp);

 if (!resp.allow) {
 close(client_fd);
 return;
 }

 // 6. 创建 Root 环境
 // fork 一个子进程，设置其权限

 int pts_master, pts_slave;
 openpty(&amp;amp;pts_master, &amp;amp;pts_slave, NULL, NULL, NULL);

 pid_t pid = fork();

 if (pid == 0) {
 // 子进程 - 将成为 Root shell

 close(pts_master);
 setsid();

 // 设置 UID/GID 为 root
 setuid(0);
 setgid(0);

 // 设置 SELinux context
 setcon(&amp;#34;u:r:su:s0&amp;#34;);

 // 设置环境变量
 setenv(&amp;#34;HOME&amp;#34;, &amp;#34;/data&amp;#34;, 1);
 setenv(&amp;#34;SHELL&amp;#34;, &amp;#34;/system/bin/sh&amp;#34;, 1);
 setenv(&amp;#34;PATH&amp;#34;, &amp;#34;/sbin:/system/bin:/system/xbin&amp;#34;, 1);

 // 重定向 stdio 到 pts
 dup2(pts_slave, STDIN_FILENO);
 dup2(pts_slave, STDOUT_FILENO);
 dup2(pts_slave, STDERR_FILENO);

 // 执行 shell
 execlp(&amp;#34;/system/bin/sh&amp;#34;, &amp;#34;sh&amp;#34;, NULL);

 } else {
 // 父进程 - 守护进程

 close(pts_slave);

 // 将 pts_master fd 发送给客户端
 send_fd(client_fd, pts_master);

 // 等待子进程结束
 waitpid(pid, NULL, 0);
 }
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="24-magiskhide--denylist-原理">&lt;span>2.4 MagiskHide / DenyList 原理&lt;/span>
 &lt;a href="#24-magiskhide--denylist-%e5%8e%9f%e7%90%86" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * MagiskHide/DenyList 实现原理
 *
 * 目标: 对特定应用隐藏 Magisk 的存在
 */

// ==================== 进程隐藏 ====================

/**
 * hide_daemon.c - 隐藏守护进程
 */

#include &amp;lt;sys/ptrace.h&amp;gt;
#include &amp;lt;sys/mount.h&amp;gt;

// 需要隐藏的应用列表
struct hide_list {
 char *package_name;
 int uid;
};

// 监听 Zygote fork
void monitor_zygote() {
 // 使用 ptrace 或 inotify 监控 /proc/[zygote_pid]/task

 while (1) {
 // 检测新 fork 的进程
 pid_t new_pid = detect_new_fork();

 if (new_pid &amp;gt; 0) {
 // 获取进程信息
 char *cmdline = read_proc_cmdline(new_pid);
 int uid = get_process_uid(new_pid);

 // 检查是否在隐藏列表中
 if (should_hide(cmdline, uid)) {
 // 对该进程执行隐藏操作
 do_hide_process(new_pid);
 }
 }
 }
}

/**
 * 对目标进程执行隐藏
 */
void do_hide_process(pid_t pid) {
 // 1. 等待进程完成初始化
 // 使用 ptrace 或等待特定事件
 wait_for_process_init(pid);

 // 2. 卸载 Magisk 挂载的文件系统
 // 在目标进程的 mount namespace 中操作

 char ns_path[64];
 snprintf(ns_path, sizeof(ns_path), &amp;#34;/proc/%d/ns/mnt&amp;#34;, pid);

 int ns_fd = open(ns_path, O_RDONLY);
 setns(ns_fd, CLONE_NEWNS);

 // 卸载 Magisk 模块挂载点
 unmount_magisk_mounts();

 // 3. 清理 /proc 中的痕迹
 // (这部分比较复杂，需要内核支持)

 // 4. 恢复原始的系统属性
 // 某些属性会暴露 Root 状态

 // 5. 让进程继续执行
 ptrace(PTRACE_DETACH, pid, NULL, NULL);
}

/**
 * 卸载 Magisk 挂载点
 */
void unmount_magisk_mounts() {
 // 读取 /proc/self/mounts
 FILE *fp = fopen(&amp;#34;/proc/self/mounts&amp;#34;, &amp;#34;r&amp;#34;);

 char line[1024];
 while (fgets(line, sizeof(line), fp)) {
 // 查找 Magisk 相关挂载
 if (strstr(line, &amp;#34;magisk&amp;#34;) ||
 strstr(line, &amp;#34;/sbin/.magisk&amp;#34;) ||
 strstr(line, &amp;#34;/data/adb&amp;#34;)) {

 // 提取挂载点
 char *mountpoint = parse_mountpoint(line);

 // 卸载
 umount2(mountpoint, MNT_DETACH);
 }
 }

 fclose(fp);

 // 卸载模块的 overlay 挂载
 unmount_module_overlays();
}

// ==================== Zygisk 实现 ====================

/**
 * Zygisk - Magisk 在 Zygote 中的代码注入
 *
 * Zygisk 允许模块在 App 进程启动前注入代码，
 * 是 LSPosed 等框架的基础
 */

// zygisk_loader.cpp

#include &amp;lt;android/dlext.h&amp;gt;

/**
 * Zygote 进程启动时的钩子
 * 通过修改 LD_PRELOAD 实现
 */
__attribute__((constructor))
void zygisk_init() {
 // 检测当前是否是 Zygote 进程
 if (!is_zygote_process()) {
 return;
 }

 // Hook Zygote 的关键函数
 hook_zygote_functions();

 // 加载 Zygisk 模块
 load_zygisk_modules();
}

/**
 * Hook app_process 中的 fork 函数
 */
void hook_zygote_functions() {
 // 使用 PLT Hook 或 inline hook

 // Hook nativeForkAndSpecialize
 // 这是 Zygote fork 新应用进程的入口
 void *art_handle = dlopen(&amp;#34;libart.so&amp;#34;, RTLD_NOW);

 void *original_fork = dlsym(art_handle, &amp;#34;_ZN3art...&amp;#34;
 &amp;#34;nativeForkAndSpecializeEi...&amp;#34;);

 // 替换为我们的函数
 hook_function(original_fork, my_fork_and_specialize);
}

/**
 * 我们的 fork 处理函数
 */
int my_fork_and_specialize(
 JNIEnv *env,
 jclass clazz,
 jint uid,
 jint gid,
 jintArray gids,
 jint runtime_flags,
 jobjectArray rlimits,
 jint mount_external,
 jstring se_info,
 jstring nice_name, // 包名
 jintArray fds_to_close,
 jintArray fds_to_ignore,
 jboolean is_child_zygote,
 jstring instruction_set,
 jstring app_data_dir,
 jboolean is_top_app
) {
 // 获取包名
 const char *pkg_name = env-&amp;gt;GetStringUTFChars(nice_name, NULL);

 // 检查是否需要对这个 App 执行操作
 bool should_hook = check_module_target(pkg_name);
 bool should_hide = check_hide_list(pkg_name);

 // 调用原始 fork
 int pid = original_fork_and_specialize(
 env, clazz, uid, gid, gids, runtime_flags,
 rlimits, mount_external, se_info, nice_name,
 fds_to_close, fds_to_ignore, is_child_zygote,
 instruction_set, app_data_dir, is_top_app
 );

 if (pid == 0) {
 // 子进程 (新 App)

 if (should_hide) {
 // 在子进程中执行隐藏
 do_unmount_in_child();
 }

 if (should_hook) {
 // 通知模块进行 Hook
 notify_modules_app_forked(pkg_name, uid);
 }
 }

 env-&amp;gt;ReleaseStringUTFChars(nice_name, pkg_name);
 return pid;
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="3-lsposed--xposed-原理详解">&lt;span>3. LSPosed / Xposed 原理详解&lt;/span>
 &lt;a href="#3-lsposed--xposed-%e5%8e%9f%e7%90%86%e8%af%a6%e8%a7%a3" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="31-xposed-框架架构">&lt;span>3.1 Xposed 框架架构&lt;/span>
 &lt;a href="#31-xposed-%e6%a1%86%e6%9e%b6%e6%9e%b6%e6%9e%84" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>┌─────────────────────────────────────────────────────────────────────────┐
│ LSPosed/Xposed 架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ Xposed Module (APK) │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ IXposedHookLoad │ │ XposedBridge │ │ │
│ │ │ InitPackageRes │ │ - findAndHook │ │ │
│ │ │ ZygoteInit │ │ Method │ │ │
│ │ └────────┬────────┘ └────────┬────────┘ │ │
│ │ │ │ │ │
│ └───────────┼────────────────────┼─────────────────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ XposedBridge.jar │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ XposedHelpers │ │ XC_MethodHook │ │ XC_MethodRepl │ │ │
│ │ │ - findClass │ │ - beforeHooked │ │ acement │ │ │
│ │ │ - findMethod │ │ Method │ │ │ │ │
│ │ │ - getField │ │ - afterHooked │ │ │ │ │
│ │ │ │ │ Method │ │ │ │ │
│ │ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │ │
│ │ │ │ │ │ │
│ └───────────┼────────────────────┼────────────────────┼──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ libxposed_art.so (Native) │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ ART Hook │ │ Method Entry │ │ Backup/Restore │ │ │
│ │ │ - entry_point │ │ Trampoline │ │ Original │ │ │
│ │ │ replacement │ │ │ │ Method │ │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ART Runtime (libart.so) │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ ArtMethod │ │ JIT Compiler │ │ Class Linker │ │ │
│ │ │ - entry_point_ │ │ │ │ │ │ │
│ │ │ - code_item_ │ │ │ │ │ │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="32-art-hook-核心实现">&lt;span>3.2 ART Hook 核心实现&lt;/span>
 &lt;a href="#32-art-hook-%e6%a0%b8%e5%bf%83%e5%ae%9e%e7%8e%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * LSPosed ART Hook 实现原理
 *
 * 核心思想: 修改 ArtMethod 的 entry_point_from_quick_compiled_code_
 * 使方法调用跳转到我们的 trampoline 代码
 */

// ==================== ArtMethod 结构 ====================

/**
 * ART 虚拟机中的方法表示
 * (简化版，实际结构更复杂)
 */
struct ArtMethod {
 // GC 相关
 uint32_t gc_root_;

 // 声明此方法的类
 uint32_t declaring_class_;

 // 访问标志 (public, private, static 等)
 uint32_t access_flags_;

 // 方法在 DEX 文件中的索引
 uint32_t dex_method_index_;

 // 方法在 vtable 中的索引
 uint16_t method_index_;

 // 热度计数 (用于 JIT)
 uint16_t hotness_count_;

 // ========== 关键字段 ==========

 // 解释执行时使用的 DEX 字节码指针
 void *dex_code_item_offset_;

 // 快速编译代码的入口点
 // 这是 Hook 的核心目标!
 void *entry_point_from_quick_compiled_code_;

 // JNI 入口点 (native 方法)
 void *entry_point_from_jni_;
};

// ==================== Hook 实现 ====================

/**
 * art_hook.cpp - ART 方法 Hook
 */

#include &amp;lt;sys/mman.h&amp;gt;

// Trampoline 代码 (ARM64 示例)
// 这段代码会在被 Hook 的方法调用时执行
const uint8_t trampoline_template[] = {
 // 保存寄存器
 0xFD, 0x7B, 0xBF, 0xA9, // stp x29, x30, [sp, #-16]!

 // 加载 hook_info 地址到 x16
 0x50, 0x00, 0x00, 0x58, // ldr x16, #8

 // 跳转到 hook_handler
 0x00, 0x02, 0x1F, 0xD6, // br x16

 // hook_info 地址 (占位符，运行时填充)
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

/**
 * Hook 信息结构
 */
struct HookInfo {
 void *original_entry; // 原始入口点
 void *hook_handler; // Hook 处理函数
 void *backup_method; // 备份的原方法
 void *callback_before; // before 回调
 void *callback_after; // after 回调
 void *additional_info; // 额外信息
};

/**
 * Hook 一个 Java 方法
 */
bool hook_method(
 JNIEnv *env,
 jclass clazz,
 const char *method_name,
 const char *method_sig,
 void *before_callback,
 void *after_callback
) {
 // 1. 获取 ArtMethod 指针
 jmethodID method_id = env-&amp;gt;GetMethodID(clazz, method_name, method_sig);
 ArtMethod *art_method = (ArtMethod *)method_id;

 // 2. 备份原始方法
 // 创建一个新的 ArtMethod 作为备份
 ArtMethod *backup = create_backup_method(art_method);

 // 3. 分配 trampoline 代码内存
 // 需要可执行权限
 void *trampoline = mmap(
 NULL,
 PAGE_SIZE,
 PROT_READ | PROT_WRITE | PROT_EXEC,
 MAP_PRIVATE | MAP_ANONYMOUS,
 -1,
 0
 );

 // 4. 创建 HookInfo
 HookInfo *hook_info = new HookInfo();
 hook_info-&amp;gt;original_entry = art_method-&amp;gt;entry_point_from_quick_compiled_code_;
 hook_info-&amp;gt;hook_handler = &amp;amp;hook_bridge;
 hook_info-&amp;gt;backup_method = backup;
 hook_info-&amp;gt;callback_before = before_callback;
 hook_info-&amp;gt;callback_after = after_callback;

 // 5. 填充 trampoline 代码
 memcpy(trampoline, trampoline_template, sizeof(trampoline_template));

 // 将 hook_info 地址写入 trampoline
 *(void **)((uint8_t *)trampoline &amp;#43; 16) = hook_info;

 // 6. 修改原方法的入口点
 // 指向我们的 trampoline
 art_method-&amp;gt;entry_point_from_quick_compiled_code_ = trampoline;

 // 7. 清除可能存在的 JIT 编译缓存
 invalidate_jit_code(art_method);

 return true;
}

/**
 * Hook 桥接函数
 * 当被 Hook 的方法被调用时，这个函数会被执行
 */
extern &amp;#34;C&amp;#34; void hook_bridge(HookInfo *info, ...) {
 // 1. 获取调用参数
 // 参数通过寄存器和栈传递
 va_list args;
 va_start(args, info);

 // 2. 调用 before 回调
 if (info-&amp;gt;callback_before) {
 ((BeforeCallback)info-&amp;gt;callback_before)(info, args);
 }

 // 3. 调用原始方法
 // 通过备份的 ArtMethod
 void *result = call_original_method(info-&amp;gt;backup_method, args);

 // 4. 调用 after 回调
 if (info-&amp;gt;callback_after) {
 result = ((AfterCallback)info-&amp;gt;callback_after)(info, args, result);
 }

 va_end(args);

 // 5. 返回结果
 return result;
}

/**
 * 调用原始方法
 */
void *call_original_method(ArtMethod *backup, va_list args) {
 // 使用备份的 ArtMethod 调用原方法

 // 获取原始入口点
 void *entry = backup-&amp;gt;entry_point_from_quick_compiled_code_;

 // 通过函数指针调用
 // 实际实现需要处理各种调用约定
 typedef void *(*MethodEntry)(ArtMethod *, ...);
 return ((MethodEntry)entry)(backup, args);
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="33-xposedbridge-java-层实现">&lt;span>3.3 XposedBridge Java 层实现&lt;/span>
 &lt;a href="#33-xposedbridge-java-%e5%b1%82%e5%ae%9e%e7%8e%b0" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * XposedBridge.java - Xposed 框架的 Java 层核心
 */
public final class XposedBridge {

 private static final String TAG = &amp;#34;XposedBridge&amp;#34;;

 // 存储所有已注册的 Hook
 private static final ConcurrentHashMap&amp;lt;Member, TreeSet&amp;lt;XC_MethodHook&amp;gt;&amp;gt;
 sHookedMethodCallbacks = new ConcurrentHashMap&amp;lt;&amp;gt;();

 /**
 * Hook 一个方法
 *
 * @param hookMethod 要 Hook 的方法
 * @param callback Hook 回调
 * @return 用于取消 Hook 的 unhook 对象
 */
 public static XC_MethodHook.Unhook hookMethod(
 Member hookMethod,
 XC_MethodHook callback
 ) {
 if (!(hookMethod instanceof Method) &amp;amp;&amp;amp; !(hookMethod instanceof Constructor)) {
 throw new IllegalArgumentException(&amp;#34;Only methods and constructors can be hooked&amp;#34;);
 }

 // 获取或创建该方法的回调集合
 TreeSet&amp;lt;XC_MethodHook&amp;gt; callbacks = sHookedMethodCallbacks.get(hookMethod);
 if (callbacks == null) {
 callbacks = new TreeSet&amp;lt;&amp;gt;();
 sHookedMethodCallbacks.put(hookMethod, callbacks);

 // 第一次 Hook 这个方法，进行 native Hook
 hookMethodNative(hookMethod);
 }

 // 添加回调
 callbacks.add(callback);

 return callback.new Unhook(hookMethod);
 }

 /**
 * Native Hook 方法
 * 由 libxposed_art.so 实现
 */
 private static native void hookMethodNative(Member method);

 /**
 * 当被 Hook 的方法被调用时，由 native 层调用此方法
 */
 private static Object handleHookedMethod(
 Member method,
 Object thisObject,
 Object[] args
 ) throws Throwable {

 // 获取该方法的所有回调
 TreeSet&amp;lt;XC_MethodHook&amp;gt; callbacks = sHookedMethodCallbacks.get(method);
 if (callbacks == null || callbacks.isEmpty()) {
 // 没有回调，直接调用原方法
 return invokeOriginalMethod(method, thisObject, args);
 }

 // 创建方法调用参数封装
 XC_MethodHook.MethodHookParam param = new XC_MethodHook.MethodHookParam();
 param.method = method;
 param.thisObject = thisObject;
 param.args = args;

 // ========== 调用 beforeHookedMethod ==========
 for (XC_MethodHook callback : callbacks) {
 try {
 callback.beforeHookedMethod(param);
 } catch (Throwable t) {
 XposedBridge.log(t);
 }

 // 如果回调设置了返回值，跳过后续处理
 if (param.returnEarly) {
 return param.getResult();
 }
 }

 // ========== 调用原始方法 ==========
 try {
 param.setResult(invokeOriginalMethod(method, param.thisObject, param.args));
 } catch (Throwable t) {
 param.setThrowable(t);
 }

 // ========== 调用 afterHookedMethod ==========
 // 注意: 逆序调用
 for (XC_MethodHook callback : callbacks.descendingSet()) {
 try {
 callback.afterHookedMethod(param);
 } catch (Throwable t) {
 XposedBridge.log(t);
 }
 }

 // 返回结果或抛出异常
 if (param.hasThrowable()) {
 throw param.getThrowable();
 }
 return param.getResult();
 }

 /**
 * 调用原始方法
 * 由 native 层实现
 */
 private static native Object invokeOriginalMethod(
 Member method,
 Object thisObject,
 Object[] args
 ) throws Throwable;
}

/**
 * XC_MethodHook.java - 方法 Hook 回调基类
 */
public abstract class XC_MethodHook implements Comparable&amp;lt;XC_MethodHook&amp;gt; {

 // Hook 优先级
 public final int priority;

 public XC_MethodHook() {
 this.priority = PRIORITY_DEFAULT;
 }

 public XC_MethodHook(int priority) {
 this.priority = priority;
 }

 /**
 * 方法调用前的回调
 */
 protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
 // 默认空实现
 }

 /**
 * 方法调用后的回调
 */
 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
 // 默认空实现
 }

 /**
 * 方法调用参数封装
 */
 public static class MethodHookParam {
 public Member method;
 public Object thisObject;
 public Object[] args;

 private Object result;
 private Throwable throwable;
 boolean returnEarly = false;

 public Object getResult() {
 return result;
 }

 public void setResult(Object result) {
 this.result = result;
 this.throwable = null;
 this.returnEarly = true;
 }

 public Throwable getThrowable() {
 return throwable;
 }

 public void setThrowable(Throwable throwable) {
 this.throwable = throwable;
 this.result = null;
 this.returnEarly = true;
 }

 public boolean hasThrowable() {
 return throwable != null;
 }

 public Object getResultOrThrowable() throws Throwable {
 if (throwable != null) throw throwable;
 return result;
 }
 }

 /**
 * 取消 Hook 的辅助类
 */
 public class Unhook {
 private final Member hookMethod;

 public Unhook(Member hookMethod) {
 this.hookMethod = hookMethod;
 }

 public void unhook() {
 TreeSet&amp;lt;XC_MethodHook&amp;gt; callbacks = sHookedMethodCallbacks.get(hookMethod);
 if (callbacks != null) {
 callbacks.remove(XC_MethodHook.this);
 }
 }
 }

 @Override
 public int compareTo(XC_MethodHook other) {
 // 按优先级排序
 return Integer.compare(this.priority, other.priority);
 }

 // 优先级常量
 public static final int PRIORITY_DEFAULT = 50;
 public static final int PRIORITY_LOWEST = -10000;
 public static final int PRIORITY_HIGHEST = 10000;
}

/**
 * XposedHelpers.java - 常用辅助方法
 */
public class XposedHelpers {

 /**
 * 查找并 Hook 方法
 */
 public static XC_MethodHook.Unhook findAndHookMethod(
 String className,
 ClassLoader classLoader,
 String methodName,
 Object... parameterTypesAndCallback
 ) {
 // 解析参数
 int paramCount = parameterTypesAndCallback.length - 1;
 Class&amp;lt;?&amp;gt;[] parameterTypes = new Class&amp;lt;?&amp;gt;[paramCount];
 for (int i = 0; i &amp;lt; paramCount; i&amp;#43;&amp;#43;) {
 Object param = parameterTypesAndCallback[i];
 if (param instanceof Class) {
 parameterTypes[i] = (Class&amp;lt;?&amp;gt;) param;
 } else if (param instanceof String) {
 parameterTypes[i] = findClass((String) param, classLoader);
 }
 }

 XC_MethodHook callback = (XC_MethodHook) parameterTypesAndCallback[paramCount];

 // 查找类
 Class&amp;lt;?&amp;gt; clazz = findClass(className, classLoader);

 // 查找方法
 Method method = findMethodExact(clazz, methodName, parameterTypes);

 // Hook
 return XposedBridge.hookMethod(method, callback);
 }

 /**
 * 查找类
 */
 public static Class&amp;lt;?&amp;gt; findClass(String className, ClassLoader classLoader) {
 try {
 return classLoader.loadClass(className);
 } catch (ClassNotFoundException e) {
 throw new XposedHelpers.ClassNotFoundError(e);
 }
 }

 /**
 * 查找方法
 */
 public static Method findMethodExact(
 Class&amp;lt;?&amp;gt; clazz,
 String methodName,
 Class&amp;lt;?&amp;gt;... parameterTypes
 ) {
 try {
 Method method = clazz.getDeclaredMethod(methodName, parameterTypes);
 method.setAccessible(true);
 return method;
 } catch (NoSuchMethodException e) {
 throw new XposedHelpers.MethodNotFoundError(e);
 }
 }

 /**
 * 获取对象字段值
 */
 public static Object getObjectField(Object obj, String fieldName) {
 try {
 Field field = findField(obj.getClass(), fieldName);
 return field.get(obj);
 } catch (IllegalAccessException e) {
 throw new IllegalAccessError(e.getMessage());
 }
 }

 /**
 * 设置对象字段值
 */
 public static void setObjectField(Object obj, String fieldName, Object value) {
 try {
 Field field = findField(obj.getClass(), fieldName);
 field.set(obj, value);
 } catch (IllegalAccessException e) {
 throw new IllegalAccessError(e.getMessage());
 }
 }

 /**
 * 调用方法
 */
 public static Object callMethod(Object obj, String methodName, Object... args) {
 try {
 // 根据参数类型查找方法
 Class&amp;lt;?&amp;gt;[] paramTypes = new Class&amp;lt;?&amp;gt;[args.length];
 for (int i = 0; i &amp;lt; args.length; i&amp;#43;&amp;#43;) {
 paramTypes[i] = args[i].getClass();
 }

 Method method = findMethodBestMatch(obj.getClass(), methodName, paramTypes);
 return method.invoke(obj, args);
 } catch (Exception e) {
 throw new RuntimeException(e);
 }
 }
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="34-xposed-模块示例">&lt;span>3.4 Xposed 模块示例&lt;/span>
 &lt;a href="#34-xposed-%e6%a8%a1%e5%9d%97%e7%a4%ba%e4%be%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * 一个完整的 Xposed 模块示例
 * 功能: Hook 微信发送消息，记录聊天内容
 */
package com.example.xposed.wechat;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class WeChatHook implements IXposedHookLoadPackage {

 private static final String TAG = &amp;#34;WeChatHook&amp;#34;;
 private static final String WECHAT_PACKAGE = &amp;#34;com.tencent.mm&amp;#34;;

 @Override
 public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
 // 只处理微信
 if (!lpparam.packageName.equals(WECHAT_PACKAGE)) {
 return;
 }

 XposedBridge.log(TAG &amp;#43; &amp;#34;: Hooking WeChat&amp;#34;);

 // Hook 发送消息的方法
 hookSendMessage(lpparam.classLoader);

 // Hook 接收消息的方法
 hookReceiveMessage(lpparam.classLoader);

 // Hook 登录流程
 hookLogin(lpparam.classLoader);
 }

 /**
 * Hook 发送消息
 */
 private void hookSendMessage(ClassLoader classLoader) {
 try {
 // 查找消息管理类
 // 注意: 实际类名可能被混淆，需要分析
 Class&amp;lt;?&amp;gt; msgManagerClass = XposedHelpers.findClass(
 &amp;#34;com.tencent.mm.modelmulti.MMSessionProcessor&amp;#34;,
 classLoader
 );

 // Hook sendMessage 方法
 XposedHelpers.findAndHookMethod(
 msgManagerClass,
 &amp;#34;sendMessage&amp;#34;,
 String.class, // 接收者
 String.class, // 消息内容
 int.class, // 消息类型
 new XC_MethodHook() {
 @Override
 protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
 String receiver = (String) param.args[0];
 String content = (String) param.args[1];
 int msgType = (int) param.args[2];

 XposedBridge.log(TAG &amp;#43; &amp;#34;: Sending message&amp;#34;);
 XposedBridge.log(TAG &amp;#43; &amp;#34;: To: &amp;#34; &amp;#43; receiver);
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Content: &amp;#34; &amp;#43; content);
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Type: &amp;#34; &amp;#43; msgType);

 // 可以在这里修改消息内容
 // param.args[1] = content &amp;#43; &amp;#34; [Modified]&amp;#34;;

 // 或者阻止发送
 // param.setResult(null);
 }

 @Override
 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
 // 消息发送后的处理
 Object result = param.getResult();
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Message sent, result: &amp;#34; &amp;#43; result);
 }
 }
 );

 XposedBridge.log(TAG &amp;#43; &amp;#34;: sendMessage hooked&amp;#34;);

 } catch (Throwable t) {
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Failed to hook sendMessage&amp;#34;);
 XposedBridge.log(t);
 }
 }

 /**
 * Hook 接收消息
 */
 private void hookReceiveMessage(ClassLoader classLoader) {
 try {
 // Hook 消息数据库插入
 Class&amp;lt;?&amp;gt; sqliteClass = XposedHelpers.findClass(
 &amp;#34;com.tencent.mm.storage.SqliteDB&amp;#34;,
 classLoader
 );

 XposedHelpers.findAndHookMethod(
 sqliteClass,
 &amp;#34;insert&amp;#34;,
 String.class, // 表名
 String.class, // nullColumnHack
 &amp;#34;android.content.ContentValues&amp;#34;,
 new XC_MethodHook() {
 @Override
 protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
 String tableName = (String) param.args[0];

 // 只关心消息表
 if (!&amp;#34;message&amp;#34;.equals(tableName)) {
 return;
 }

 Object contentValues = param.args[2];

 // 提取消息内容
 String content = (String) XposedHelpers.callMethod(
 contentValues, &amp;#34;getAsString&amp;#34;, &amp;#34;content&amp;#34;
 );
 String talker = (String) XposedHelpers.callMethod(
 contentValues, &amp;#34;getAsString&amp;#34;, &amp;#34;talker&amp;#34;
 );

 XposedBridge.log(TAG &amp;#43; &amp;#34;: Received message&amp;#34;);
 XposedBridge.log(TAG &amp;#43; &amp;#34;: From: &amp;#34; &amp;#43; talker);
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Content: &amp;#34; &amp;#43; content);
 }
 }
 );

 XposedBridge.log(TAG &amp;#43; &amp;#34;: receiveMessage hooked&amp;#34;);

 } catch (Throwable t) {
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Failed to hook receiveMessage&amp;#34;);
 XposedBridge.log(t);
 }
 }

 /**
 * Hook 登录流程
 */
 private void hookLogin(ClassLoader classLoader) {
 try {
 // Hook 网络请求类
 Class&amp;lt;?&amp;gt; networkClass = XposedHelpers.findClass(
 &amp;#34;com.tencent.mm.network.MMHttpClient&amp;#34;,
 classLoader
 );

 XposedHelpers.findAndHookMethod(
 networkClass,
 &amp;#34;execute&amp;#34;,
 &amp;#34;com.tencent.mm.network.MMHttpRequest&amp;#34;,
 new XC_MethodHook() {
 @Override
 protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
 Object request = param.args[0];

 // 获取请求 URL
 String url = (String) XposedHelpers.getObjectField(request, &amp;#34;url&amp;#34;);

 // 获取请求体
 byte[] body = (byte[]) XposedHelpers.getObjectField(request, &amp;#34;body&amp;#34;);

 XposedBridge.log(TAG &amp;#43; &amp;#34;: HTTP Request&amp;#34;);
 XposedBridge.log(TAG &amp;#43; &amp;#34;: URL: &amp;#34; &amp;#43; url);
 if (body != null) {
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Body length: &amp;#34; &amp;#43; body.length);
 }
 }

 @Override
 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
 Object response = param.getResult();

 if (response != null) {
 int statusCode = (int) XposedHelpers.getObjectField(
 response, &amp;#34;statusCode&amp;#34;
 );
 XposedBridge.log(TAG &amp;#43; &amp;#34;: HTTP Response: &amp;#34; &amp;#43; statusCode);
 }
 }
 }
 );

 XposedBridge.log(TAG &amp;#43; &amp;#34;: network hooked&amp;#34;);

 } catch (Throwable t) {
 XposedBridge.log(TAG &amp;#43; &amp;#34;: Failed to hook network&amp;#34;);
 XposedBridge.log(t);
 }
 }
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="4-lsposed-与原版-xposed-的区别">&lt;span>4. LSPosed 与原版 Xposed 的区别&lt;/span>
 &lt;a href="#4-lsposed-%e4%b8%8e%e5%8e%9f%e7%89%88-xposed-%e7%9a%84%e5%8c%ba%e5%88%ab" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="41-架构对比">&lt;span>4.1 架构对比&lt;/span>
 &lt;a href="#41-%e6%9e%b6%e6%9e%84%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>原版 Xposed&lt;/th>
 &lt;th>LSPosed&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Root 方式&lt;/td>
 &lt;td>修改 /system&lt;/td>
 &lt;td>基于 Magisk (Systemless)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>注入方式&lt;/td>
 &lt;td>替换 app_process&lt;/td>
 &lt;td>Zygisk 模块&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>作用范围&lt;/td>
 &lt;td>全局&lt;/td>
 &lt;td>可选择性启用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>检测规避&lt;/td>
 &lt;td>无&lt;/td>
 &lt;td>支持白名单模式&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Android 支持&lt;/td>
 &lt;td>最高 8.x&lt;/td>
 &lt;td>8.0 - 14+&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>维护状态&lt;/td>
 &lt;td>停止更新&lt;/td>
 &lt;td>活跃开发&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="42-lsposed-作用域控制">&lt;span>4.2 LSPosed 作用域控制&lt;/span>
 &lt;a href="#42-lsposed-%e4%bd%9c%e7%94%a8%e5%9f%9f%e6%8e%a7%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * LSPosed 允许为每个模块指定作用域
 * 只有在作用域内的 App 才会被 Hook
 */

// LSPosed Manager 中的配置存储
// /data/adb/lspd/config/&amp;lt;module_package&amp;gt;/scope.list

// 作用域列表格式:
// com.tencent.mm # 微信
// com.tencent.mobileqq # QQ
// system # 系统框架

/**
 * LSPosed 加载模块时会检查作用域
 */
public class ModuleLoader {

 public boolean shouldLoadModule(String modulePkg, String targetPkg) {
 // 读取作用域配置
 Set&amp;lt;String&amp;gt; scope = readModuleScope(modulePkg);

 // 检查目标 App 是否在作用域内
 return scope.contains(targetPkg) || scope.contains(&amp;#34;*&amp;#34;);
 }

 private Set&amp;lt;String&amp;gt; readModuleScope(String modulePkg) {
 File scopeFile = new File(
 &amp;#34;/data/adb/lspd/config/&amp;#34; &amp;#43; modulePkg &amp;#43; &amp;#34;/scope.list&amp;#34;
 );

 Set&amp;lt;String&amp;gt; scope = new HashSet&amp;lt;&amp;gt;();
 try (BufferedReader reader = new BufferedReader(new FileReader(scopeFile))) {
 String line;
 while ((line = reader.readLine()) != null) {
 line = line.trim();
 if (!line.isEmpty() &amp;amp;&amp;amp; !line.startsWith(&amp;#34;#&amp;#34;)) {
 scope.add(line);
 }
 }
 } catch (IOException e) {
 // 默认空作用域
 }

 return scope;
 }
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="53-按需注入机制">&lt;span>5.3 按需注入机制&lt;/span>
 &lt;a href="#53-%e6%8c%89%e9%9c%80%e6%b3%a8%e5%85%a5%e6%9c%ba%e5%88%b6" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>老版 Xposed 的致命缺点是&lt;strong>全局注入&lt;/strong>：安装一个微信模块，Xposed 会把这个模块强行塞进系统里每一个进程（包括支付宝、系统设置、计算器）。&lt;/p>
&lt;p>&lt;strong>问题后果&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>系统变慢、耗电&lt;/li>
&lt;li>极易崩溃（不兼容就崩）&lt;/li>
&lt;li>检测点多，容易被发现&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>LSPosed 的革新 - 按需注入&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>/**
 * LSPosed 按需注入实现
 *
 * 流程:
 * 1. 新 App 启动 (从 Zygote fork)
 * 2. LSPosed 桩代码检查: 这个 App 是谁?
 * 3. 查询配置: 哪些模块勾选了这个 App?
 * 4. 只加载相关模块
 */
public class LSPosedModuleManager {

 // 模块作用域配置
 // /data/adb/lspd/config/&amp;lt;module&amp;gt;/scope.list
 private Map&amp;lt;String, Set&amp;lt;String&amp;gt;&amp;gt; moduleScopes = new HashMap&amp;lt;&amp;gt;();

 /**
 * 当 App fork 后调用
 */
 public void onAppForked(String packageName, int uid) {
 // 遍历所有已启用的模块
 for (ModuleInfo module : getEnabledModules()) {
 // 检查该 App 是否在模块作用域中
 if (isInScope(module.packageName, packageName)) {
 // 加载该模块
 loadModule(module, packageName);
 Log.d(&amp;#34;LSPosed&amp;#34;, &amp;#34;Loaded &amp;#34; &amp;#43; module.name &amp;#43; &amp;#34; for &amp;#34; &amp;#43; packageName);
 }
 }
 }

 private boolean isInScope(String modulePkg, String targetPkg) {
 Set&amp;lt;String&amp;gt; scope = moduleScopes.get(modulePkg);
 if (scope == null) return false;

 // 检查是否在作用域中
 // 支持通配符 &amp;#34;*&amp;#34; 表示全局
 return scope.contains(targetPkg) ||
 scope.contains(&amp;#34;*&amp;#34;) ||
 (targetPkg.equals(&amp;#34;system&amp;#34;) &amp;amp;&amp;amp; scope.contains(&amp;#34;system&amp;#34;));
 }
}&lt;/code>&lt;/pre>&lt;p>&lt;strong>优势对比&lt;/strong>：&lt;/p>
&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>特性&lt;/th>
 &lt;th>原版 Xposed&lt;/th>
 &lt;th>LSPosed&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>注入范围&lt;/td>
 &lt;td>所有进程&lt;/td>
 &lt;td>仅勾选的 App&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>系统性能&lt;/td>
 &lt;td>明显下降&lt;/td>
 &lt;td>几乎无影响&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>稳定性&lt;/td>
 &lt;td>容易崩溃&lt;/td>
 &lt;td>稳定&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>检测难度&lt;/td>
 &lt;td>容易检测&lt;/td>
 &lt;td>更难检测&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="54-binder-跨进程通信">&lt;span>5.4 Binder 跨进程通信&lt;/span>
 &lt;a href="#54-binder-%e8%b7%a8%e8%bf%9b%e7%a8%8b%e9%80%9a%e4%bf%a1" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>LSPosed 分为两部分：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>LSPosed Manager&lt;/strong>：用户看到的管理 App，负责配置模块&lt;/li>
&lt;li>&lt;strong>LSPosed Core&lt;/strong>：寄生在 Zygote 和各个 App 里的核心代码&lt;/li>
&lt;/ol>
&lt;p>由于它们在不同的进程，LSPosed 高度依赖 Android 的 &lt;strong>Binder 机制&lt;/strong>进行通讯。&lt;/p>
&lt;pre>&lt;code>/**
 * LSPosed Binder 通信架构
 */

// ==================== LSPosed Manager 侧 ====================

/**
 * Manager App 通过 Binder 与 Core 通信
 */
public class LSPosedManagerService extends ILSPosedManager.Stub {

 /**
 * 获取模块列表
 */
 @Override
 public List&amp;lt;ModuleInfo&amp;gt; getModuleList() {
 // 通过 Binder 调用 Core 的服务
 return getRemoteService().getModuleList();
 }

 /**
 * 更新模块作用域
 */
 @Override
 public void updateModuleScope(String modulePkg, List&amp;lt;String&amp;gt; scope) {
 // 写入配置
 writeScope(modulePkg, scope);

 // 通知 Core 重新加载配置
 getRemoteService().reloadConfig();
 }

 /**
 * 启用/禁用模块
 */
 @Override
 public void setModuleEnabled(String modulePkg, boolean enabled) {
 // 更新模块状态
 updateModuleStatus(modulePkg, enabled);

 // 重启相关 App 才能生效
 // (或等待下次 App 启动)
 }
}

// ==================== LSPosed Core 侧 ====================

/**
 * Core 运行在 system_server 中
 * 通过隐藏的 Binder 服务与 Manager 通信
 */
public class LSPosedService extends ILSPosedService.Stub {

 /**
 * 获取激活的模块列表
 */
 @Override
 public List&amp;lt;ModuleInfo&amp;gt; getActiveModules(String targetPackage) {
 List&amp;lt;ModuleInfo&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();

 for (ModuleInfo module : allModules) {
 if (module.enabled &amp;amp;&amp;amp; isInScope(module, targetPackage)) {
 result.add(module);
 }
 }

 return result;
 }

 /**
 * 重新加载配置
 * Manager 修改配置后调用
 */
 @Override
 public void reloadConfig() {
 // 重新读取配置文件
 loadModuleConfigs();

 // 通知正在运行的 Hook 更新
 notifyConfigChanged();
 }
}&lt;/code>&lt;/pre>&lt;p>&lt;strong>Binder 服务发现&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>// LSPosed 使用隐藏的方式注册 Binder 服务
// 避免被其他 App 发现

// 1. Core 在 system_server 中注册服务
ServiceManager.addService(&amp;#34;org.lsposed.daemon&amp;#34;, mService, true, DUMP_FLAG_PRIORITY_NORMAL);

// 2. Manager 通过特殊方式获取服务
// 而不是普通的 ServiceManager.getService()
IBinder binder = new ShizukuBinderProxy().getService(&amp;#34;org.lsposed.daemon&amp;#34;);&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="6-hook-技术选型对比">&lt;span>6. Hook 技术选型对比&lt;/span>
 &lt;a href="#6-hook-%e6%8a%80%e6%9c%af%e9%80%89%e5%9e%8b%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;p>在 Android 逆向中，常用的 Hook 技术有三类：LSPosed (Xposed)、Frida、Inline Hook 框架。以下是详细对比和选型建议。&lt;/p>
&lt;h3 class="heading-element" id="61-技术对比">&lt;span>6.1 技术对比&lt;/span>
 &lt;a href="#61-%e6%8a%80%e6%9c%af%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>维度&lt;/th>
 &lt;th>LSPosed/Xposed&lt;/th>
 &lt;th>Frida&lt;/th>
 &lt;th>Inline Hook 框架&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Hook 层级&lt;/strong>&lt;/td>
 &lt;td>Java 方法&lt;/td>
 &lt;td>Java + Native&lt;/td>
 &lt;td>Native 函数&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>注入时机&lt;/strong>&lt;/td>
 &lt;td>App 启动时&lt;/td>
 &lt;td>运行时动态注入&lt;/td>
 &lt;td>编译时 / 运行时&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>持久性&lt;/strong>&lt;/td>
 &lt;td>永久生效&lt;/td>
 &lt;td>临时 (进程重启失效)&lt;/td>
 &lt;td>取决于实现&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>开发语言&lt;/strong>&lt;/td>
 &lt;td>Java/Kotlin&lt;/td>
 &lt;td>JavaScript/Python&lt;/td>
 &lt;td>C/C++&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>上手难度&lt;/strong>&lt;/td>
 &lt;td>简单&lt;/td>
 &lt;td>中等&lt;/td>
 &lt;td>较难&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Root 需求&lt;/strong>&lt;/td>
 &lt;td>需要 (Magisk)&lt;/td>
 &lt;td>需要&lt;/td>
 &lt;td>取决于实现&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>检测难度&lt;/strong>&lt;/td>
 &lt;td>中等&lt;/td>
 &lt;td>较易检测&lt;/td>
 &lt;td>较难检测&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>适用场景&lt;/strong>&lt;/td>
 &lt;td>长期使用的功能模块&lt;/td>
 &lt;td>快速分析、动态调试&lt;/td>
 &lt;td>高性能、低侵入 Hook&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="62-详细对比">&lt;span>6.2 详细对比&lt;/span>
 &lt;a href="#62-%e8%af%a6%e7%bb%86%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;h4 class="heading-element" id="lsposedxposed-模块">&lt;span>LSPosed/Xposed 模块&lt;/span>
 &lt;a href="#lsposedxposed-%e6%a8%a1%e5%9d%97" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>&lt;strong>优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>开发简单，Java API 友好&lt;/li>
&lt;li>持久生效，重启后仍有效&lt;/li>
&lt;li>社区生态丰富，模块众多&lt;/li>
&lt;li>与 Magisk 生态集成良好&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>劣势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>只能 Hook Java 层方法&lt;/li>
&lt;li>需要编译 APK，迭代较慢&lt;/li>
&lt;li>修改后需要重启 App&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>✅ 微信防撤回、去广告等长期使用的功能
✅ 系统级功能修改
✅ 发布给其他用户使用的模块
✅ 不需要频繁修改的稳定 Hook&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="frida">&lt;span>Frida&lt;/span>
 &lt;a href="#frida" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>&lt;strong>优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>动态注入，即时生效&lt;/li>
&lt;li>支持 Java + Native 层&lt;/li>
&lt;li>脚本语言开发，迭代极快&lt;/li>
&lt;li>强大的内存操作能力&lt;/li>
&lt;li>适合快速分析和调试&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>劣势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>进程重启后需要重新注入&lt;/li>
&lt;li>容易被检测 (frida-server 特征明显)&lt;/li>
&lt;li>性能开销较大&lt;/li>
&lt;li>部署需要 frida-server&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>✅ 逆向分析、快速验证想法
✅ 动态调试、参数监控
✅ 加密算法分析、数据抓取
✅ 一次性的分析任务&lt;/code>&lt;/pre>&lt;h4 class="heading-element" id="inline-hook-框架-dobbyshadowhookbhook">&lt;span>Inline Hook 框架 (Dobby/ShadowHook/bhook)&lt;/span>
 &lt;a href="#inline-hook-%e6%a1%86%e6%9e%b6-dobbyshadowhookbhook" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h4>&lt;p>&lt;strong>优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>高性能，开销极小&lt;/li>
&lt;li>难以检测 (无明显特征)&lt;/li>
&lt;li>支持 Hook 任意函数地址&lt;/li>
&lt;li>可嵌入目标 App 中&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>劣势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>开发难度大，需要 C/C++&lt;/li>
&lt;li>调试困难&lt;/li>
&lt;li>需要处理 ABI、指令集等细节&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;pre>&lt;code>✅ 风控 SDK 开发
✅ 高性能监控
✅ 需要隐蔽的 Hook
✅ 嵌入式 Hook (集成到 App 中)&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="63-选型决策流程">&lt;span>6.3 选型决策流程&lt;/span>
 &lt;a href="#63-%e9%80%89%e5%9e%8b%e5%86%b3%e7%ad%96%e6%b5%81%e7%a8%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>你的需求是什么?
 │
 ├── 快速分析 App 行为
 │ └── 选择 Frida ✅
 │
 ├── 开发给自己/他人长期使用的功能
 │ └── Java 层 Hook 够用吗?
 │ ├── 是 → 选择 LSPosed ✅
 │ └── 否 → 结合 LSPosed &amp;#43; Native Hook
 │
 ├── 开发风控/安全 SDK
 │ └── 选择 Inline Hook (Dobby/ShadowHook) ✅
 │
 └── 需要隐蔽的 Hook
 └── 选择 Inline Hook ✅&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="64-组合使用方案">&lt;span>6.4 组合使用方案&lt;/span>
 &lt;a href="#64-%e7%bb%84%e5%90%88%e4%bd%bf%e7%94%a8%e6%96%b9%e6%a1%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;p>实际项目中，往往需要组合使用多种技术：&lt;/p>
&lt;p>&lt;strong>方案一：LSPosed + Frida&lt;/strong>&lt;/p>
&lt;pre>&lt;code>开发流程:
1. 用 Frida 快速分析、定位关键函数
2. 确认 Hook 点后，用 LSPosed 模块实现持久化

适用: 大多数逆向项目&lt;/code>&lt;/pre>&lt;p>&lt;strong>方案二：LSPosed + Inline Hook&lt;/strong>&lt;/p>
&lt;pre>&lt;code>/**
 * LSPosed 模块中调用 Native Inline Hook
 */
public class MyXposedModule implements IXposedHookLoadPackage {

 @Override
 public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
 // Java 层 Hook
 XposedHelpers.findAndHookMethod(...);

 // 加载 Native 库进行 Inline Hook
 System.loadLibrary(&amp;#34;myhook&amp;#34;);
 nativeInit(); // 执行 Dobby Hook
 }

 private native void nativeInit();
}&lt;/code>&lt;/pre>&lt;p>&lt;strong>方案三：Frida + Inline Hook 定位&lt;/strong>&lt;/p>
&lt;pre>&lt;code>// 用 Frida 定位函数后，获取地址
var targetFunc = Module.findExportByName(&amp;#34;libtarget.so&amp;#34;, &amp;#34;encrypt&amp;#34;);
console.log(&amp;#34;encrypt address: &amp;#34; &amp;#43; targetFunc);

// 然后用 Inline Hook 框架做持久化 Hook
// Frida 脚本输出:
// encrypt address: 0x7a3b4c5d00
// 将此地址用于 Dobby Hook&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="65-性能对比">&lt;span>6.5 性能对比&lt;/span>
 &lt;a href="#65-%e6%80%a7%e8%83%bd%e5%af%b9%e6%af%94" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>技术&lt;/th>
 &lt;th>Hook 安装开销&lt;/th>
 &lt;th>每次调用开销&lt;/th>
 &lt;th>内存占用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>LSPosed&lt;/td>
 &lt;td>中&lt;/td>
 &lt;td>中&lt;/td>
 &lt;td>较大&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Frida&lt;/td>
 &lt;td>高&lt;/td>
 &lt;td>高&lt;/td>
 &lt;td>很大&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PLT Hook&lt;/td>
 &lt;td>低&lt;/td>
 &lt;td>极低&lt;/td>
 &lt;td>小&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Inline Hook&lt;/td>
 &lt;td>中&lt;/td>
 &lt;td>低&lt;/td>
 &lt;td>小&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;p>&lt;strong>性能敏感场景推荐&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>高频函数 (如加密函数) → PLT Hook (bhook/xHook)&lt;/li>
&lt;li>任意地址 Hook → Inline Hook (Dobby/ShadowHook)&lt;/li>
&lt;li>分析调试阶段 → Frida (不在意性能)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 class="heading-element" id="7-检测与对抗">&lt;span>7. 检测与对抗&lt;/span>
 &lt;a href="#7-%e6%a3%80%e6%b5%8b%e4%b8%8e%e5%af%b9%e6%8a%97" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="71-常见检测方法">&lt;span>7.1 常见检测方法&lt;/span>
 &lt;a href="#71-%e5%b8%b8%e8%a7%81%e6%a3%80%e6%b5%8b%e6%96%b9%e6%b3%95" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * App 检测 Root/Xposed 的常用方法
 */
public class RootDetection {

 /**
 * 检测 su 二进制
 */
 public boolean checkSuBinary() {
 String[] paths = {
 &amp;#34;/system/bin/su&amp;#34;,
 &amp;#34;/system/xbin/su&amp;#34;,
 &amp;#34;/sbin/su&amp;#34;,
 &amp;#34;/data/local/xbin/su&amp;#34;,
 &amp;#34;/data/local/bin/su&amp;#34;,
 &amp;#34;/data/local/su&amp;#34;
 };

 for (String path : paths) {
 if (new File(path).exists()) {
 return true; // 检测到 Root
 }
 }
 return false;
 }

 /**
 * 检测 Magisk 特征
 */
 public boolean checkMagisk() {
 // 检查 Magisk 相关路径
 if (new File(&amp;#34;/sbin/.magisk&amp;#34;).exists()) return true;
 if (new File(&amp;#34;/data/adb/magisk&amp;#34;).exists()) return true;

 // 检查 Magisk 属性
 String magiskVersion = getSystemProperty(&amp;#34;magisk.version&amp;#34;);
 if (magiskVersion != null &amp;amp;&amp;amp; !magiskVersion.isEmpty()) {
 return true;
 }

 return false;
 }

 /**
 * 检测 Xposed 框架
 */
 public boolean checkXposed() {
 // 方法1: 检查堆栈
 try {
 throw new Exception(&amp;#34;detect&amp;#34;);
 } catch (Exception e) {
 for (StackTraceElement element : e.getStackTrace()) {
 if (element.getClassName().contains(&amp;#34;xposed&amp;#34;)) {
 return true;
 }
 }
 }

 // 方法2: 检查类加载器
 try {
 ClassLoader.getSystemClassLoader().loadClass(
 &amp;#34;de.robv.android.xposed.XposedBridge&amp;#34;
 );
 return true;
 } catch (ClassNotFoundException e) {
 // 没有找到
 }

 // 方法3: 检查 native 方法特征
 // Xposed 会修改某些 native 方法的实现

 return false;
 }

 /**
 * 检测 Hook 框架 (通用)
 */
 public boolean checkHookFramework() {
 // 检查常见 Hook 框架的特征文件
 String[] hookIndicators = {
 &amp;#34;/data/data/de.robv.android.xposed.installer&amp;#34;,
 &amp;#34;/data/data/org.lsposed.manager&amp;#34;,
 &amp;#34;/data/data/com.saurik.substrate&amp;#34;,
 &amp;#34;/data/local/tmp/frida-server&amp;#34;
 };

 for (String path : hookIndicators) {
 if (new File(path).exists()) {
 return true;
 }
 }

 // 检查内存中的 Hook 特征
 return checkNativeHooks();
 }

 /**
 * 检测 native 层 Hook
 */
 private native boolean checkNativeHooks();
}&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="72-绕过检测">&lt;span>7.2 绕过检测&lt;/span>
 &lt;a href="#72-%e7%bb%95%e8%bf%87%e6%a3%80%e6%b5%8b" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>/**
 * LSPosed 模块: 绕过 Root 检测
 */
public class RootHider implements IXposedHookLoadPackage {

 @Override
 public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
 // Hook File.exists()
 XposedHelpers.findAndHookMethod(
 File.class,
 &amp;#34;exists&amp;#34;,
 new XC_MethodHook() {
 @Override
 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
 String path = ((File) param.thisObject).getAbsolutePath();

 // 隐藏 Root 相关文件
 if (isRootRelatedPath(path)) {
 param.setResult(false);
 }
 }
 }
 );

 // Hook Runtime.exec()
 XposedHelpers.findAndHookMethod(
 Runtime.class,
 &amp;#34;exec&amp;#34;,
 String.class,
 new XC_MethodHook() {
 @Override
 protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
 String cmd = (String) param.args[0];

 // 阻止执行 which su, su 等命令
 if (cmd.contains(&amp;#34;su&amp;#34;) || cmd.contains(&amp;#34;magisk&amp;#34;)) {
 param.setThrowable(new IOException(&amp;#34;Command not found&amp;#34;));
 }
 }
 }
 );

 // Hook System.getProperty() / Build 类
 // 修改设备指纹等

 // Hook PackageManager
 // 隐藏 Magisk/Xposed 应用
 }

 private boolean isRootRelatedPath(String path) {
 String[] patterns = {
 &amp;#34;su&amp;#34;, &amp;#34;magisk&amp;#34;, &amp;#34;supersu&amp;#34;, &amp;#34;xposed&amp;#34;, &amp;#34;lsposed&amp;#34;,
 &amp;#34;/sbin/&amp;#34;, &amp;#34;/data/adb/&amp;#34;
 };

 path = path.toLowerCase();
 for (String pattern : patterns) {
 if (path.contains(pattern)) {
 return true;
 }
 }
 return false;
 }
}&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 class="heading-element" id="8-总结">&lt;span>8. 总结&lt;/span>
 &lt;a href="#8-%e6%80%bb%e7%bb%93" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h2>&lt;h3 class="heading-element" id="81-技术栈总览">&lt;span>8.1 技术栈总览&lt;/span>
 &lt;a href="#81-%e6%8a%80%e6%9c%af%e6%a0%88%e6%80%bb%e8%a7%88" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;div class="table-wrapper">
 &lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>技术&lt;/th>
 &lt;th>核心原理&lt;/th>
 &lt;th>主要用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Magisk&lt;/strong>&lt;/td>
 &lt;td>修补 boot.img, Systemless Root&lt;/td>
 &lt;td>Root 权限管理、模块加载&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>MagiskSU&lt;/strong>&lt;/td>
 &lt;td>Unix Socket + 守护进程&lt;/td>
 &lt;td>Root 权限请求处理&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Riru&lt;/strong>&lt;/td>
 &lt;td>Native Bridge 劫持注入 Zygote&lt;/td>
 &lt;td>老版 Zygote 注入框架&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Zygisk&lt;/strong>&lt;/td>
 &lt;td>修补 app_process 注入 Zygote&lt;/td>
 &lt;td>官方 Zygote 注入框架&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>EdXposed&lt;/strong>&lt;/td>
 &lt;td>Riru + ART Hook&lt;/td>
 &lt;td>过渡期 Xposed 实现&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>LSPosed&lt;/strong>&lt;/td>
 &lt;td>Zygisk/Riru + ART Method Hook&lt;/td>
 &lt;td>现代 Xposed 实现&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>DenyList&lt;/strong>&lt;/td>
 &lt;td>Mount namespace 隔离&lt;/td>
 &lt;td>对特定 App 隐藏 Root&lt;/td>
 &lt;/tr>
 &lt;/tbody>
 &lt;/table>
&lt;/div>&lt;h3 class="heading-element" id="82-框架演进总结">&lt;span>8.2 框架演进总结&lt;/span>
 &lt;a href="#82-%e6%a1%86%e6%9e%b6%e6%bc%94%e8%bf%9b%e6%80%bb%e7%bb%93" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;pre>&lt;code>时间线:
2012 ─── Xposed 诞生 (替换 app_process)
 │
2016 ─── Magisk 诞生 (Systemless Root)
 │
2018 ─── Xposed 停止更新
 │ EdXposed 接力 (基于 Riru)
 │
2020 ─── LSPosed 发布 (性能优化、按需注入)
 │
2021 ─── Magisk v24 引入 Zygisk
 │ Riru 逐渐被 Zygisk 取代
 │
2023 ─── Riru 官宣停止维护
 LSPosed Zygisk 版成为主流&lt;/code>&lt;/pre>&lt;h3 class="heading-element" id="83-最佳实践">&lt;span>8.3 最佳实践&lt;/span>
 &lt;a href="#83-%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5" class="heading-mark">
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z">&lt;/path>&lt;/svg>
 &lt;/a>
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>逆向分析阶段&lt;/strong>：使用 Frida 快速分析、定位目标&lt;/li>
&lt;li>&lt;strong>持久化 Hook&lt;/strong>：使用 LSPosed 模块实现长期生效的功能&lt;/li>
&lt;li>&lt;strong>高性能需求&lt;/strong>：使用 Inline Hook 框架 (Dobby/ShadowHook)&lt;/li>
&lt;li>&lt;strong>隐蔽性需求&lt;/strong>：使用 Inline Hook + 代码混淆&lt;/li>
&lt;/ol>
&lt;p>这些技术共同构成了现代 Android 系统修改的核心基础设施，广泛应用于安全研究、应用开发调试和逆向工程领域。&lt;/p>
&lt;p>&lt;strong>推荐下一步&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="./so_anti_debugging_and_obfuscation.md">SO 反调试与混淆&lt;/a>&lt;/li>
&lt;li>&lt;a href="../../01-Recipes/Scripts/native_hooking.md">Native Hook 技术&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>