內(nèi)容:
分析病毒結(jié)構(gòu)床三,寫出病毒如何利用漏洞進(jìn)行攻擊,詳細(xì)剖析勒索病毒的運(yùn)行過(guò)程月趟,使用了什么加密算法灯蝴,調(diào)用了什么系統(tǒng)API。
進(jìn)階:
中了該勒索病毒孝宗,怎么恢復(fù)數(shù)據(jù)
樣本分析
首先是看下病毒樣本的哈希值
查殼信息穷躁,win32程序無(wú)殼:
載入IDA后墓怀,先查看字符串蜈膨,看到有RSA和AES,猜測(cè)之后會(huì)使用這兩種加密方式:
用IDA的findcrypto插件饼暑,找到了AES算法的特征:
第一部分
之后開(kāi)始對(duì)病毒樣本進(jìn)行詳細(xì)分析婚被,首先是程序入口點(diǎn):
一開(kāi)始病毒獲取它的運(yùn)行絕對(duì)路徑狡忙,用OD動(dòng)態(tài)調(diào)試時(shí)可得:
在函數(shù) sub_401225中,會(huì)根據(jù)當(dāng)前的計(jì)算機(jī)名隨機(jī)生成一組字符串址芯,后面會(huì)用到
OD動(dòng)調(diào)結(jié)果:
如果參數(shù)有/i灾茁,就把病毒自身復(fù)制到之前隨機(jī)字符串的文件夾中窜觉,名稱為tasksche.exe,之后去運(yùn)行這個(gè)北专,但是我沒(méi)用命令行去運(yùn)行禀挫,所以直接就跳到下一步。之后將路徑切換到了當(dāng)前的文件夾下拓颓,在sub_4010FD里面會(huì)添加一條新的注冊(cè)表項(xiàng)
但是在OD調(diào)試的時(shí)候發(fā)現(xiàn)在注冊(cè)表中沒(méi)有這一項(xiàng)语婴,跟到函數(shù)里面,發(fā)現(xiàn)在執(zhí)行完RegSetValueExA退出了驶睦,懷疑是權(quán)限問(wèn)題導(dǎo)致注冊(cè)表沒(méi)能成功添加
分析下在sub_401DAB里面進(jìn)行的操作砰左,主要對(duì)資源文件進(jìn)行獲取和釋放到當(dāng)前文件夾,用到了FindResourceA啥繁,LoadResource等對(duì)資源操作的函數(shù)菜职,下圖的Type是XIA,可以通過(guò)Resource Hacker來(lái)找到程序釋放的資源
找到名字叫做XIA的資源段旗闽,里面一看是PK頭酬核,意識(shí)到是一個(gè)zip壓縮包,直接用foremost從程序中提取出zip壓縮包适室,密碼是壓到棧里的參數(shù)WNcry@2ol7
配合OD嫡意,執(zhí)行完釋放資源的函數(shù)后,文件夾中的內(nèi)容多了一堆捣辆,應(yīng)該都是之后病毒要使用的文件蔬螟,十六進(jìn)制編輯器打開(kāi)后發(fā)現(xiàn)有PE文件,壓縮包汽畴,被加密的文件等
之后執(zhí)行兩條命令
attrib +h .
icacls . /grant Everyone:F /T /C /Q
這兩條命令搜了一下用法旧巾,
attrib為批處理文件命令 具體解釋如下:- 清除屬性。 R 只讀文件屬性忍些。 A 存檔文件屬性鲁猩。 S 系統(tǒng)文件屬性。 H 隱藏文件屬性罢坝。
這個(gè)地方命令用錯(cuò)了廓握,對(duì)當(dāng)前文件下文件隱藏不需要加點(diǎn),直接attrib +h就可以嘁酿,這里意思是想把這些病毒使用的文件全部隱藏隙券,結(jié)果沒(méi)什么用
第二條指令:
icacls
Intergrity Control Access Control List: 完整性權(quán)限控制列表 Windows系統(tǒng)下控制文件及文件夾的訪問(wèn)權(quán)限的命令行指令,相當(dāng)于Linux中的chmod 原命令cacls已經(jīng)被廢棄闹司。
MS documentation: 1, F = Full Control
? 777
2, CI = Container Inherit - This flag indicates that subordinate containers will inherit this ACE.
? 子文件夾繼承父文件夾權(quán)限
3, OI = Object Inherit - This flag indicates that subordinate files will inherit the ACE.
? 子文件繼承父文件夾權(quán)限
4, /T = Apply recursively to existing files and sub-folders. (OI and CI only apply to new files and sub-folders).
? 遞歸傳遞權(quán)限
在函數(shù)sub_4014A6里娱仔,對(duì)之前解壓的t.cnry進(jìn)行解壓,并加載到內(nèi)存里开仰,在內(nèi)存可以看到PE結(jié)構(gòu)的文件拟枚,直接用PEload轉(zhuǎn)存出一份內(nèi)存文件薪铜,再用foremost提取出一個(gè)PE文件:
之后進(jìn)入函數(shù)sub_4021BD回去判斷是一個(gè)PE文件,在堆上申請(qǐng)了空間恩溅,并把這個(gè)PE文件加載到堆上
wcry.exe的后半部分的流程如下圖:
在提取出的dll文件中隔箍,打開(kāi)導(dǎo)出函數(shù)可以看到TaskStart,說(shuō)明在v8處執(zhí)行了這個(gè)函數(shù)
之后OD運(yùn)行到call eax脚乡,進(jìn)入了dll的函數(shù)蜒滩,整個(gè)病毒就開(kāi)始進(jìn)行加密了
可以發(fā)現(xiàn)wcry.exe其實(shí)并沒(méi)有進(jìn)行文件加密等病毒操作,大部分功能都是在釋放資源和分配空間奶稠,直到開(kāi)始運(yùn)行釋放出來(lái)的dll中的導(dǎo)出函數(shù)才會(huì)開(kāi)始加密俯艰,所以這里直接把這個(gè)調(diào)用TaskStart的call給nop掉就不會(huì)中毒,因?yàn)閣cry.exe的功能已經(jīng)分析完了锌订,測(cè)試了下想法竹握,修改完保存二進(jìn)制程序,此時(shí)程序就只是釋放所有資源文件辆飘,不會(huì)加密文件
這部分的API函數(shù)總結(jié):
1.GetModuleFileNameA
函數(shù)功能:獲取當(dāng)前運(yùn)行程序的絕對(duì)路徑
DWORD GetModuleFileNameA(
HMDULE hModule, //所需路徑的模塊的句柄啦辐。如果該參數(shù)為NULL,函數(shù)會(huì)獲取當(dāng)前進(jìn)程的運(yùn)行文件(.exe文件)的全路徑蜈项。
LPSTR lpFilename, //一個(gè)指向接收存儲(chǔ)模塊的全路徑的緩沖區(qū)的指針芹关。如果路徑的長(zhǎng)度小于nSize參數(shù)定義的長(zhǎng)度,返回路徑為一個(gè)結(jié)尾為空終止('\0')的字符串紧卒;如果路徑的長(zhǎng)度超過(guò)nSize參數(shù)所定義的長(zhǎng)度侥衬,字符串會(huì)截?cái)嗟絥Size個(gè)字符的長(zhǎng)度,并在最后及nSize-1的位置包含一個(gè)終止符('\0')跑芳。
DWORD nSize //lpFilename緩沖區(qū)的長(zhǎng)度轴总。
); //如果函數(shù)運(yùn)行成功,返回值為字符串的長(zhǎng)度博个。如果字符串的長(zhǎng)度大于nSize字節(jié)肘习,返回值為nSize。如果函數(shù)運(yùn)行失敗坡倔,返回值為0。
2.GetComputerNameW
函數(shù)功能:獲取計(jì)算機(jī)名
BOOL GetComputerNameA(
LPSTR lpBuffer, //指向接收計(jì)算機(jī)名稱或群集虛擬服務(wù)器名稱的緩沖區(qū)的指針脖含。緩沖區(qū)大小應(yīng)足夠大罪塔,以包含MAX_COMPUTERNAME_LENGTH + 1個(gè)字符。
LPDWORD nSize //在輸入時(shí)养葵,在TCHAR中指定緩沖區(qū)的大小征堪。在輸出時(shí),復(fù)制到目標(biāo)緩沖區(qū)的TCHAR數(shù)关拒,不包括終止空字符佃蚜。如果緩沖區(qū)太小庸娱,則函數(shù)失敗,GetLastError返回ERROR_BUFFER_OVERFLOW谐算。所述lpnSize參數(shù)指定緩沖器的所需要的大小熟尉,包括終止空字符。
);
3.MultiByteToWideChar
函數(shù)功能:該函數(shù)映射一個(gè)字符串到一個(gè)寬字符(unicode)的字符串洲脂。由該函數(shù)映射的字符串沒(méi)必要是多字節(jié)字符組斤儿。
函數(shù)原型:
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
4.GetWindowsDirectory
函數(shù)功能:獲取Windows目錄的完整路徑名
UINT WINAPI GetWindowsDirectory(__out LPTSTR lpBuffer, __in UINT uSize);
lpBuffer [out]
一個(gè)緩沖區(qū),是一個(gè)接收路徑的指針恐锦。這條路徑并沒(méi)有結(jié)束往果,除非以反斜杠Windows目錄是根目錄。例如一铅,如果Windows目錄被命名為Windows的C驅(qū)動(dòng)器上的Windows目錄的路徑檢索這個(gè)函數(shù)是C:\窗口陕贮。如果系統(tǒng)在驅(qū)動(dòng)器C的根目錄,檢索安裝路徑是C:\潘飘。
lpBuffer String肮之,指定一個(gè)字串緩沖區(qū),用于裝載Windows目錄名福也。除非是根目錄局骤,否則目錄中不會(huì)有一個(gè)中止用的“\”字符
uSize [in]
至于由lpBuffer參數(shù)指定的緩沖區(qū)的最大尺寸,在TCHARs暴凑。此值應(yīng)設(shè)置為MAX_PATH峦甩。
nSize Long,lpBuffer字串的最大長(zhǎng)度
5.GetFileAttributes
函數(shù)功能:為一個(gè)指定的文件或目錄返回文件系統(tǒng)的屬性现喳】粒可以使用GetFileAttributesEx 函數(shù)獲得更多的屬性信息。如果要實(shí)現(xiàn)交互式操作嗦篱,可以使用GetFileAttributesTransacted 函數(shù)冰单。
DWORD WINAPI GetFileAttributes(
__in LPCTSTR lpFileName
);
參數(shù)
lpFileName [in]
文件或目錄的名字,對(duì)于ANSI版本灸促,名字不能大于MAX_PATH诫欠。
返回值
如果函數(shù)成功,返回值包含文件或目錄的屬性浴栽。如果函數(shù)失敗荒叼,返回值是INVALID_FILE_ATTRIBUTES。
SetFileAttributes
函數(shù)功能:設(shè)置文件屬性
SetFileAttributes(文件名典鸡, FILE_ATTRIBUTE_READONLY); // 設(shè)定為只讀
SetFileAttributes(文件名被廓, FILE_ATTRIBUTE_HIDDEN );//設(shè)定為隱藏
SetFileAttributes(文件名, FILE_ATTRIBUTE_SYSTEM);//設(shè)定為系統(tǒng)
SetFileAttributes(文件名萝玷, FILE_ATTRIBUTE_ARCHIVE);//設(shè)定為保存
SetFileAttributes(文件名嫁乘, FILE_ATTRIBUTE_NORMAL);//設(shè)定為一般 (取消前四種屬性)
設(shè)定二種以上的屬性:
設(shè)定為只讀 + 隱藏
SetFileAttributes(文件名昆婿, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN);
設(shè)定為只讀 + 隱藏 + 系統(tǒng) + 保存
SetFileAttributes(文件名, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN _
| FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE);
取消所有設(shè)定
SetFileAttributes(文件名蜓斧, FILE_ATTRIBUTE_NORMAL);
6.GetTempPathW
函數(shù)功能:獲取為臨時(shí)文件指定的路徑
DWORD WINAPI GetTempPath(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);
nBufferLength:指lpbuffer所占的空間仓蛆,以TCHAR為單位。
(TCHAR:當(dāng)UNICODE模式下為wchar_t法精,非UNICODE模式下為char多律。)
lpBuffer:保存找的文件夾路徑,該文件路徑以‘\’結(jié)束搂蜓,例如“C:\temp\”狼荞。
其返回值為一個(gè)dword類型,當(dāng)函數(shù)執(zhí)行成功時(shí)返回文件夾路徑長(zhǎng)度,以TCHAR為單位帮碰,不包括結(jié)束字符在內(nèi)相味。如果返回的路徑長(zhǎng)度大于nbufferlength,那么按返回值保存路徑殉挽。
7.CreateDirectoryW
函數(shù)功能:CreateDirectory這個(gè)函數(shù)的作用是創(chuàng)建一個(gè)新的目錄丰涉。如果底層文件系統(tǒng)支持文件和目錄上的安全描述,該功能可將指定的安全描述到新的目錄斯碌。
函數(shù)原型:
BOOL CreateDirectory(
LPCTSTR lpPathName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
參數(shù):
pPathName:長(zhǎng)指針一死,指向一個(gè)空結(jié)束的字符串,該字符串指定要?jiǎng)?chuàng)建的目錄的路徑傻唾。有一個(gè)默認(rèn)的字符串大小限制為MAX_PATH字符的路徑投慈。此限制是關(guān)系到這個(gè)函數(shù)是如何解析路徑。字符串的長(zhǎng)度不超過(guò)MAX_PATH冠骄。
lpSecurityAttributes:忽略伪煤,一般設(shè)置為NULL。
返回值:
非零表示成功凛辣,零表示失敗抱既。若想獲得更多的錯(cuò)誤信息,調(diào)用GetLastError函數(shù)扁誓。
備注:
這個(gè)函數(shù)不是遞歸的防泵。它可以在一個(gè)路徑中創(chuàng)建唯一的最終目錄。也就是說(shuō)蝗敢,如果父目錄或中間目錄不存在择克,該函數(shù)將失敗并顯示錯(cuò)誤消息ERROR_PATH_NOT_FOUND。
8.SetCurrentDirectory
函數(shù)功能:設(shè)置當(dāng)前路徑前普,然后就可以以相對(duì)路徑訪問(wèn)一些你程序相關(guān)的文件,不需要絕對(duì)路徑
TCHAR chCurDir[MAX_PATH] = {0};
GetCurrentDirectory(MAX_PATH, chCurDir);
SetCurrentDirectory(_T("E:\\test\\"));
m_hDLL = LoadLibrary(_T("MyTest.dll"));
SetCurrntDirectory(chCurDir);
9.CopyFileA
函數(shù)功能:復(fù)制文件
BOOL CopyFile(
LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);
其中各參數(shù)的意義:
LPCTSTR lpExistingFileName, // 你要拷貝的源文件名
LPCTSTR lpNewFileName, // 你要拷貝的目標(biāo)文件名
BOOL bFailIfExists // 如果目標(biāo)已經(jīng)存在壹堰,不拷貝(True)并返回False拭卿,覆蓋目標(biāo)(false)
如:
//拷貝文件c:\log.txt到d:\log.txt骡湖,如果D:\log.txt已經(jīng)存在,就覆蓋
CopyFile("c:\\log.txt","d:\\log.txt",false);
10.GetFullPathName
函數(shù)功能:獲取指定文件的完整路徑名
DWORD WINAPI GetFullPathName(
_In_ LPCTSTR lpFileName,
_In_ DWORD nBufferLength,
_Out_ LPTSTR lpBuffer,
_Out_ LPTSTR *lpFilePart
);
參數(shù)說(shuō)明:
lpFileName [in]
文件名峻厚。該參數(shù)既可以是一個(gè)短文件名响蕴,也可以是一個(gè)長(zhǎng)文件名,還可以是共享名或卷名惠桃。
nBufferLength [in]
接收路徑的緩沖區(qū)的長(zhǎng)度浦夷。
lpBuffer [out]
這是一個(gè)輸出參數(shù),指向路徑緩沖區(qū)的指針辜王。
lpFilePart [out]
輸出參數(shù)劈狐,指向路徑緩沖區(qū)中文件名部分的指針。該參數(shù)可以是NULL呐馆。如果lpBuffer指向的緩沖區(qū)內(nèi)存放的是一個(gè)目錄而非文件肥缔,lpFilePart為0。
11.OpenSCManager
函數(shù)功能:函數(shù)建立了一個(gè)到服務(wù)控制管理器的連接汹来,并打開(kāi)指定的數(shù)據(jù)庫(kù)续膳。
SC_HANDLE WINAPI OpenSCManager(
_In_opt_ LPCTSTR lpMachineName,
_In_opt_ LPCTSTR lpDatabaseName,
_In_ DWORD dwDesiredAccess
);
參數(shù):
1. lpMachineName:目標(biāo)計(jì)算機(jī)名,NULL表示本地計(jì)算機(jī)
2. lpDatabaseName:服務(wù)管理程序系統(tǒng)組件數(shù)據(jù)庫(kù)收班,可以設(shè)為SERVICES_ACTIVE_DATABASE坟岔,如果為NULL,表示默認(rèn)打開(kāi)SERVICES_ACTIVE_DATABASE數(shù)據(jù)庫(kù)
3. dwDesiredAccess:對(duì)SCM的權(quán)限
12.OpenServiceA
函數(shù)功能:打開(kāi)一個(gè)已經(jīng)存在的服務(wù)
SC_HANDLE WINAPI OpenService(
_In_ SC_HANDLE hSCManager,
_In_ LPCTSTR lpServiceName,
_In_ DWORD dwDesiredAccess
);
參數(shù):
hSCManager:SCM數(shù)據(jù)庫(kù)句柄摔桦;OpenSCManager
lpServiceName:要打開(kāi)服務(wù)的名字社付,這和CreateService形參lpServiceName一樣,不是服務(wù)顯示名稱酣溃。
dwDesiredAccess:服務(wù)權(quán)限
13.StartService
函數(shù)功能:?jiǎn)?dòng)一個(gè)服務(wù)
BOOL StartServiceA(
SC_HANDLE hService,
DWORD dwNumServiceArgs,
LPCSTR *lpServiceArgVectors
);
參數(shù)
hService
服務(wù)的句柄瘦穆。此句柄由OpenService或 CreateService函數(shù)返回 ,并且必須具有SERVICE_START訪問(wèn)權(quán)限赊豌。有關(guān)更多信息扛或,請(qǐng)參閱 服務(wù)安全性和訪問(wèn)權(quán)限。
dwNumServiceArgs
lpServiceArgVectors數(shù)組中的字符串?dāng)?shù)碘饼。如果lpServiceArgVectors為NULL熙兔,則此參數(shù)可以為零。
lpServiceArgVectors
以null結(jié)尾的字符串作為參數(shù)傳遞給服務(wù)的ServiceMain函數(shù)艾恼。如果沒(méi)有參數(shù)住涉,則此參數(shù)可以為NULL。
14.CloseServiceHandle
函數(shù)功能:關(guān)閉服務(wù)控件管理器或服務(wù)對(duì)象的句柄钠绍。
BOOL CloseServiceHandle(
SC_HANDLE hSCObject
);
參數(shù)
hSCObject
服務(wù)控件管理器對(duì)象或要關(guān)閉的服務(wù)對(duì)象的句柄舆声。OpenSCManager函數(shù)返回服務(wù)控制管理器對(duì)象的 句柄,OpenService或 CreateService函數(shù)返回服務(wù)對(duì)象的句柄 。
15.RegCreateKey
函數(shù)功能:注冊(cè)表中創(chuàng)建一個(gè)新的項(xiàng)
(HKEY_LOCAL_MACHINE,"Software\\mykey",&key);
RegCreateKeyEx 插入主鍵
RegSetValueEx 插入鍵值
RegCloseKey 關(guān)閉
16.RegQueryValueExA
函數(shù)功能:讀取字符串?dāng)?shù)據(jù)出來(lái)
WINADVAPI
LONG
APIENTRY
RegQueryValueExA (
__in HKEY hKey,
__in_opt LPCSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_bcount_opt(*lpcbData) LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);
WINADVAPI
LONG
APIENTRY
RegQueryValueExW (
__in HKEY hKey,
__in_opt LPCWSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_bcount_opt(*lpcbData) LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);
#ifdef UNICODE
#define RegQueryValueEx RegQueryValueExW
#else
#define RegQueryValueEx RegQueryValueExA
#endif // !UNICODE
hKey是主鍵
lpValueName是鍵值名稱
lpType是類型
lpData是讀出來(lái)數(shù)據(jù)保存地方
lpcbData是讀取數(shù)據(jù)多少
17.FindResourceA
函數(shù)功能:該函數(shù)確定指定模塊中指定類型和名稱的資源所在位置
函數(shù)原型:HRSRC FindResource(HMODULE hModule媳握,LPCTSTR lpName碱屁,LPCTSTR lpType)
參數(shù):
hModule:處理包含資源的可執(zhí)行文件的模塊。NULL值則指定模塊句柄指向操作系統(tǒng)通常情況下創(chuàng)建最近過(guò)程的相關(guān)位圖文件蛾找。
lpName:指定資源名稱娩脾。若想了解更多的信息,請(qǐng)參見(jiàn)注意部分打毛。
lpType:指定資源類型柿赊。若想了解更多的信息,請(qǐng)參見(jiàn)注意部分幻枉。作為標(biāo)準(zhǔn)資源類型碰声。這個(gè)參數(shù)的含義同EnumResLangProc/lpType。
返回值:如果函數(shù)運(yùn)行成功展辞,那么返回值為指向被指定資源信息塊的句柄奥邮。為了獲得這些資源,將這個(gè)句柄傳遞給LoadResource函數(shù)罗珍。如果函數(shù)運(yùn)行失敗洽腺,則返回值為NULL。
hMoule=FindResourceA( NULL, 2058, "XIA")
SizeofResource( NULL, hMoule ) //Returns the size, in bytes, of the specified resource.
handle=LoadResource( NULL, hMoule) //Returns a handle to be used to obtain a pointer to the first byte of the resource in memory.
LockResource( handle ) // 鎖定資源并得到資源在內(nèi)存中的第一個(gè)字節(jié)的指針
18.SetFilePointer
函數(shù)功能:在一個(gè)文件中設(shè)置新的讀取位置
DWORD SetFilePointer(
HANDLE hFile, // 文件句柄
LONG lDistanceToMove, // 偏移量(低位)
PLONG lpDistanceToMoveHigh, // 偏移量(高位)
DWORD dwMoveMethod // 基準(zhǔn)位置FILE_BEGIN:文件開(kāi)始位置 FILE_CURRENT:文件當(dāng)前位置 FILE_END:文件結(jié)束位置
說(shuō)明:移動(dòng)一個(gè)打開(kāi)文件的指針
19.CreateFile
函數(shù)功能:這個(gè)函數(shù)的功能是創(chuàng)建或者打開(kāi)一個(gè)文件或者I/O設(shè)備覆旱,通常使用的I/O形式有文件蘸朋、文件流、目錄扣唱、物理磁盤藕坯、卷、終端流等噪沙。如執(zhí)行成功炼彪,則返回文件句柄。 INVALID_HANDLE_VALUE 表示出錯(cuò)正歼,會(huì)設(shè)置 GetLastError 辐马。
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
20.SetFileTime
函數(shù)功能:設(shè)置指定文件或目錄的創(chuàng)建,上次訪問(wèn)或上次修改的日期和時(shí)間局义。
BOOL SetFileTime(
HANDLE hFile,
const FILETIME *lpCreationTime,
const FILETIME *lpLastAccessTime,
const FILETIME *lpLastWriteTime
);
21.CreateProcess
函數(shù)功能:CreateProcess是Windows下用于創(chuàng)建進(jìn)程的API函數(shù),用來(lái)創(chuàng)建一個(gè)新的進(jìn)程和它的主線程喜爷,這個(gè)新進(jìn)程運(yùn)行指定的可執(zhí)行文件。
函數(shù)原型:
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes萄唇。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
22.WaitForSingleObject
函數(shù)功能:等待一個(gè)內(nèi)核對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)
DWORD WaitForSingleObject(
HANDLE hObject, //指明一個(gè)內(nèi)核對(duì)象的句柄
DWORD dwMilliseconds); //等待時(shí)間
該函數(shù)需要傳遞一個(gè)內(nèi)核對(duì)象句柄檩帐,該句柄標(biāo)識(shí)一個(gè)內(nèi)核對(duì)象,如果該內(nèi)核對(duì)象處于未通知狀態(tài)另萤,則該函數(shù)導(dǎo)致線程進(jìn)入阻塞狀態(tài)湃密;如果該內(nèi)核對(duì)象處于已通知狀態(tài),則該函數(shù)立即返回WAIT_OBJECT_0。第二個(gè)參數(shù)指明了需要等待的時(shí)間(毫秒)泛源,可以傳遞INFINITE指明要無(wú)限期等待下去揍障,如果第二個(gè)參數(shù)為0,那么函數(shù)就測(cè)試同步對(duì)象的狀態(tài)并立即返回俩由。如果等待超時(shí),該函數(shù)返回WAIT_TIMEOUT癌蚁。如果該函數(shù)失敗幻梯,返回WAIT_FAILED。
23.TerminateProcess
函數(shù)功能:終止|殺死其它進(jìn)程
函數(shù)原型:
BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode)
參數(shù)說(shuō)明:
1努释、hProcess:要終止(殺死)進(jìn)程的句柄碘梢,需要有PROCESS_TERMINATE權(quán)限。
2伐蒂、uExitCode:設(shè)置進(jìn)程的退出值煞躬。可通過(guò)GetExitCodeProcess函數(shù)得到一個(gè)進(jìn)程的退出值逸邦。
返回值:
如果失敗將返回FALSE(0)恩沛,而成功將返回一個(gè)非零值。
注:不要用if(ret==TRUE)去檢測(cè)函數(shù)是否調(diào)用成功缕减,因?yàn)楹瘮?shù)調(diào)用成功會(huì)返回一個(gè)非零值雷客,但不一定是TRUE(1)
24.GetExitCodeProcess
函數(shù)功能:獲取指定進(jìn)程的退出碼
hProcess Long,想獲取退出代碼的一個(gè)進(jìn)程的句柄
lpExitCode Long桥狡,用于裝載進(jìn)程退出代碼的一個(gè)長(zhǎng)整數(shù)變量搅裙。如進(jìn)程尚未中止,則設(shè)為常數(shù)STILL_ACTIVE
25.CloseHandle
函數(shù)功能:函數(shù)用于關(guān)閉一個(gè)內(nèi)核對(duì)象
BOOL CloseHandle(HANDLE hObject);
參數(shù)
hObject :代表一個(gè)已打開(kāi)對(duì)象handle裹芝。
返回值
TRUE:執(zhí)行成功部逮;
FALSE:執(zhí)行失敗,可以調(diào)用GetLastError()獲知失敗原因嫂易。
26.GlobalAlloc
函數(shù)功能:調(diào)用GlobalAlloc函數(shù)分配一塊內(nèi)存兄朋,該函數(shù)會(huì)返回分配的內(nèi)存句柄。簡(jiǎn)稱全局堆分配
HGLOBAL GlobalAlloc(
UINT uFlags, // 分配屬性(方式)
DWORD dwBytes // 分配的字節(jié)數(shù)
);
27.GetModuleHandle
函數(shù)功能:功能是獲取一個(gè)應(yīng)用程序或動(dòng)態(tài)鏈接庫(kù)的模塊句柄炬搭。只有在當(dāng)前進(jìn)程的場(chǎng)景中蜈漓,這個(gè)句柄才會(huì)有效。
HMODULE WINAPI GetModuleHandle(
_In_opt_LPCTSTR lpModuleName
);
28.GetProcessHeap
函數(shù)功能:它返回調(diào)用進(jìn)程的默認(rèn)堆句柄宫盔。
參數(shù)
函數(shù)無(wú)參數(shù)
返回值
如果函數(shù)成功融虽,返回調(diào)用進(jìn)程的默認(rèn)內(nèi)存堆句柄。
如果函數(shù)失敗灼芭,返回 Null有额。若想,可以調(diào)用GetLastError獲得更多錯(cuò)誤信息。
之后是病毒的加密模塊t.wnry