• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

С# Шифрование строк через Mono Cecil

Antlion

Участник
Сообщения
12
Реакции
13
0 руб.
Telegram
Код для шифрования:
C#:
namespace MonoStringObf
{
    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using Mono.Cecil;
    using Mono.Cecil.Cil;

    public class Obfuscation
    {
        private static string Encode(string str) => Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(str));

        private static MethodDefinition InjectDecrypter(AssemblyDefinition AssemblyDef)
        {
            foreach (ModuleDefinition ModuleDef in AssemblyDef.Modules)
            {
                foreach (TypeDefinition TypeDef in ModuleDef.GetTypes())
                {
                    if (TypeDef.Name.Equals("<Module>"))
                    {
                        MethodDefinition MethodDef = CreateDecrypter(AssemblyDef);
                        TypeDef.Methods.Add(MethodDef);
                        return MethodDef;
                    }
                }
            }
            throw new Exception("Decrypter not injected.");
        }

        private static void Encrypt(AssemblyDefinition AssemblyDef, MethodDefinition MD, string filename)
        {
            foreach (ModuleDefinition ModuleDef in AssemblyDef.Modules)
            {
                foreach (TypeDefinition TypeDef in ModuleDef.GetTypes())
                {
                    foreach (MethodDefinition MethodDef in TypeDef.Methods)
                    {
                        if (MethodDef.HasBody)
                        {
                            ILProcessor ilp = MethodDef.Body.GetILProcessor();

                            for (int i = 0; i < MethodDef.Body.Instructions.Count; i++)
                            {
                                Instruction InstructionDef = MethodDef.Body.Instructions[i];
                                if (InstructionDef.OpCode == OpCodes.Ldstr)
                                {
                                    InstructionDef.Operand = Encode(InstructionDef.Operand.ToString());
                                    ilp.InsertAfter(InstructionDef, Instruction.Create(OpCodes.Call, MD));
                                }
                            }
                        }
                    }
                }
            }
            AssemblyDef.Write(filename);
        }

        private static MethodDefinition CreateDecrypter(AssemblyDefinition AssemblyDef)
        {
            var Decrypt = new MethodDefinition("Decrypt", MethodAttributes.Public | MethodAttributes.Static, AssemblyDef.MainModule.ImportReference(typeof(string)));
            Decrypt.Parameters.Add(new ParameterDefinition(AssemblyDef.MainModule.ImportReference(typeof(string))));
            var Body = new List<Instruction>
            {
                Instruction.Create(OpCodes.Call, AssemblyDef.MainModule.ImportReference(typeof(System.Text.Encoding).GetMethod("get_UTF8"))),
                Instruction.Create(OpCodes.Ldarg_0),
                Instruction.Create(OpCodes.Call, AssemblyDef.MainModule.ImportReference(typeof(System.Convert).GetMethod("FromBase64String", new Type[] { typeof(string) }))),
                Instruction.Create(OpCodes.Callvirt, AssemblyDef.MainModule.ImportReference(typeof(System.Text.Encoding).GetMethod("GetString", new Type[] { typeof(byte[]) }))),
                Instruction.Create(OpCodes.Ret)
            };

            foreach (Instruction Instr in Body)
            {
                Decrypt.Body.Instructions.Add(Instr);
            }

            return Decrypt;
        }

        public static bool Inizialize(string filepath, string outputfilename)
        {
            try
            {
                using (var AssemblyDef = AssemblyDefinition.ReadAssembly(filepath))
                {
                    Encrypt(AssemblyDef, InjectDecrypter(AssemblyDef), outputfilename);
                    MessageBox.Show("Файл успешно зашифрован!");
                    return true;
                }
            }
            catch { MessageBox.Show("Не смогли зашифровать."); return false; }
        }
    }
}

Используется так:

C#:
Obfuscation.Inizialize(this.FileBoxPath.Text, $"{this.OutPutBox.Text}.exe");

Выглядит это всё так:

23368

После шифрования текст выглядит так: ( Файл не ломается )

23367

Ну и конечно выложу готовый шифровальщик: используйте для своих нужд.

Ссылка на архив: Mono String Obfuscation
 
Сверху Снизу