.

Windows黑客编程技术详解第四

病毒木马植入模块胜利植入用户推算机以后,便会启动进击模块来对用户推算机数据践诺偷取和回传等操纵。时常植入和进击是隔开在不同模块当中的,这边的模块指的是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函数的参数更多,哄骗起来更繁杂。咱们重视


转载请注明:http://www.abachildren.com/sszl/1114.html