病毒木马植入模块胜利植入用户推算机以后,便会启动进击模块来对用户推算机数据践诺偷取和回传等操纵。时常植入和进击是隔开在不同模块当中的,这边的模块指的是DLL、exe或其余加密的PE文献等。惟独目下植入模块胜利履行后,方可延续履行进击模块,同时会省略植入模块的数据和文献。模块化开垦的长处不但单是便于开垦经管,同时也能够减小因某一模块的失利而致使全面程序走漏的大概性。
本章讲解了种罕用的病毒木马启动手艺,它囊括:
q缔造里程API:讲解哄骗WinExec、ShellExecute以及CreateProcess缔造里程。
q打破SESSION0分隔缔造里程:重要经过CreateProcessAsUser函数实行用户里程缔造。
q内存直接加载运转:模仿PE加载器,直接将DLL和exe等PE文献加载到内存并启动运转。
.1缔造里程API在一个里程中缔造并启动一个新里程,不论是关于病毒木马程序依旧平凡的运用程序而言,这都是一个罕见的手艺,最容易的法子不过是直接经过移用WINAPI函数缔造新里程。用户层上,微软供给了WinExec、ShellExecute和CreateProcess等函数来实行里程缔造。
WinExec、ShellExecute以及CreateProcess除了能够缔造里程外,还能履行CMD下令等功效。接下来,本节将讲解哄骗WinExec、ShellExecute以及CreateProcess函数缔造里程。
.1.1函数讲解1.WinExec函数运转指定的运用程序。
函数表明
UINTWINAPIWinExec(
_In_LPCTSTRlpCmdLine,
_In_UINTuCmdShow)
参数
lpCmdLine[in]
要履行的运用程序的下令行。若是在lpCmdLine参数中可履行文献的称呼不包罗目录门路,则系统将按如下挨次寻找可履行文献:
运用程序的目录、目下目录、Windows系统目录、Windows目录以及PATH处境变量中列出的目录。
uCmdShow[in]
显示选项。SW_HIDE示意躲藏窗口并激活其余窗口;SW_SHOWNORMAL示意激活并显示一个窗口。
返回值
若是函数胜利,则返回值大于1。
若是函数失利,则返回值所如下差错值之一。
值
寓意
0
系统内存或资本不够
ERROR_BAD_FORMAT
exe文献失效
ERROR_FILE_NOT_FOUND
找不到指定文献
ERROR_PATH_NOT_FOUND
找不到指定的门路
.ShellExecute函数运转一个外部程序(或许是翻开一个已挂号的文献、目录,或打印一个文献等),并对外部程序实行确定水平的操纵。
函数表明
HINSTANCEShellExecute(
_In_opt_HWNDhwnd,
_In_opt_LPCTSTRlpOperation,
_In_LPCTSTRlpFile,
_In_opt_LPCTSTRlpParameters,
_In_opt_LPCTSTRlpDirectory,
_In_INTnShowCmd)
参数
hwnd[in,optional]
用于显示UI或差错动静的父窗口的句柄。若是操纵不与窗口相干,则此值可觉得NULL。
lpOperation[in,optional]
指向以空字符末端的字符串的指针,它在本例中称为动词,用于指定要履行的操纵。常哄骗的动词有:
edit:启动编纂器并翻开文档实行编纂。若是lpFile不是文档文献,则该函数将失利。
explore:摸索由lpFile指定的文献夹。
find:在由lpDirectory指定的目录中启动寻找。
open:翻开由lpFile参数指定的项目。该项目可所以文献也不过文献夹。
print:打印由lpFile指定的文献。若是lpFile不是文档文献,则该函数失利。
NULL:若是可用,则哄骗默许动词。若是不成用,则哄骗“翻开”动词。若是两个动词都不成用,则系统哄骗挂号表中列出的第一个动词。
lpFile[in]
指向以空字符末端的字符串的指针,该字符串要在其上履行指定谓词的文献或目标。要指定一个Shell称呼空间目标,传送齐全限定的分化称呼。若是lpDirectory参数哄骗相对门路,则lpFile不要哄骗相对门路。
lpParameters[in,optional]
若是lpFile指定一个可履行文献,则此参数是一个指向以空字符末端的字符串的指针,该字符串指定要传送给运用程序的参数。若是lpFile指定一个文档文献,则lpParameters应当为NULL。
lpDirectory[in,optional]
指向以空结束的字符串的指针,该字符串指定操纵的默许目录。若是此值为NULL,则哄骗目下的处事目录。若是在lpFile中供给了相对门路,请不要对lpDirectory哄骗相对门路。
nShowCmd[in]
指定运用程序在翻开时怎么显示标识。SW_HIDE示意躲藏窗口并激活其余窗口;SW_SHOWNORMAL示意激活并显示一个窗口。
返回值
若是函数胜利,则返回大于的值。若是该函数失利,则它将返回一个差错值,批示失利的缘由。
.CreateProcess函数缔造一个新里程及干线程。新里程在移用里程的平安的高低文中运转。
函数表明
BOOLWINAPICreateProcess(
_In_opt_LPCTSTRlpApplicationName,
_Inout_opt_LPTSTRlpCommandLine,
_In_opt_LPSECURITY_ATTRIBUTESlpProcessAttributes,
_In_opt_LPSECURITY_ATTRIBUTESlpThreadAttributes,
_In_BOOLbInheritHandles,
_In_DWORDdwCreationFlags,
_In_opt_LPVOIDlpEnvironment,
_In_opt_LPCTSTRlpCurrentDirectory,
_In_LPSTARTUPINFOlpStartupInfo,
_Out_LPPROCESS_INFORMATIONlpProcessInformation)
参数
lpApplicationName[in,optional]
要履行的模块的称呼。lpApplicationName参数可所以NULL。要运转批管教文献,必需启动下令评释程序,并将lpApplicationName配置为cmd.exe。
lpCommandLine[in,out,optional]
要履行的下令行。lpCommandLine参数可所以NULL。在这类景况下,该函数哄骗由lpApplicationName指向的字符串做为下令行。若是lpApplicationName和lpCommandLine都不为NULL,则由lpApplicationName指向的以空字符末端的字符串会指定要履行的模块,而且由lpCommandLine指向的以空字符末端的字符串会指天下令行。
lpProcessAttributes[in,optional]
指向SECURITY_ATTRIBUTES构造的指针,用于肯定能否能够由子里程经受返回的新里程目标的句柄。若是lpProcessAttributes为NULL,则不能经受句柄。
lpThreadAttributes[in,optional]
指向SECURITY_ATTRIBUTES构造的指针,用于肯定能否能够由子里程经受返回的新线程目标的句柄。若是lpThreadAttributes为NULL,则不能经受句柄。
bInheritHandles[in]
若是此参数为TRUE,则移用里程中的每个可经受句柄都将由新里程来经受。若是该参数为FALSE,则不会经受句柄。
dwCreationFlags[in]
操纵优先级和缔造里程的标识。譬喻,CREATE_NEW_CONSOLE示意新里程将哄骗一个新操纵台,而不是经受父里程的操纵台。CREATE_SUSPENDED示意新里程的干线程会以停息的状况来缔造,直到移用ResumeThread函数时才运转。
lpEnvironment[in,optional]
指向新里程的处境块的指针。若是此参数为NULL,则新里程将哄骗移用里程的处境。
lpCurrentDirectory[in,optional]
指向里程目下目录的完好门路。该字符串还能够指定UNC门路。若是此参数为NULL,则新里程将具备与移用里程不异的目下启动器和目录。
lpStartupInfo[in]
指向STARTUPINFO或STARTUPINFOEX构造的指针。STARTUPINFO或STARTUPINFOEX中的句柄在不须要时必需由CloseHandle合上。
lpProcessInformation[out]
指向PROCESS_INFORMATION构造的指针,用于接管相关新里程的标记音信。PROCESS_INFORMATION中的句柄必需在不须要时由CloseHandle合上。
返回值
若是函数胜利,则返回值非零。
若是函数失利,则返回值为零。
.1.实行历程直接移用WinExec函数缔造里程,详细的实行代码如下所示。
BOOLWinExec_Test(char*pszExePath,UINTuiCmdShow)
{
UINTuiRet=0;
uiRet=::WinExec(pszExePath,uiCmdShow);
if(1uiRet)
{
returnTRUE;
}
returnFALSE;
}
在上述代码中,WinExec函数惟独两个参数,第一个参数指定程序门路或许CMD下令行,第二个参数指定显示方法。若返回值大于1,则示意WinExec履行胜利,不然履行失利。
直接移用ShellExecute函数缔造里程,详细的实行代码如下所示。
BOOLShellExecute_Test(char*pszExePath,UINTuiCmdShow)
{
HINSTANCEhInstance=0;
hInstance=::ShellExecute(NULL,NULL,pszExePath,NULL,NULL,uiCmdShow);
if((DWORD)hInstance)
{
returnTRUE;
}
returnFALSE;
}
ShellExecute函数不单能够运转exe文献,也能够运转曾经相干的文献。譬喻,能够翻开网页、发送邮件、以默许程序翻开文献、翻开目录、打印文献等。若返回值大于,则示意履行胜利,不然履行失利。
直接移用CreateProcess函数缔造里程,详细的实行代码如下所示。
BOOLCreateProcess_Test(char*pszExePath,UINTuiCmdShow)
{
STARTUPINFOsi={0};
PROCESS_INFORMATIONpi;
BOOLbRet=FALSE;
si.cb=sizeof(si);
si.dwFlags=STARTF_USESHOWWINDOW;//指定wShowWindow成员有用
si.wShowWindow=uiCmdShow;
bRet=::CreateProcess(NULL,pszExePath,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,si,pi);
if(bRet)
{
//不哄骗的句柄最佳关掉
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
returnTRUE;
}
returnFALSE;
}
与WinExec以及ShellExecute函数相较量而言,CreateProcess函数的参数更多,哄骗起来更繁杂。咱们重视