Goober S. Johnsson Ответов: 1

Как обернуть Мой конструктор заглушкой? C# .NET


В настоящее время я изучаю криптеры, и это то, что я узнал до сих пор.

Криптер состоит из Строителя и заглушки.

Роль строителей заключается в шифровании файла, а заглушка обертывает файл и заставляет его работать в буфере, то есть в памяти машины, на которой он расшифровывается. (Пожалуйста, исправьте, если я ошибаюсь)

Я создал свой файловый шифратор (The builder) и, честно говоря, понятия не имею, как создать заглушку.. Я искал вокруг весь день, но все, что я могу найти, это эти действительно старые консольные приложения, ничего толком не объясняющие..

Поэтому мой вопрос таков.. Как обернуть мой текущий файловый шифратор заглушкой... или как создать заглушку. Не знаю, как сформулировать этот вопрос, так как я новичок в заглушках.

Вот мой шифровальщик файлов.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Windows;
using Microsoft.Win32;
using System.Security.Cryptography;
using System.IO;

namespace Encrypter
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        string key;
        public MainWindow()
        {
            InitializeComponent();
            key = generateKey();
        }

        public string generateKey()
        {
            DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
            return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
        }

        private void EncryptBtn_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.ShowDialog();

                inputencryptFileTextBox.Text = ofd.FileName;

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.ShowDialog();

                outputencryptFileTextBox.Text = sfd.FileName;

                encrypt(inputencryptFileTextBox.Text, outputencryptFileTextBox.Text, key);
                MessageBox.Show("File has been encrypted.", "File");

            }
            catch(Exception encEx)
            {
                MessageBox.Show(encEx.ToString());
            }
            
        }

        private void encrypt(string input, string output, string strhash)
        {
            FileStream inFs, outFs;
            CryptoStream cs;
            TripleDESCryptoServiceProvider TDC = new TripleDESCryptoServiceProvider();
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

            byte[] byteHash, byteTexto;

            inFs = new FileStream(input, FileMode.Open, FileAccess.Read);
            outFs = new FileStream(output, FileMode.OpenOrCreate, FileAccess.Write);

            byteHash = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strhash));
            byteTexto = File.ReadAllBytes(input);

            md5.Clear();

            TDC.Key = byteHash;
            TDC.Mode = CipherMode.ECB;

            cs = new CryptoStream(outFs, TDC.CreateEncryptor(), CryptoStreamMode.Write);

            int byteRead;
            long length, position = 0;
            length = inFs.Length;

            while (position < length)
            {
                byteRead = inFs.Read(byteTexto, 0, byteTexto.Length);
                position += byteRead;

                cs.Write(byteTexto, 0, byteRead);

            }

            inFs.Close();
            outFs.Close();

        }

        private void DecryptBtn_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.ShowDialog();

                inputdecryptFileTextBox.Text = ofd.FileName;

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.ShowDialog();

                outputdecryptFileTextBox.Text = sfd.FileName;

                decrypt(inputdecryptFileTextBox.Text, outputdecryptFileTextBox.Text, key);
                MessageBox.Show("File has been decrypted.", "File");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
   


        private void decrypt(string input, string output, string strhash)
        {
            FileStream inFs, outFs;
            CryptoStream cs;
            TripleDESCryptoServiceProvider TDC = new TripleDESCryptoServiceProvider();
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

            byte[] byteHash, byteTexto;

            inFs = new FileStream(input, FileMode.Open, FileAccess.Read);
            outFs = new FileStream(output, FileMode.OpenOrCreate, FileAccess.Write);

            byteHash = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strhash));
            byteTexto = File.ReadAllBytes(input);

            md5.Clear();

            TDC.Key = byteHash;
            TDC.Mode = CipherMode.ECB;

            cs = new CryptoStream(outFs, TDC.CreateDecryptor(), CryptoStreamMode.Write);

            int byteRead;
            long length, position = 0;
            length = inFs.Length;

            while (position < length)
            {
                byteRead = inFs.Read(byteTexto, 0, byteTexto.Length);
                position += byteRead;

                cs.Write(byteTexto, 0, byteRead);

            }

            inFs.Close();
            outFs.Close();

        }
    }
}


Что я уже пробовал:

Я пробовал просматривать некоторые примеры в Google и на некоторых форумах, но все, что я мог найти, - это старые консольные приложения 2009 года.

1 Ответов

Рейтинг:
1

Garth J Lancaster

Ну, в коде, который вы опубликовали, "строитель" и "заглушка" в основном объединены в сами функции шифрования и дешифрования - они используют, например, "файловые потоки", которые максимально близки к "памяти" в вашем примере - Эй, если они работают, то все в порядке

Один из способов приблизиться к решению builder/stub, как вы выразились, состоял бы в том, чтобы функции encrypt/decrypt принимали (например) только массив байтов .. таким образом, работа builder заключается в том, чтобы получить массив байтов - например, из файла, а затем представить массив байтов в заглушку, зашифровав его/расшифровав.

не уверен, что мне нравится определение 'строитель' и 'тупик', как в этом случае - то, что я хотел сделать, это сломать обработку еще больше, так что вы можете указать тип шифрования, который вы хотите выполнить на байтовый массив - TripleDES, как вы используете здесь или 'Ня' или такие - так что вы, возможно, TripleDES шифрование класса - действительно, он мог принять поток FileStream, или ByteArray, или в потоке MemoryStream например

не уверен, что какая-то из этих вафель поможет


Goober S. Johnsson

Честно говоря, это помогло, но это то, к чему я привел ти

Заглушка - это коробка, которая содержит зашифрованную полезную нагрузку и расшифровывает ее, а затем использует RunPE
Чтобы сбросить расшифрованную полезную нагрузку в память

RunPE-обязательно вводит полезную нагрузку в память выбранного процесса.

Зашифруйте полезную нагрузку с помощью конструктора
накройте эту полезную нагрузку окурком
заглушка содержит RunPE, который будет следить за тем, чтобы полезная нагрузка
в окурке получишь пулю в память

Теперь видеть..
Я понятия не имею, как он должен быть построен.. Не могли бы вы помочь мне подготовить базу для этого?

Goober S. Johnsson

Я предполагаю, что создам его вот так..

Конструктор, который в основном шифрует файл и добавляет к нему runPE
затем он добавляет к нему окурок
затем сохраняет файл?

Garth J Lancaster

Я был бы рад дать совет по таким вещам , как "саморазшифрующиеся файлы" - хотя мой первый совет был бы: "не надо-Мир безопасности уходит от таких вещей по целому ряду причин" .. то, что вы добавили "RunPE" и "вводите полезную нагрузку в память выбранного процесса", беспокоит меня - как человека, который работал в EDI/финансовом/банковском секторах, это не стоило бы моего имени, чтобы помочь кому-то собрать такой процесс вместе, потому что шанс на злоупотребление очень велик-так что, извините, нет.

Goober S. Johnsson

Я полностью понимаю, что уважаю это решение!
Я знаю, что это звучит странно и что я могу использовать его для " плохих вещей"
реальность такова, что я просто пытаюсь узнать больше об этом предмете, и лучший способ для меня научиться-это испачкать в нем руку.
И я не добавил Рунп или антихинг, я просто объяснял, как, по-моему, он был построен :p