惡意代碼的分類包括計(jì)算機(jī)病毒、蠕蟲、木馬、后門、Rootkit、流氓軟件、間諜軟件、廣告軟件、僵尸(bot) 、Exploit等等,有些技術(shù)經(jīng)常用到,有的也是必然用到。
惡意代碼常見功能技術(shù)如下:進(jìn)程遍歷,文件遍歷,按鍵記錄,后門,桌面截屏,文件監(jiān)控,自刪除,U盤監(jiān)控。知己知彼,百戰(zhàn)不殆。這里旨在給反病毒工程師提供參照。病毒作者請繞過。
進(jìn)程遍歷
進(jìn)程遍歷獲取計(jì)算機(jī)上所有進(jìn)程的信息(用戶進(jìn)程,系統(tǒng)進(jìn)程),通常是為了檢索受害進(jìn)程,檢測是否運(yùn)行在虛擬機(jī)中,以及是否存在殺軟等,有時(shí)候反調(diào)試技術(shù)也會檢測進(jìn)程名。所以在惡意代碼中進(jìn)程遍歷很常見。
具體流程:
1、調(diào)用CreateToolhelp32Snapshot獲取所有進(jìn)程的快照信息之所以稱為快照是因?yàn)楸4娴氖侵暗男畔?,該函?shù)返回進(jìn)程快照句柄。
2、調(diào)用Process32First獲取第一個(gè)進(jìn)程的信息,返回的進(jìn)程信息保存在PROCESSENTRY32結(jié)構(gòu)體中,該函數(shù)的第一個(gè)參數(shù)是CreateToolhelp32Snapshot返回的快照句柄。
3、循環(huán)調(diào)用Process32Next從進(jìn)程列表中獲取下一個(gè)進(jìn)程的信息,直到Process32Next函數(shù)返回FALSE,GetLastError的錯(cuò)誤碼為ERROR_NO_MORE_FILES,則遍歷結(jié)束。
4、關(guān)閉快照句柄并釋放資源
遍歷線程和進(jìn)程模塊的步驟和上面的相似,線程遍歷使用Thread32First和Thread32Next,模塊遍歷使用Module32First和Module32Next。
源碼實(shí)現(xiàn):
void ShowError(char *lpszText){char szErr[MAX_PATH] = {0};::wsprintf(szErr, "%s Error[%d] ", lpszText, ::GetLastError());::MessageBox(NULL, szErr, "ERROR", MB_OK);}BOOL EnumProcess(){PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(PROCESSENTRY32);// 獲取全部進(jìn)程快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (INVALID_HANDLE_VALUE == hProcessSnap){ShowError("CreateToolhelp32Snapshot");return FALSE;}// 獲取快照中第一條信息BOOL bRet = ::Process32First(hProcessSnap, &pe32);while (bRet){// 顯示 Process IDprintf("[%d] ", pe32.th32ProcessID);// 顯示 進(jìn)程名稱printf("[%s] ", pe32.szExeFile);// 獲取快照中下一條信息bRet = ::Process32Next(hProcessSnap, &pe32);}// 關(guān)閉句柄::CloseHandle(hProcessSnap);return TRUE;}BOOL EnumThread(){THREADENTRY32 te32 = { 0 };te32.dwSize = sizeof(THREADENTRY32);// 獲取全部線程快照HANDLE hThreadSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);if (INVALID_HANDLE_VALUE == hThreadSnap){ShowError("CreateToolhelp32Snapshot");return FALSE;}// 獲取快照中第一條信息BOOL bRet = ::Thread32First(hThreadSnap, &te32);while (bRet){// 顯示 Owner Process IDprintf("[%d] ", te32.th32OwnerProcessID);// 顯示 Thread IDprintf("[%d] ", te32.th32ThreadID);// 獲取快照中下一條信息bRet = ::Thread32Next(hThreadSnap, &te32);}// 關(guān)閉句柄::CloseHandle(hThreadSnap);return TRUE;}BOOL EnumProcessModule(DWORD dwProcessId){MODULEENTRY32 me32 = { 0 };me32.dwSize = sizeof(MODULEENTRY32);// 獲取指定進(jìn)程全部模塊的快照HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);if (INVALID_HANDLE_VALUE == hModuleSnap){ShowError("CreateToolhelp32Snapshot");return FALSE;}// 獲取快照中第一條信息BOOL bRet = ::Module32First(hModuleSnap, &me32);while (bRet){// 顯示 Process IDprintf("[%d] ", me32.th32ProcessID);// 顯示 模塊加載基址printf("[0x%p] ", me32.modBaseAddr);// 顯示 模塊名稱printf("[%s] ", me32.szModule);// 獲取快照中下一條信息bRet = ::Module32Next(hModuleSnap, &me32);}// 關(guān)閉句柄::CloseHandle(hModuleSnap);return TRUE;}
文件遍歷
文件操作幾乎是所有惡意代碼必備的功能,木馬病毒竊取機(jī)密文件然后開一個(gè)隱秘端口,(之前在kali滲透群看到有人提問如何識別木馬,其實(shí)有一個(gè)簡單的方法,幾乎所有的木馬都要與攻擊者的主機(jī)通信的,查看打開了哪些奇怪的端口是一種方法)。
就算是再R0下,也經(jīng)常會創(chuàng)建寫入讀取文件,文件功能經(jīng)常用到。文件搜索功能主要是通過調(diào)用FindFirstFile和FindNextFile來實(shí)現(xiàn)。
具體流程
1、調(diào)用FindFirstFile函數(shù),該函數(shù)接收文件路徑,第二個(gè)參數(shù)指向WIN32_FIND_DATA結(jié)構(gòu)的指針。若函數(shù)成功則返回搜索句柄。該結(jié)構(gòu)包含文件的名稱,創(chuàng)建日期,屬性,大小等信息。
該返回結(jié)構(gòu)中的成員dwFileAttributes為FILE_ATTRIBUTE_DIRECTORY時(shí)表示返回的是一個(gè)目錄,否則為文件,根據(jù)cFileName獲取搜索到的文件名稱。如果需要重新對目錄下的所有子目錄文件都再次進(jìn)行搜索的話,則需要對文件屬性進(jìn)行判斷。若文件屬性是目錄,則繼續(xù)遞歸搜索,搜索其目錄下的目錄和文件。
2、調(diào)用FindNextFile搜索下一個(gè)文件,根據(jù)返回值判斷是否搜索到文件,若沒有則說明文件遍歷結(jié)束。
3、搜索完畢后,調(diào)用FindClose函數(shù)關(guān)閉搜索句柄,釋放資源緩沖區(qū)資源。
源碼實(shí)現(xiàn):
void SearchFile(char *pszDirectory){// 搜索指定類型文件DWORD dwBufferSize = 2048;char *pszFileName = NULL;char *pTempSrc = NULL;WIN32_FIND_DATA FileData = {0};BOOL bRet = FALSE;// 申請動態(tài)內(nèi)存pszFileName = new char[dwBufferSize];pTempSrc = new char[dwBufferSize];// 構(gòu)造搜索文件類型字符串, *.*表示搜索所有文件類型::wsprintf(pszFileName, "%s\*.*", pszDirectory);// 搜索第一個(gè)文件HANDLE hFile = ::FindFirstFile(pszFileName, &FileData);if (INVALID_HANDLE_VALUE != hFile){do{// 要過濾掉 當(dāng)前目錄"." 和 上一層目錄"..", 否則會不斷進(jìn)入死循環(huán)遍歷if ('.' == FileData.cFileName[0]){continue;}// 拼接文件路徑::wsprintf(pTempSrc, "%s\%s", pszDirectory, FileData.cFileName);// 判斷是否是目錄還是文件if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){// 目錄, 則繼續(xù)往下遞歸遍歷文件SearchFile(pTempSrc);}else{// 文件printf("%s ", pTempSrc);}// 搜索下一個(gè)文件} while (::FindNextFile(hFile, &FileData));}// 關(guān)閉文件句柄::FindClose(hFile);// 釋放內(nèi)存delete []pTempSrc;pTempSrc = NULL;delete []pszFileName;pszFileName = NULL;}
按鍵記錄
收集用戶的所有按鍵信息,分辨出哪些類似于賬號,密碼等關(guān)鍵信息進(jìn)行利用,竊取密碼,這里用原始輸入模型直接從輸入設(shè)備上獲取數(shù)據(jù),記錄按鍵信息。
要想接收設(shè)備原始輸入WM_INPUT消息,應(yīng)用程序必須首先使用RegisterRawInputDevice注冊原始輸入設(shè)備,因?yàn)樵谀J(rèn)情況下,應(yīng)用程序不接受原始輸入。
具體流程
1、注冊原始輸入設(shè)備
一個(gè)應(yīng)用程序必須首先創(chuàng)建一個(gè)RAWINPUTDEVICE結(jié)構(gòu),這個(gè)結(jié)構(gòu)表明它所希望接受設(shè)備的類別,再調(diào)用RegisterRawInputDevices注冊該原始輸入設(shè)備。將RAWINPUTDEVICE結(jié)構(gòu)體成員dwFlags的值設(shè)置為RIDEV_INPUTSINK,即使程序不處于聚焦窗口,程序依然可以接收原始輸入。
2、獲取原始輸入數(shù)據(jù)
消息過程中調(diào)用GetInputRawData獲取設(shè)備原始輸入數(shù)據(jù)。在WM_INPUT消息處理函數(shù)中,參數(shù)lParam存儲著原始輸入的句柄。此時(shí)可以直接調(diào)用
GetInputRawData函數(shù),根據(jù)句柄獲取RAWINPUT原始輸入結(jié)構(gòu)體的數(shù)據(jù)。
dwType表示原始輸入的類型,RIM_TYPEKEYBOARD表示是鍵盤的原始輸入,Message表示相應(yīng)的窗口消息。WM_KEYBOARD表示普通按鍵消息,WM_SYSKEYDOWN表示系統(tǒng)按鍵消息,VKey存儲鍵盤按鍵數(shù)據(jù)。
3、保存按鍵信息
GetForegroundWindow獲取按鍵窗口的標(biāo)題,然后調(diào)用GetWindowText根據(jù)窗口句柄獲取標(biāo)題,存儲到本地文件。
源碼實(shí)現(xiàn):
惡意代碼的存在不是由于黑客之類的手段,主要還是我們開發(fā)過程中很多情況會用到這樣的技術(shù),所以大家請利用技術(shù)做正確的事情!
另外,對于編程學(xué)習(xí)的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
原文標(biāo)題:C/C++惡意代碼盤點(diǎn)(一):進(jìn)程遍歷丨木馬病毒丨密碼記錄
文章出處:【微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4402瀏覽量
66548 -
代碼
+關(guān)注
關(guān)注
30文章
4927瀏覽量
72504 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3340瀏覽量
59791
原文標(biāo)題:C/C++惡意代碼盤點(diǎn)(一):進(jìn)程遍歷丨木馬病毒丨密碼記錄
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何去防范惡意代碼攻擊呢
計(jì)算機(jī)抗惡意代碼免疫模型
Decoy:基于主動技術(shù)的惡意代碼捕獲系統(tǒng)
Decoy基于主動技術(shù)的惡意代碼捕獲系統(tǒng)
基于網(wǎng)頁文件代碼分類的惡意代碼檢測系統(tǒng)
基于主動學(xué)習(xí)的惡意代碼檢測
基于棧式自編碼的惡意代碼分類算法
結(jié)合動態(tài)行為和機(jī)器學(xué)習(xí)的惡意代碼檢測方法
基于知識蒸餾的惡意代碼家族檢測方法研究綜述
一種Attention-CNN惡意代碼檢測模型

惡意代碼常見功能技術(shù)
評論