c# – 在分隔符处拆分字节数组

前端之家收集整理的这篇文章主要介绍了c# – 在分隔符处拆分字节数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个问题,这里的其他问题对我没什么帮助.

我是一名安全学生,我正在为一个项目写一个神甫.对于那些不知道它是什么的人,你可以在这里阅读.
http://www.gamekiller.net/tutorials-guides/17187-tut-making-crypter-vb6-using-rc4.html

无论如何,一个快速的解释,加密器是通过加密程序然后在前面粘贴“存根”(一个解密它的程序)来绕过防病毒的程序.我分割文件时遇到了一个非常烦人的问题.

最大的烦恼是我必须将加密的可执行文件放入一个字节数组中,因为字符串会杀死我的加密可执行文件中的某些字符,使其无法执行.更糟糕的是,我仍然必须“拆分”exe,这就是麻烦开始的地方.

存根的基本思想是:

>获取当前的exe路径
>通过File.ReadAllytes读取所有字节
>在分隔符“EVILDELIMITER”拆分文件
>获取最后一个字段(因为那是加密的EXE)
>使用RC4解密它
>使用RunPE运行.

我有一切工作,除了分裂部分,这是最烦人的.如何在分隔符处拆分字节数组?有更简单的方法吗?

这是我到目前为止存根的代码.

public void main()
{
    string outpath = RandomString(8) + ".exe";
    byte[] key = { 33,44,55,66,77 };
    string apppath = Assembly.GetEntryAssembly();
    byte[] exe = File.ReadAllBytes(apppath);
    string strseperate = "EVILSEPERATOREVIL";
    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    byte[] seperator = encoding.GetBytes(strseperate);
    //Split code should go here

    exe = Decrypt(key,encrypted);
    Process.Start(outpath);
}

谢谢你的帮助.

解决方法

byte[] SeparateAndGetLast(byte[] source,byte[] separator)
{
  for (var i = 0; i < source.Length; ++i)
  {
     if(Equals(source,separator,i))
     {
       var index = i + separator.Length;
       var part = new byte[source.Length - index];
       Array.Copy(source,index,part,part.Length);
       return part;
     }
  }
  throw new Exception("not found");
}

public static byte[][] Separate(byte[] source,byte[] separator)
{
    var Parts = new List<byte[]>();
    var Index = 0;
    byte[] Part;
    for (var I = 0; I < source.Length; ++I)
    {
        if (Equals(source,I))
        {
            Part = new byte[I - Index];
            Array.Copy(source,Index,Part,Part.Length);
            Parts.Add(Part);
            Index = I + separator.Length;
            I += separator.Length - 1;
        }
    }
    Part = new byte[source.Length - Index];
    Array.Copy(source,Part.Length);
    Parts.Add(Part);
    return Parts.ToArray();
}

bool Equals(byte[] source,byte[] separator,int index)
{
  for (int i = 0; i < separator.Length; ++i)
    if (index + i >= source.Length || source[index + i] != separator[i])
      return false;
  return true;
}

猜你在找的C#相关文章