强制delete运行中文件

admin 2023年10月13日09:12:59评论34 views字数 3063阅读10分12秒阅读模式

0x01 前言


介绍一个场景,在制作c2马写loader的时候,采用CreateThread运行shellcode,这个时候线程是一直占用的没有被释放,这个时候正常情况下是无法删除文件的,但又想避免马子被分析,就可以采用这种进行删除目标文件或自删除。
当然比较好的避免分析的方法还是采用分阶段方式,先用stage0阶段实现人为准入,然后再下发stage1等后续阶段。
其他使用场景可以自行脑补,另外AgeloVito哥与狗哥采用bof也已实现了cs自删除插件,导入cna即可。
项目地址:
https://github.com/AgeloVito/self_delete_bof
https://github.com/seventeenman/SelfDel-BOF
点点star好兄弟们!

0x02 解释及代码


SetFileInformationByHandle函数允许通过打开的文件句柄修改元数据而不锁定文件内容,因为它只修改文件的元数据信息,而不会修改文件的内容。在这段代码中,它被用于设置文件的删除信息,从而实现对文件的删除。具体来说,它使用了FILE_DISPOSITION_INFO结构体,将DeleteFile成员设置为TRUE,表示要删除该文件。这个结构体被传递给SetFileInformationByHandle函数,从而实现对文件的删除。同时,文件系统将文件存储和元数据管理分离,获取目标进程文件句柄后先通过该句柄重命名切断进程对文件名的联系避免进程检测到删除标记而中断,再设置删除标记通知文件系统后续删除内容但是现在内容仍需保留以便进程可以正常运行访问,进程看到的仍是老文件名不会发现内容被标记删除,直到进程退出关闭最后一个文件句柄时文件系统才实际删除文件内容,在此过程中进程可以继续正常运行最后安全删除文件。

#include <windows.h>#include <tlhelp32.h>#include <stdio.h>
#define DS_STREAM_RENAME L":delete"
static HANDLE openHandle(PWCHAR pwPath){ return CreateFileW(pwPath, DELETE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);}
static BOOL renameHandle(HANDLE hHandle){ FILE_RENAME_INFO fRename; RtlSecureZeroMemory(&fRename, sizeof(fRename));
LPWSTR lpwStream = DS_STREAM_RENAME; fRename.FileNameLength = sizeof(lpwStream); RtlCopyMemory(fRename.FileName, lpwStream, sizeof(lpwStream));
return SetFileInformationByHandle(hHandle, FileRenameInfo, &fRename, sizeof(fRename) + sizeof(lpwStream));}
static BOOL depositeHandle(HANDLE hHandle){ FILE_DISPOSITION_INFO fDelete; RtlSecureZeroMemory(&fDelete, sizeof(fDelete));
fDelete.DeleteFile = TRUE;
return SetFileInformationByHandle(hHandle, FileDispositionInfo, &fDelete, sizeof(fDelete));}
BOOL DeleteExecutableByPID(DWORD dwProcessID){ HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessID); if (hProcess == NULL) { return FALSE; }
WCHAR szModulePath[MAX_PATH]; DWORD dwSize = MAX_PATH;
if (QueryFullProcessImageNameW(hProcess, 0, szModulePath, &dwSize)) { CloseHandle(hProcess);
HANDLE hRename = openHandle(szModulePath); renameHandle(hRename); CloseHandle(hRename);
HANDLE hDelete = openHandle(szModulePath); depositeHandle(hDelete); CloseHandle(hDelete);
return TRUE; }
CloseHandle(hProcess); return FALSE;}
BOOL DeleteFileByPath(PWCHAR pwPath){ HANDLE hRename = openHandle(pwPath); renameHandle(hRename); CloseHandle(hRename);
HANDLE hDelete = openHandle(pwPath); depositeHandle(hDelete); CloseHandle(hDelete);
return TRUE;}
int wmain(int argc, wchar_t* argv[]){ if (argc == 1) { WCHAR wcPath[MAX_PATH + 1]; RtlSecureZeroMemory(wcPath, sizeof(wcPath));
if (GetModuleFileNameW(NULL, wcPath, MAX_PATH) != 0) { HANDLE hRename = openHandle(wcPath); renameHandle(hRename); CloseHandle(hRename);
HANDLE hDelete = openHandle(wcPath); depositeHandle(hDelete); CloseHandle(hDelete);
return 0; } return 1; } else if (argc == 3) { if (wcscmp(argv[1], L"-f") == 0) { if (DeleteFileByPath(argv[2])) { return 0; }
return 1; } else if (wcscmp(argv[1], L"-p") == 0) { DWORD dwProcessID = _wtoi(argv[2]); if (DeleteExecutableByPID(dwProcessID)) { return 0; } return 1; } }
wprintf(L"Usage: %s [-f file_path] [-p process_id]n", argv[0]); return 1;}

0x03 用法及效果


  1. 默认自删除:运行工具而不带任何参数。

  2. 指定文件路径删除:

  3. 使用-f参数,后面跟着要删除的文件的路径。

    工具会尝试删除指定路径的文件。

    示例命令:tool.exe -f C:file.txt。

  4. 指定进程ID删除文件:

  5. 使用-p参数,后面跟着要删除文件的进程ID。

    工具会尝试删除与给定进程ID相关联的可执行文件。

    示例命令:tool.exe -p 1234。

强制delete运行中文件

强制delete运行中文件

原文始发于微信公众号(小黑说安全):强制delete运行中文件

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月13日09:12:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   强制delete运行中文件https://cn-sec.com/archives/2107566.html

发表评论

匿名网友 填写信息