技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 353|回复: 2
收起左侧

自删除EXE程序

[复制链接]

8

主题

76

帖子

515

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
7 点
宅币
393 个
贡献
27 次
宅之契约
0 份
在线时间
71 小时
注册时间
2018-5-6
发表于 2018-6-7 15:53:09 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
之前小弟在网上查看论坛的时候,发现了一个帖子,是一个exe程序的运行完成后的自己删除,感觉佷感兴趣,于是想自己来写一个调用WindowsAPI和用C语言写的这个程序

我们知道Windows中当有文件处于运行状态下的时候是不能被删除的,那么一个exe程序怎么删除自己呢?

一般exe自我删除程序有很多用途,比如常见的软件的安装包,在安装完成后可以实现自己的删除,还有远一点的东西比如一些计算机病毒在实行自身的功能进行破坏后,对自身exe的删除

但是exe如何进行自我删除呢,我当时想的是自己的一个创建一个cmd进程,然后用cmd命令行的del来删除文件,但是我当时就有点萌比,怎么来创建cmd后来在cmd中模拟键盘输入命令呢,

网上百度了一些东西,其中偶有SendMessage这个函数,但是用的效果不理想,最后在换一种方式百度,发现可以直接创建一个类似"cmd echo Hello World"的进程。。额,好吧,其中一个问题解决了。

然后就是程序要运行完成后才能删除,这个东西我想到了多线程,但是这里显然不行,我上网上百度发现还有多进程,多进程好,但是我想挂起创建的cmd子进程的时候发现没有反应,也没有

GetLastError也没有显示,最后我在下午吃完了一块西瓜以后,想到了线程和进程的关系,进程的执行要靠线程,我不能挂起进程,那我挂起cmd子进程的主线程就可以了啊,ok,问题解决

代码中的程序由于是我的测试,所以什么都是可见的,要是设置成不可见的删除,那么改动三个参数就可以了,分别是去掉CREATE_NEW_CONSOLE,cmd /c ,还有去掉
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = TRUE;
这两句代码。

[C] 纯文本查看 复制代码
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

void DeleteSelf(HANDLE *hProcess,HANDLE *hThread)
{
        CHAR szExePath[MAX_PATH];
        GetModuleFileName(NULL, szExePath, MAX_PATH);                        //获取模块的完整路径,也就是exe的路径
        CHAR szCmdOrder[128];
        lstrcpy(szCmdOrder, "cmd /k del ");        //这里的命令行要是"cmd /c del "的话是不显示cmd窗口
        lstrcat(szCmdOrder, szExePath);

        STARTUPINFO si = { sizeof(si) };
        PROCESS_INFORMATION pi;

        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = TRUE;
        BOOL bRet = CreateProcess(
                NULL,
                szCmdOrder,
                NULL,
                NULL,
                FALSE,
                CREATE_NEW_CONSOLE | CREATE_SUSPENDED,                //选择挂起主线程
                NULL,
                NULL,
                &si,
                &pi);
        if (!bRet)
        {
                printf("CreateProcess error:%d\n", GetLastError());
                CloseHandle(pi.hThread);
                CloseHandle(pi.hProcess);
                return;
        }
       
        //CloseHandle(pi.hThread);
        //CloseHandle(pi.hProcess);
        *hProcess = pi.hProcess;                        //址传递
        *hThread = pi.hThread;
}

int main(void)
{
        for (int i = 0; i < 3; i++)
        {
                printf("Hello World!\n");
        }


        HANDLE hProcess;
        HANDLE hThread;
        DeleteSelf(&hProcess,&hThread);
        SetPriorityClass(hProcess, IDLE_PRIORITY_CLASS);                        //设置空闲时刻执行
       
        //设置本程序立刻执行
        SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
        SetPriorityClass(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

        Sleep(3 * 1000);                                                //睡上3秒
       
        if (!ResumeThread(hThread))                                //主进程执行完毕后开始执行主线程
        {
                printf("ResumeThread %d\n", GetLastError());
        }

        CloseHandle(hProcess);                                        //关闭进程句柄
        CloseHandle(hThread);                                        //关闭主线程句柄


        printf("程序运行完毕.\n");
        return 0;
}
菜鸟一枚,直接指正,不必留情

0

主题

9

帖子

65

积分

用户组: 小·技术宅

UID
2928
精华
0
威望
1 点
宅币
54 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2017-10-7
发表于 2018-6-8 12:59:47 | 显示全部楼层
给大佬递茶...

8

主题

76

帖子

515

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
7 点
宅币
393 个
贡献
27 次
宅之契约
0 份
在线时间
71 小时
注册时间
2018-5-6
 楼主| 发表于 2018-6-8 14:34:19 | 显示全部楼层

感谢大佬支持
菜鸟一枚,直接指正,不必留情

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-10-19 10:33 , Processed in 0.092950 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表