介绍一种巧妙的删除程序自己的方法

2023-11-14

 

 

介绍一种巧妙的删除程序自己的方法

vcbear


近日看到网友询问如何实现程序运行之后把自己删除的方法,不知大家对木马甚么的兴趣实在太浓,还是想要这样的效果:用户只要一运行程序,可执行文件就没有了,可是程序还是在跑,胆小的只怕要喊"鬼呀!","老婆,快出来看上帝"甚么的。其实最典型的用法是写反安装程序. 闲来无事,Bear掰到一种还算巧妙的“删除自己”的方法。

大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了。在Lu0的主页上看到一种UNDOCUMENT的方法,通过改变系统底层的文件访问模式实现删除自己,那是实在功夫。我看了很是佩服。但是有没有一种用在MSDN上就能查到的函数实现呢?有!Jeffrey Richter给我们做了一个范例:

DeleteMe.CPP

Module name: DeleteMe.cpp

Written by: Jeffrey Richter

Description: Allows an EXEcutable file to delete itself

********************************************************************/

#include <Windows.h>

#include <stdlib.h>

#include <tchar.h>

/

int WINAPI WinMain(HINSTANCE h, HINSTANCE b, LPSTR psz, int n) {

// Is this the Original EXE or the clone EXE?

// If the command-line 1 argument, this is the Original EXE

// If the command-line >1 argument, this is the clone EXE

if (__argc == 1) {

// Original EXE: Spawn clone EXE to delete this EXE

// Copy this EXEcutable image into the user's temp directory

TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];

GetModuleFileName(NULL, szPathOrig, _MAX_PATH);

GetTempPath(_MAX_PATH, szPathClone);

GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);

CopyFile(szPathOrig, szPathClone, FALSE);

//***注意了***:

// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE

HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);

// Spawn the clone EXE passing it our EXE's process handle

// and the full path name to the Original EXE file.

TCHAR szCmdLine[512];

HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());

wsprintf(szCmdLine, __TEXT("%s %d /"%s/""), szPathClone, hProcessOrig, szPathOrig);

STARTUPINFO si;

ZeroMemory(&si, sizeof(si));

si.cb = sizeof(si);

PROCESS_INFORMATION pi;

CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

CloseHandle(hProcessOrig);

CloseHandle(hfile);

// This original process can now terminate.

} else {

// Clone EXE: When original EXE terminates, delete it

HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);

WaitForSingleObject(hProcessOrig, INFINITE);

CloseHandle(hProcessOrig);

DeleteFile(__targv[2]);

// Insert code here to remove the subdirectory too (if desired).

// The system will delete the clone EXE automatically

// because it was opened with FILE_FLAG_DELETE_ON_CLOSE

}

return(0);

}

 

看懂了吗?

这一段程序思路很简单:不是不能在运行时直接删除本身吗?好,那么程序先复制(CLONE)一个自己,用复制品起动另一个进程,然后自己结束运行,则原来的EXE文件不被系统保护.这时由新进程作为杀手删除原来的EXE文件,并且继续完成程序其他的功能。

新进程在运行结束后,复制品被自动删除。这又是值得介绍的一个把戏了,注意:

// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE

HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);

这里面的FILE_FLAG_DELETE_ON_CLOSE标志,这个标志是告诉操作系统,当和这个文件相关的所有句柄都被关闭之后(包括上面这个CREATEFILE创建的句炳),就把这个文件删除。几乎所有的临时文件在创建时,都指明了这个标志。

另外要注意的是:在复制品进程对原始程序操刀之前,应该等待原进程退出.在这里用的是进程同步技术.用

HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,GetCurrentProcessId());

得到原进程句柄.SYNCHRONICE标志在NT下有效,作用是使OpenProcess得到的句柄可以做为同步对象.复制品进程用WaitForSingleObject函数进行同步,然后一个DeleteFile,以及进行其它销毁证据(Jeffrey说:比如删目录)的工作,打完收工!

程序是基于CONSOLE的,通过传入的参数确定是原始的进程还是复制品新进程,并且得到需要操作的目标文件的信息(主要是路径),复制品放在系统的TEMP目录(GetTempPath得到),你也可以随便找个你认为安全的地方(比如:WINDOWS/SYSTEM32等等)。

这里面没有甚么深的技术.再看其他的一些实现删除自己的例子,比如说在进程退出前,用fwrite等方法输出一个.BAT文件,在里面写几句DEL,然后WINEXEC一下这个BAT文件即可.玩儿过DOS的虫虫大多都会。今天又学一招,爽。


2001.2.27
(随便转载,只要不拿掉Jeffrey的名字,还有bear的....:D  )

另外,Jeffrey的网站:

http://www.jeffreyrichter.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

介绍一种巧妙的删除程序自己的方法 的相关文章

  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • 将一个文件写入.c中的另一个文件

    我有一个读取文件然后将其内容复制到另一个文件的代码 我需要使其仅复制每 20 个符号 然后跳过 10 个符号 然后再次跳过 20 个符号 依此类推 我必须使用 lseek 函数 但我不知道如何将所有这些放入循环中来执行此操作 main ar
  • 将绝对路径和相对路径组合起来得到新的绝对路径

    我正在编写一个程序 其中一个组件必须能够采用给定的路径 例如 help index html or help 和基于该位置的相对路径 例如 otherpage index html or sub dir of help or help2 h
  • PySpark 用数组替换 Null

    通过 ID 连接后 我的数据框如下所示 ID Features Vector 1 50 Array 1 1 2 3 2 50 Null 我最终得到 向量 列中某些 ID 的空值 我想用 300 维的零数组替换这些 Null 值 与非空向量条
  • Python:数百万个小文件的读写速度缓慢

    结论 看来 HDF5 是适合我的目的的方法 基本上 HDF5 是一种用于存储和管理数据的数据模型 库和文件格式 并且旨在处理令人难以置信的大量数据 它有一个名为 python tables 的 Python 模块 链接在下面的答案中 HDF
  • 使用 EntityFramework 使用空参数值调用存储过程

    我在 sqlserver 2008 上有一个存储过程 其中一个参数接受空值 我不知道如何使用参数上的空值来调用该 SP 为了获得更多上下文 我正在使用 EntityFramework 6xx 在下一个示例中 参数 status Compat
  • 将 PHP 变量保存到文本文件

    我想知道如何将 PHP 变量保存到 txt 文件 然后 再次检索它们 Example 有一个输入框 提交后写的东西 输入框将被保存到文本文件中 稍后需要结果 作为变量带回 假设变量是 text I 需要将其保存到文本文件并能够将其检索回来
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • ruby 中的 unshift + file.join

    unshift File join File dirname FILE vendor addressable 2 1 0 lib addressable uri 上面的代码是否访问具有以下路径的文件 vendor addressable 2
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • 块执行后变量返回 null

    我正在调度一个队列来在单独的线程上下载一些 flickr 照片 在 viewWillAppear 中 当我记录块内数组的内容时 它完美地显示了所有内容 dispatch queue t photoDowonload dispatch que
  • 如何在powershell中将一个大文本文件拆分为多个文件

    你好 我有一个像这样的大文本文件 BIGFILE TXT COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 COLUMN6 COLUMN7 COLUMN8 11 24 2013 50 67 51 22 50 6
  • 从 python 执行 C++ 代码

    我是 python 的初学者 我不知道这是否可行 我在 python 中有一个简单的循环 它为我提供当前目录中的所有文件 我想要做的是从 python 执行我之前在目录中的所有这些文件上编写的 C 代码 建议的 python 循环应该是这样
  • 在iframe中显示本地htm文件?

    我使用 MailBee NET 对象以 htm 格式在本地计算机上保存一些电子邮件 例如 使用服务器上的电子邮件 messageID 为每封电子邮件创建一个单独的文件夹 D 电子邮件 GmailId1380ec660e0e656a doc
  • FileReader 在 Ionic 2 中未触发 onloadend

    我正在尝试使用 cordova file plugin 读取本地文件 目前我可以读取本地目录的内容并选择单个文件 但我在获取文件内容时遇到问题 这是我的函数 从列表中选择文件后单击按钮即可调用该函数 import window resolv
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 在 C# 中打开文本文件

    我正在编写一个 Windows 窗体应用程序 其中在程序运行时记录一些数据 并使用以下代码将其写入临时文件中 string path Path GetTempFileName byte text new UTF8Encoding true
  • 动态创建和下载Doc文件

    因此 我尝试动态创建 doc 文件并让用户在单击按钮时下载该文件 这些是我找到的用于下载文件的标头 header Content Description File Transfer header Content Type applicati
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • Javascript:通过将路径作为字符串传递给对象来获取对象的深层值[重复]

    这个问题在这里已经有答案了 可能的重复 使用字符串键访问嵌套的 JavaScript 对象 https stackoverflow com questions 6491463 accessing nested javascript obje

随机推荐

  • Flutter桌面小工具 -- 灵动岛【Windows+Android版本】

    通过此篇文章 你将了解到 Flutter动画实现灵动岛 Flutter如何开发一个置顶可自由拖拽的小工具 分享一些关于灵动岛的想法 本文为稀土掘金技术社区首发签约文章 14天内禁止转载 14天后未获授权禁止转载 侵权必究 前言 Flutte
  • FormData(file类型文件)

    有的时候我们上传图片时 后台要求是file类型 我们可以借助FormData 以这种方式上传的 后台接收到的 window files self files 0 if window files var form new FormData v
  • [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • sql计算留存率

    SELECT first day sum case when by day 0 then 1 else 0 end day 0 sum case when by day 1 then 1 else 0 end day 1 sum case
  • 解决WebSocketClient.js?5586:16 WebSocket connection to ‘ws://192.168.1.102:8999/ws‘ failed:

    修改vue config js里的devServer配置 添加client 配置 client webSocketURL ws 0 0 0 0 8999 ws module exports 配置跨域请求 devServer 项目运行的端口号
  • frida辅助分析ollvm字符串加密

    frida辅助分析ollvm字符串加密 近期逆向任务繁重且艰巨 因此把工作期间得学习心得做下笔记还是十分得有必要得 防止后期遗忘 个人博客 http www zhuoyue360 com 文章目录 frida辅助分析ollvm字符串加密 一
  • JAVA解析纯真IP地址库

    前几天看了下Ruby的IPParse 觉得很过瘾 上网查了下貌似很多IP数据库都要收费的 就下了个纯真QQIP地址库 发现还可以在线升级的 很适合咱做点小玩意 具体解析的纯真版IP地址库请详见http lumaqq linuxsir org
  • Discuz!开发之主题高亮字段highlight解析

    Discuz 开发之主题高亮字段highlight解析 相关数据表pre forum thread 我们可以看到主题高亮信息存储于字段highlight 且为一个整型数据 那么discuz 如何将这个整型数解析为高亮 包括 字体颜色 背景颜
  • FPGA开发流程概述

    Lesson 3 FPGA开发流程概述 开始学习FPGA 想尽快上手FPGA开发 那么先来了解一下FPGA的开发流程 1 需求分析到模块划分 需求说明文档 器件选择 逻辑资源 功耗 IO数量 封装等等 配置电路考虑 开发工具选择 电路板的可
  • 数据结构与算法实验-实验一:线性表基本操作

    线性表基本操作 文章目录 线性表基本操作 题目1 题目2 题目3 题目1 线性表是最常见和常用的ADT 假设线性表的元素为整数 请基于顺序存储结构实现线性表ADT 基本功能包括 1 建立线性表 输入有两行 第一行是一个整数n 线性表的长度
  • SpringMVC自定义视图完成步骤 和 视图解析的源码剖析

    自定义视图完成步骤 7 2 1自定义视图完成步骤 1 自定义视图 创建一个 View 的 bean 该 bean 需要继承自 AbstractView 并实现 renderMergedOutputModel 方法 2 并把自定义 View
  • 【项目实战】在win10上安装配置Hadoop的环境变量

    一 说明 注意 该教程适用于 远程连接Linux上的Hadoop集群 因此本步骤是不需要在本地再下载hadoop的 在win10操作系统上 运行Hadoop以及其相关依赖包 比如Hbase依赖包 时 我遇到的情况是 我需要使用SpringB
  • 素数(埃式筛法、线性筛法)

    文章目录 素数判断方法 埃式筛法 线性筛法 区间筛法 质因数分解 例题 第一题 第二题 第三题 素数判断方法 最简单的就是从 2 n 1 都去与 n 取余 看是否能整除 bool prime int n for int i 2 i lt n
  • 使用linuxdeployqt在linux下进行Qt打包发布(超详细)

    首先 来说下 本教程实现的功能 在linux下对开发的Qt应用 进行拷贝依赖文件so等 并打成deb安装包 实现可安装 卸载 安装完毕自动在开始菜单下和桌面添加快捷方式 卸载后自动删除快捷方式 以及删除应用生成的log文件 测试环境 ubu
  • 自学Android资料大全

    学习级别 很多人都往往划分成入门 初级 中间 骨灰级等 这里就简单地划分为两级 基础篇和进阶篇 另外 本文涉及到的所有书籍都是在学习过程中所读过的比较经典的一些书籍 一 基础篇 看书的姿态 学习过程往往大家都需要看书 网上一搜 往往会有一大
  • 浪潮服务器更换硬盘_携手希捷,浪潮领先业界完成希捷银河(Exos)X18企业级硬盘评测...

    全球领先的数据存储解决方案提供商希捷科技 NASDAQ STX 宣布 携手浪潮完成对希捷银河 Exos X18企业级硬盘的评估 该硬盘拥有目前业界最高的18TB超大容量 性能卓越 用于承载大规模数据中心的海量数据 双方在实际工作负载环境中测
  • Python @函数装饰器及用法(超级详细)

    使用 符号引用已有的函数 比如 staticmethod classmethod 后 可用于修饰其他函数 装饰被修饰的函数 那么我们是否可以开发自定义的函数装饰器呢 答案是肯定的 当程序使用 函数 比如函数 A 装饰另一个函数 比如函数 B
  • AcWing 420. 火星人

    y总讲得很好 学到很多所以安利一下 转载自Acwing yxc 算法 贪心 全排列 O nm O nm 这道题目可以直接用next permutation函数来做 这里我们考虑一下next permutation函数的原理 然后手动实现一遍
  • c++ modbusTCP

    Modbus TCP是一种基于TCP IP协议的Modbus协议 它允许Modbus协议通过以太网进行通信 在C 中 可以使用第三方库来实现Modbus TCP通信 例如libmodbus和QModbus 使用libmodbus库实现Mod
  • 介绍一种巧妙的删除程序自己的方法

    介绍一种巧妙的删除程序自己的方法 vcbear 近日看到网友询问如何实现程序运行之后把自己删除的方法 不知大家对木马甚么的兴趣实在太浓 还是想要这样的效果 用户只要一运行程序 可执行文件就没有了 可是程序还是在跑 胆小的只怕要喊 鬼呀 老婆