任何文件在其尾部追加二进制信息后,都不会影响到该文件的正常使用,我们能够看到的,仅仅只是增加了字节数,创建日期,修改日期等都没有任何变化,因此一般寄生型病毒一般都采取这种方式进行传播。我们以C#语言为例,选择任何一个文件作为宿主文件(最好不要选择文本文件,原因是文本文件会产生乱码在尾部),然后选择一个寄生文件,来进行隐藏。为了便于寄生文件的检索、释放、删除,我们需要在寄生文件中加入一些分隔标志、长度信息、寄生文件名。如我们以“%**@@”作为开始分隔符;寄生文件长度用9个字节,不够补空格;寄生文件名用200个字节,不够补空格,附加信息的总长度是216字节。ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
具体实现思路如:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
1. 打开文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
//打开宿主文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
FileStream mother_file
=new FileStream(mother_name ,FileMode.OpenOrCreate); ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
//读出流到buff中ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
mother_file.Read(buff,0,(int)mother_file.Length);
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
2. 显示寄生文件的信息ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
public void review_files{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            listBox1.Items.Clear();  ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
for( int i=0 ;i<=mother_file.Length ; i++)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
               
if(buff=='%'&&buff[i+1]=='*'&&buff[i+2]=='*'&&buff[i+3]=='#'&&buff[i+4]=='#'&&buff[i+5]=='@')ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
               
//隐藏文件分隔符 %**##··ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
               
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    mother_file.Seek(i
+7,0) ; //跳过分隔符ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                   
byte [] filesize=new byte[9];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    mother_file.Read(filesize,
0,9);// 读9位文件大小ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                   
byte  [] filename=new byte[200];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    mother_file.Read(filename,
0,200);//读200位文件名ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    String  name=System.Text.Encoding.Default.GetString(filename,0,200);  ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    String  len
=System.Text.Encoding.Default.GetString(filesize,0,9);  ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    String  offset
=(i+216).ToString(); //寄生文件的位置(偏移量)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    name=name.Substring(0,name.IndexOf('\0'));ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    name
=(name+" ").Substring(0,40);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                 
//格式化文件名为40位                    len=len.Substring(0,len.IndexOf('\0'));ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    len=(len    +" ").Substring(0,20);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                     
//格式化文件大小为20位                    String str=name+len+offset;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    listBox1.Items.Add( str);    ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    listBox1.Refresh();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
3. 追加寄生文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            tryŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                mother_file.Seek(
0, SeekOrigin.End); //宿主文件尾部ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
catchŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
\           
{  MessageBox.Show("宿主未打开"); return;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            DateTime  creat_old
= File.GetCreationTime(textBox2.Text);//暂存文件创建时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            DateTime    write_old= File.GetLastWriteTime(textBox2.Text);//暂存文件修改时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            openFileDialog1.ShowDialog();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            FileStream in_file
=new FileStream(openFileDialog1.FileName,FileMode.Open);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
         
byte[] in_buff=new byte [in_file.Length];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          in_file.Read(in_buff,
0,(int)in_file.Length);//读出拟寄生文件流ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          mother_file.Write(System.Text.Encoding.Default.GetBytes("%**##@@"),0,7);//写入分隔符ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
         
byte[] len=new byte [9];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          len
=System.Text.Encoding.Default.GetBytes( in_file.Length.ToString());ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          mother_file.Write(len ,
0,len.Length);//写入拟寄生文件的的大小ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
         
byte [] temp=new byte[9-len.Length];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          mother_file.Write(temp ,
0,temp.Length);//补空凑为9个字节ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
         
byte[] name=new Byte[200];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          name
=System.Text.Encoding.Default.GetBytes( openFileDialog1.FileName);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            mother_file.Write(name,
0,name.Length);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
byte [] temp2=new byte[200-name.Length];//补空凑为200个字节ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            mother_file.Write(temp2,0,temp2.Length);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            mother_file.Write(in_buff,
0,(int)in_file.Length);//写入拟寄生文件流ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            in_file.Close();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
string mother_name=textBox2.Text;  //暂存宿主文件名ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            mother_file.Close();  //关闭宿主ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            File.SetCreationTime(mother_name,creat_old);//恢复旧的文件创建时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            File.SetLastWriteTime(mother_name,write_old);//恢复旧的文件修改时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            open_mother(mother_name); //打开宿主ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            review_files(); //显示寄生文件
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
4. 释放寄生文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            String  position="",file_long="", file_name="";ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
string[] aa=new string[3];//定义文件信息数组ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
              tryŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                aa
=fetch();//取拟释放文件信息ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
catchŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            MessageBox.Show(
"未选择文件"); return;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            position
=aa[0];  //寄生文件的位置ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_long=aa[1];//寄生文件的大小ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_name=aa[2];//寄生文件的文件名ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          FileStream out_file
=new FileStream(textBox1.Text+"\\"+file_name,FileMode.Create);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
//创建释放文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
byte[] out_buff=newŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
byte[buff.Length];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
tryŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                mother_file.Seek(
int.Parse(position),SeekOrigin.Begin);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
             
//定位寄生文件在宿主中的位置ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
catchŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                MessageBox.Show(
"宿主未打开");return;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            mother_file.Read(out_buff,
0,int.Parse(file_long)); //读取拟释放文件流ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            out_file.Write(out_buff,0,int.Parse(file_long)); //写入释放文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            out_file.Close();
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
5. 删除寄生文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
DateTime  creat_old= File.GetCreationTime(textBox2.Text);//暂存文件创建时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            DateTime    write_old= File.GetLastWriteTime(textBox2.Text);//暂存文件修改时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          String  position
="",file_long="", file_name="";ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
string[] aa=new string[3];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
tryŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                aa
=fetch();//取拟删除文件信息ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
catchŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                MessageBox.Show(
"未选择文件"); return;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            position
=aa[0];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_long
=aa[1];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_name
=aa[2];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
             
int  mother_long;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
tryŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                mother_long
=(int)mother_file.Length;        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
catchŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                MessageBox.Show(
"宿主未打开");return;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
byte[] del_buff=new byte [mother_long-int.Parse(file_long)-216];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
         
//在宿主中定位拟删除文件位置(含216位头信息)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            Array.Copy(buff,0,del_buff,0,int.Parse(position)-216);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
//宿主中拟删除文件前面的信息复制到del_buff中ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            Array.Copy(buff,int.Parse(position)+file_long.Length,del_buff,int.Parse(position)-216,(int)mother_file.Length-              int.Parse(position)-int.Parse(file_long));ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
//宿主中拟删除文件后面的信息复制到del_buff中ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            FileStream temp_file=new FileStream("temp",FileMode.Create);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
//创建 临时文件tempŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            temp_file.Write(del_buff,0,del_buff.Length);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
//del_buff写入temp中ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            temp_file.Close();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
         
//  String old_mother=textBox2.Text.ToString();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
string mother_name=textBox2.Text;  //暂存宿主文件名ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            mother_file.Close(); //关闭宿主文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            File.Delete(mother_name); 
//删除旧的宿主文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            File.Copy("temp",mother_name); //复制temp为新的宿主文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          File.Delete("temp"); //删除临时文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            File.SetCreationTime(mother_name,creat_old);//恢复旧的文件创建时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            File.SetLastWriteTime(mother_name,write_old);//恢复旧的文件修改时间ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          open_mother(mother_name);
//打开新的宿主文件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        review_files(); //显示新宿主中的信息
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
附FETCH函数ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
private string[] fetch() //取出        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            String list_str=listBox1.SelectedItem.ToString();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            String  position
="",file_long="", file_name="";ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_name
=list_str.Substring(0,40); //取出前40位,内含文件名ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_name= file_name.Substring(0,file_name.IndexOf('ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
'));//去尾空格ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
int i;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
for( i=file_name.Length-1; i>=0; i--)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
               
if(file_name=='\\')break;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }
//定位除去路径的文件名的位置ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_name
=file_name.Substring(i+1,file_name.Length-i-1);// 取出文件名ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_long=list_str.Substring(40,9); //取出文件大小ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file_long=file_long.Substring(0,file_long.IndexOf('ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
'));//去尾空格ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            position=list_str.Substring(60,list_str.Length-60); // 取出寄生文件位置 ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
              string[] aa=new string[3];ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            aa[
0]=position;aa[1]=file_long; aa[2]=file_name;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
return(aa);//返回包含寄生文件信息的String数组        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
本方法中原有文件功能均正常,创建、修改时间均未变化,仅仅是长度大了些,隐蔽性还是比较强的,如果对写入的信息进行简单的加密操作则效果更好。
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š