可执行文件自删除技术

使用场景如文件运行后自动删除自己的卸载程序

Linux

Linux下的删除程序概念验证代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

# ifdef _WIN32
  #include <windows.h>
#endif 

#define PATH_MAX	256


int main(int argc, char *argv[]) {
    // 检查是否有足够的参数(即程序名)
    if (argc < 1) {
        fprintf(stderr, "Usage: %s\n", argv[0]);
        return 1;
    }

    // 获取当前程序的绝对路径
    char path[PATH_MAX];
    
    # ifdef _WIN32
    HMODULE hm=GetModuleHandle(NULL);
    GetModuleFileName(hm,path,sizeof(path));
    if(GetLastError()!=0){
        perror("GetModuleFileName");
        return 1;
    }
    
    # else
    if (readlink("/proc/self/exe", path, PATH_MAX) == -1) {
        perror("readlink");
        return 1;
    }      
    # endif
    printf("path: %s\n", path);

    // 尝试删除自身
    if (unlink(path) == -1) {
        perror("unlink");
        return 1;
    }

    // 这里添加你的主要程序逻辑
    printf("Self-deleted, but still running...\n");

    // 为了演示,这里让程序睡眠一段时间而不是立即退出
    sleep(10000);

    return 0;
}

Windows NT

利用NTFS 特性 备份数据流

#include <Windows.h>
#include <iostream>

BOOL Self_Delete() {
    const wchar_t* NewStream = L":endlessparadox";
    WCHAR szPath[MAX_PATH * 2] = { 0 };

    // 获取当前可执行文件的路径
    if (GetModuleFileNameW(NULL, szPath, MAX_PATH * 2) == 0) {
        std::wcerr << L"[!] GetModuleFileNameW fail , code is  " << GetLastError() << std::endl;
        return FALSE;
    }

    // 打开文件
    HANDLE hFile = CreateFileW(szPath,
                               DELETE | SYNCHRONIZE,
                               FILE_SHARE_READ,
                               NULL,
                               OPEN_EXISTING,
                               NULL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::wcerr << L"[!] CreateFileW fail , code is " << GetLastError() << std::endl;
        return FALSE;
    }

    // 准备重命名信息
    SIZE_T sRename = sizeof(FILE_RENAME_INFO) + sizeof(wchar_t) * wcslen(NewStream);
    PFILE_RENAME_INFO pRename = (PFILE_RENAME_INFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sRename);
    if (!pRename) {
        CloseHandle(hFile);
        std::wcerr << L"[!] HeapAlloc fail , code is " << GetLastError() << std::endl;
        return FALSE;
    }

    pRename->FileNameLength = wcslen(NewStream) * sizeof(wchar_t);
    RtlCopyMemory(pRename->FileName, NewStream, pRename->FileNameLength);
    std::wcout << L"[i] Renaming :$DATA to file data as " << NewStream << std::endl;

    if (!SetFileInformationByHandle(hFile, FileRenameInfo, pRename, sRename)) {
        std::wcerr << L"[!] SetFileInformationByHandle fail, code is" << GetLastError() << std::endl;
        CloseHandle(hFile);
        HeapFree(GetProcessHeap(), 0, pRename);
        return FALSE;
    }

    std::wcout << L"[+] Completed" << std::endl;
    CloseHandle(hFile);

    // 打开文件以删除
    hFile = CreateFileW(szPath,
                        DELETE | SYNCHRONIZE,
                        FILE_SHARE_READ,
                        NULL,
                        OPEN_EXISTING,
                        NULL, NULL);

    if (hFile == INVALID_HANDLE_VALUE && GetLastError() == 0) {
        std::wcout << "free memory" << std::endl;
        HeapFree(GetProcessHeap(), 0, pRename);
        return TRUE;
    }

    FILE_DISPOSITION_INFO Delete = { 0 };
    Delete.DeleteFile = TRUE;
    std::wcout << L"[+] Deleting ....." << std::endl;

    if (!SetFileInformationByHandle(hFile, FileDispositionInfo, &Delete, sizeof(Delete))) {
        std::wcerr << L"[!] SetFileInformationByHandle fail, code is  " << GetLastError() << std::endl;
        CloseHandle(hFile);
        HeapFree(GetProcessHeap(), 0, pRename);
        return FALSE;
    }

    CloseHandle(hFile);
    HeapFree(GetProcessHeap(), 0, pRename);
    wprintf(L"[+] Done\n");
    return TRUE;
}

int main() {
    Self_Delete();
    std::wcout << "stop in memory" << std::endl;
    std::string userInput; // 声明一个字符串变量用于存储用户输入
    std::cout << "Input Str: ";
    std::cin >> userInput ;
    std::cout << "Get: " << userInput << std::endl;
    return 0;
}

来自社区文章

EOF

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle是一种流行的数据库管理系统,它提供了一系列工具来管理和操作数据库。其中,删除工具是用于从数据库中删除数据和对象的工具之一。 Oracle的删除工具可以帮助用户执行各种删除操作,包括删除表、删除行、删除索引、删除触发器等。用户可以通过使用SQL语句结合删除工具来删除不再需要的数据或对象。 使用删除工具时,用户需要先连接到目标数据库,然后使用合适的SQL语句指定要删除的数据或对象,并执行删除操作。删除工具会根据用户提供的条件删除满足条件的数据或对象。 删除工具的使用有一些注意事项。首先,用户在执行删除操作之前应该确认操作的后果,避免误删重要数据或对象。其次,在表中删除数据时,需要注意相关的约束和触发器,以免破坏数据完整性。最后,用户可以使用回滚机制来撤销删除操作,以防止不可逆的损失。 除了基本的删除操作外,Oracle还提供了一些高级的删除工具,如Flashback Drop和Recycle Bin。Flashback Drop可以用于恢复误删的数据库对象,而Recycle Bin则可以将删除的表和对象放入回收站,便于以后恢复或完全删除。 总之,Oracle的删除工具是用于删除数据库中数据和对象的工具,用户可以根据需要使用合适的SQL语句和删除工具执行删除操作,并注意操作的后果和数据完整性。 ### 回答2: Oracle 删除工具是一种用于删除Oracle数据库中的数据或对象的软件工具。这些工具可以帮助管理员在维护和管理数据库时更有效地删除不需要的数据或对象,以提高数据库性能和资源利用率。 Oracle删除工具提供了各种删除选项和功能,使管理员能够根据自己的需求选择最适合的删除方法。例如,管理员可以使用删除工具来删除整个表、特定行或列,也可以删除索引、触发器、存储过程等数据库对象。 删除工具还可以提供一些高级功能,例如在删除前备份数据,以防止误删或遗漏重要数据。此外,删除工具还可以帮助管理员在删除数据或对象后重新组织数据库,以优化性能和空间利用率。 使用Oracle删除工具需要管理员具备一定的数据库管理知识和技能,因为删除操作可能对数据库的完整性和稳定性产生影响。管理员应该谨慎选择删除对象,并在执行删除操作前进行充分的备份和测试。 总之,Oracle删除工具是一个强大的工具,可以帮助管理员更有效地删除数据库中的数据和对象。管理员应该根据自己的需求和技术水平选择合适的删除工具,并在操作前做好备份和测试,以确保数据的安全和数据库的稳定性。 ### 回答3: Oracle删除工具是一种用于删除Oracle数据库中的数据的软件工具。它可以帮助管理员或开发人员快速、有效地删除不再需要的数据,从而节省存储空间并提高数据库的性能。 Oracle删除工具通常具有以下几个主要功能: 1. 条件删除:可以根据指定的条件删除符合条件的数据。用户可以通过指定查询语句的条件,删除满足条件的数据,以满足特定需求。 2. 批量删除:可以一次性删除大量数据。用户可以通过选择多个表或多个数据库对象来删除大量数据,从而提高效率。 3. 安全删除:可以确保被删除的数据是可恢复的。删除工具可以在执行删除操作之前先备份被删除的数据,以防止意外删除或数据丢失。 4. 日志记录:可以记录删除操作的详细信息。用户可以通过查看日志文件来了解删除操作的执行情况,以便进行故障排除或审计。 5. 定时删除:可以根据预定的时间或计划自动执行删除操作。用户可以设置定时任务,定期删除过期或无效的数据,以保持数据库的清洁和高效。 总之,Oracle删除工具是一个强大的工具,可以帮助用户轻松删除数据库中的数据,提高数据库性能和管理效率。它在数据删除方面提供了许多功能和选项,以满足不同用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值