mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
92 lines
4.7 KiB
Markdown
92 lines
4.7 KiB
Markdown
# 利用可调试应用程序
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
# **绕过root和可调试检查**
|
||
|
||
本节内容是来自帖子 [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) 的总结
|
||
|
||
## 使Android应用可调试并绕过检查的步骤
|
||
|
||
### **使应用可调试**
|
||
|
||
内容基于 https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
|
||
|
||
1. **反编译APK:**
|
||
|
||
- 使用APK-GUI工具反编译APK。
|
||
- 在 _android-manifest_ 文件中插入 `android:debuggable=true` 以启用调试模式。
|
||
- 重新编译、签名并进行zipalign处理。
|
||
|
||
2. **安装修改后的应用:**
|
||
|
||
- 使用命令: `adb install <application_name>`。
|
||
|
||
3. **获取包名:**
|
||
|
||
- 执行 `adb shell pm list packages –3` 列出第三方应用并找到包名。
|
||
|
||
4. **设置应用以等待调试器连接:**
|
||
|
||
- 命令: `adb shell am setup-debug-app –w <package_name>`。
|
||
- **注意:** 每次启动应用之前必须运行此命令以确保它等待调试器。
|
||
- 为了持久性,使用 `adb shell am setup-debug-app –w -–persistent <package_name>`。
|
||
- 要移除所有标志,使用 `adb shell am clear-debug-app <package_name>`。
|
||
|
||
5. **在Android Studio中准备调试:**
|
||
|
||
- 在Android Studio中导航到 _File -> Open Profile or APK_。
|
||
- 打开重新编译的APK。
|
||
|
||
6. **在关键Java文件中设置断点:**
|
||
- 在 `MainActivity.java`(特别是在 `onCreate` 方法中)、`b.java` 和 `ContextWrapper.java` 中设置断点。
|
||
|
||
### **绕过检查**
|
||
|
||
应用程序在某些时刻会验证是否可调试,并检查指示设备已root的二进制文件。可以使用调试器修改应用信息,取消设置可调试位,并更改搜索的二进制文件名称以绕过这些检查。
|
||
|
||
对于可调试检查:
|
||
|
||
1. **修改标志设置:**
|
||
- 在调试器控制台的变量部分,导航到: `this mLoadedAPK -> mApplicationInfo -> flags = 814267974`。
|
||
- **注意:** `flags = 814267974` 的二进制表示为 `11000011100111011110`,表示“Flag_debuggable”处于活动状态。
|
||
|
||

|
||
|
||
这些步骤共同确保应用程序可以被调试,并且可以使用调试器绕过某些安全检查,从而便于对应用程序行为进行更深入的分析或修改。
|
||
|
||
步骤2涉及将标志值更改为814267972,其二进制表示为110000101101000000100010100。
|
||
|
||
# **利用漏洞**
|
||
|
||
演示使用了一个包含按钮和文本视图的易受攻击应用程序。最初,应用程序显示“Crack Me”。目标是在运行时将消息从“Try Again”更改为“Hacked”,而不修改源代码。
|
||
|
||
## **检查漏洞**
|
||
|
||
- 使用 `apktool` 反编译应用程序以访问 `AndroidManifest.xml` 文件。
|
||
- `AndroidManifest.xml` 中存在 `android_debuggable="true"` 表明该应用程序是可调试的,易受攻击。
|
||
- 值得注意的是,`apktool` 仅用于检查可调试状态,而不修改任何代码。
|
||
|
||
## **准备设置**
|
||
|
||
- 该过程涉及启动模拟器,安装易受攻击的应用程序,并使用 `adb jdwp` 识别正在监听的Dalvik VM端口。
|
||
- JDWP(Java Debug Wire Protocol)允许调试在VM中运行的应用程序,通过暴露唯一端口。
|
||
- 远程调试需要端口转发,然后将JDB附加到目标应用程序。
|
||
|
||
## **在运行时注入代码**
|
||
|
||
- 通过设置断点和控制应用程序流程进行利用。
|
||
- 使用 `classes` 和 `methods <class_name>` 等命令来揭示应用程序的结构。
|
||
- 在 `onClick` 方法处设置断点,并控制其执行。
|
||
- 使用 `locals`、`next` 和 `set` 命令检查和修改局部变量,特别是将“Try Again”消息更改为“Hacked”。
|
||
- 使用 `run` 命令执行修改后的代码,成功实时更改应用程序的输出。
|
||
|
||
这个例子演示了如何操纵可调试应用程序的行为,突显了更复杂的利用潜力,例如在应用程序上下文中获得设备的shell访问权限。
|
||
|
||
## 参考文献
|
||
|
||
- [https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||
- [https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|