【旧博文】需求与病毒
随着开发平台的高级化智能化,程序员编写程序的门槛越来越低了。加上各个操作系统的API不断的完善,程序员很容易编写出与底层交互的程序。熊猫烧香,灰鸽子。。。,很多病毒都是使用高级语言编写的。另一方面,在用户需求上,也涉及到一些自动交互的底层应用。比如:U盘自动备份程序。
在一个实际项目中,客户要求实现U盘的自动备份。起源是,现在U盘的使用已经十分普及,市面上的U盘品牌五花八门,其中的质量也良莠不齐,在享受U盘给我们带来的方便的同时,一些问题也随之而来,质量的不同性带来了稳定性的问题,在使用的时候,经常会丢失数据。用户的需求具体的过程是,当用户U盘插入到计算机时,自动将U盘的内容复制到本地磁盘上的某个目录中。
这个功能的实现并不复杂。计算机系统的硬件发生变化时,系统会产生WM_DEVICECHANGE消息。
WIN32下,在回调函数中截获消息。
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_DEVICECHANGE: //硬件发生改变
{
DWORD wp = (DWORD)wParam; //保存硬件发生改变中产生的事件拦截。
switch(wp)
{
case DBT_DEVICEARRIVAL://硬件插入并可以使用
{
PDEV_BROADCAST_HDR pbh = reinterpret_cast<PDEV_BROADCAST_HDR>(lParam);
if (pbh->dbch_devicetype = DBT_DEVTYP_VOLUME) //移动设备
{
PDEV_BROADCAST_VOLUME pbv = reinterpret_cast<PDEV_BROADCAST_VOLUME>(pbh);
DWORD unit = pbv->dbcv_unitmask;
int i=0; //当前盘符
while ( !(unit&1) )//循环找出最后一个盘的盘符
{
if (i == 25)
{
break;
}
i++;
unit >>= 1;
}
char *source = new char(10);
sprintf(source, "%c:\\", i+65);
copyFileToTag cf(source); //构造一个以source为源地址的对象
if ( !cf.copy("C:\\11") ) //拷贝到C:\11目录下
{
MessageBox(hwnd, "拷贝失败", "", NULL);
}
}
}
break;
}
}
// 其他操作
}
简单的一个WM_DEVICECHANGE消息就可以了。就这样,实现了客户的需求。但试想一下,加上进程隐藏,程序隐藏,热键处理俨然就变成了一个超级的后台备份器,然后呢,加上网络传播、自我复制就变成了病毒。