病毒木马植入模块成功植入计算机之后,便会启动攻击模块来对用户计算机数据实施窃取和回传等操作。通常植入和攻击是分开在不同的模块之中的,这里的模块指的是DLL、exe或者其他加密的PE文件。只有当前植入模块成功运行后,方可继续执行攻击模块,同时会删除植入模块的数据和文件。模块化开发的好处不单单是便于开发管理,同时也可以减小因某一模块失败而造成整个程序暴露的风险。
创建进程API主要有三个:
除了可以创建进程外,还能执行CMD命令;
运行指定的程序
UINT WINAPI WinExec(
_In_ LPCTSTR lpCmdLine,
_In_ UINT uCmdShow)
值 | 含义 |
---|---|
0 | 系统内存或资源不足 |
ERROR_BAD_FORMAT | exe文件无效 |
ERROR_FILE_NOT_FOUND | 找不到指定文件 |
ERROR_PATH_NOT_FOUND | 找不到指定目录 |
通过winExec API启动计算器窗口;
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#undef UNICODE
#include
#include
#include "resource.h"
BOOL WinExec_Test(char* pszExePath, UINT uiCmdShow)
{
UINT uiRet = 0;
uiRet = WinExec(pszExePath, uiCmdShow);
if (uiRet > 31)
{
return TRUE;
}
return FALSE;
}
int main()
{
char pszExePath[40] = "C:\\Windows\\System32\\calc.exe";
BOOL flag = WinExec_Test(pszExePath, SW_SHOWNORMAL);
if (flag == TRUE)
{
printf("success\n");
}
return 0;
}
可见,已经把计算器窗口打开了。
不加绝对路径,直接启动也是可以的。
int main()
{
char pszExePath[40] = "calc.exe";
BOOL flag = WinExec_Test(pszExePath, SW_HIDE);
if (flag == TRUE)
{
printf("success\n");
}
return 0;
}
运行一个外部程序(或者打开一个已注册的文件、目录,或打印一个文件等),对外部程序进行一定程度的控制。
HINSTANCE ShellExecute(
_In_opt_ HWND hwnd,
_In_opt_ LPCTSTR lpOperation,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ INT nShowCmd)
如果函数成功,则返回值大于32,否则将返回错误值,指示失败原因。
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#undef UNICODE
#include
#include
#include "resource.h"
#include "ConsoleApplication1.h"
BOOL ShellExecute_Test(char* pszExePath, char* lpDIrec, UINT uiCmdShow)
{
HINSTANCE hinstance = 0;
hinstance = ShellExecute(NULL, "open", pszExePath, NULL, lpDIrec, uiCmdShow);
if ((DWORD)hinstance > 32)
{
return TRUE;
}
return FALSE;
}
int main()
{
char pszExePath[40] = "calc.exe";
char lpDIrec[40] = "C:\\Windows\\System32";
BOOL flag = ShellExecute_Test(pszExePath, lpDIrec, SW_HIDE);
if (flag == TRUE)
{
printf("success\n");
}
return 0;
}
运行窗口:
创建一个新进程及主线程,新进程在调用进程的安全的上下文中运行。
BOOL WINAPI CreateProcess(
10个参数)
与WinExec以及ShellExecute函数相比较而言,CreateProcess函数的参数更多,使用起来更复杂。我们着重关注以下5个参数:
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include
#include
#include "resource.h"
#include "ConsoleApplication1.h"
BOOL CreateProcess_Test(LPWSTR pszExePath, UINT uiCmdShow)
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = uiCmdShow;
BOOL bRet = CreateProcess(NULL, pszExePath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (bRet)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return TRUE;
}
return FALSE;
}
int main()
{
wchar_t pszExePath[20] = L"calc.exe";
BOOL flag = CreateProcess_Test(pszExePath, SW_HIDE);
if (flag == TRUE)
{
printf("success\n");
}
return 0;
}