自删除程序的研究及实现

《Windows核心编程》读书笔记十 同步设备I/O与异步设备I/O 第十章 同步设备I/O与异步设备I/O 本章内容 10.1 打开和关闭设备 10.2 使用文件设备 10.3 执行同步设备I/O 10.4 异步设备I/O基础 10.5 接收I/O请求完成通知 希望线程在处理IO时不要被挂起(非阻塞),线程和他真正执行的IO操作进行通信。使用IO完成端口(I/O Comopletion port) 使用IO完成端口可以使得线程在读取 阅读详情

这是一个非常有意思的话题, 一个EXE程序如何在运行结束以后从电脑中删除. 网上一搜就会找到各种各样的介绍. 看完这篇文章或许可以帮助你不必继续Google了, 因为我相信读完这篇文章你对这个话题已经有了足够的认识. 而且据我经验, 网上太多的拷贝/粘贴都没有实践过, 甚至有误导的嫌疑. 或者这篇文章对初学者有一定的难度, 但是我还是建议你多花点时间理解一下, 结合代码能让你有更深刻的体会. 而且有一些经验,教训可以避免你犯同样的错误. 更何况我也是一个初学者...如有不当之处敬请谅解...

 

 

声明一下, 本文中所有的方法都非原创, 我所作的只是把文字的东西变成代码, 同时我会对每一种方法的利弊进行分析.

本文一共阐述了7种方法, 其中5种能成功工作. 另外一种颇为经典的方法只能在NT下运行, 另外一种也是网上广为流传的方法未能成功. 原因不解. 

 

接下来正式开始我们的介绍. 如果你是第一次碰到这个话题, 下面的代码可能是最先出现在你脑中的:

当然, 这是不可行的. 要不然也没有讨论的必要. 因为这个时候的文件是被锁住的. 至于为什么这里不便深究. 有兴趣的读者可以研究一些文件映射对象及程序的加载过程. 当然这是一个更加复杂的话题. 其实接下来有一个方法会利用到这个知识, 所以还是会提到一点. 当然也只是一点而已, 因为我也就知道这么一点...

 

 

下面的链接是一篇自删除问题的介绍, 其中列举了一些方法. 你可以看也可以不看. 我放在这里的原因只是想告诉你, 有一些比较'搓'的办法我就不研究了. 我们需要完成的任务是在程序运行结束之后立刻删除, 注意是立刻. 而我所谓'搓'的办法是要在重启计算机后才会删除. 这显然不是我们满意的. MoveFileEx和WININIT.INI就是两种我提到的比较'搓'的办法. 如果你明白了我的意图, 那你可以直接跳过这个链接继续往下了.

http://www.catch22.net/tuts/selfdel

 

 

另外有必要提一下的是我的测试环境, 我使用的机器是win7 x86和win7 x64. 而在win7 64下又分两种情况, 程序以x86及x64方式编译/运行. 每一种环境下都可能导致不同的测试结果. 在具体介绍每一种方法的时候我还会单独提到这个问题.

  

1. Batch File

第一种我介绍的是batch file. batch file运行的时候是不会被lock的, 这就是意味着我们可以临时产生一个batch file, 由这个batch file负责EXE文件及自身的删除:

代码很简单, 不多解释. 代码中有个Sleep只是让你知道在你启动了BAT文件以后原程序不必立刻退出, 因为在BAT文件中我们会重复的进行删除直到成功为止. 但是总是不是那么的舒服, 毕竟有个BAT文件一直在那边等会让你觉得浪费CPU. 这个代码应该可以运行在所有支持BAT文件的windows系统下(本人只在win7 x86和x64下测试通过).

   

2. ComSpec

这是一种接近Batch File的方法, 也很简单:

代码也再简单不过, 没有解释的必要. 跟BAT的区别只是这里我们需要程序立刻返回.

       

3. NT_ONLY

这个我都不知道用什么名字形容比较好, 因为它实在太经典了. 唯一的不足之处是只能在windows NT下运行, 所以我们暂且就称这种方法为: NT_ONLY. 还记得之前我们提过EXE不能删除是因为被锁住了. 这个锁住是因为这个EXE文件被当做一个文件映射, 而有一个函数叫做UnmapViewOfFile可以解除这个映射. 你是不是又在动脑筋了?于是一气呵成:

很可惜, 不但EXE没有删除, 程序还崩溃了(NT, 未验证). UnmapViewOfFile意味着取消文件映射, 具体来说, 是取消用户空间某一段内存到文件的映射, 或者说, 是把该用户空间的内存区域标识为没有映射, 直接导致的后果是把这个内存区域标识为无效. 而UnmapViewOfFile之后的代码正是在这个区域中的, 这下可好, 当运行到GetMouduleFileName的时候内存访问无效, 程序崩溃.

 

接下来让我们整理一下, 有没有办法可以避免这个问题. 在调用完UnmapViewOfFile之后, DeleteFile也是我们必须调用的. 但是这样的话存在两个问题: 1. DeleteFile的调用者不能是我们自己的代码. 2. 既然UnmapViewOfFile之后我们的代码已经无效了, 那程序如何返回?对于第二个问题, ExitProcess可以帮助我们退出程序. 但是ExitProcess又有谁去调呢?另外这些函数的参数我们怎么传递给它们?带着这些疑问, 我们来欣赏一下<<windows NT Native API Reference>>的作者Gary Nebbett的天才之作:

在研究这段汇编代码之前我们注意到有个CloseHandle((HANDLE)4)的调用. 这是因为在NT/2000中保存了一个用户空间的对这个文件映射对象的引用的句柄, 这个句柄是个硬编码:4. 在UnmapViewOfFile之前我们需要先关闭这个句柄. 接下来的一段汇编是整个程序的核心, 在研究这个代码之前请确保你已经充分理解了retn这个返回指令的意义, 如果你对下面的问题没有搞明白, 那我保证你是不会理解这个代码的.

 

调用B(0)的前后堆栈发生了什么变化? 特别是在B函数返回retn 4这条指令做了什么?你可以这么理解这个指令: EIP=[esp], esp+=8. 当然这个是一气呵成的, 这么写只是便于你理解. 有了这个基础, 在结合下面的堆栈变化图, 我相信理解这个代码对你来说已经不在话下了:

 

 

4. Using a DLL

第三种方法虽然精妙但是却只能在NT/2000下工作, 在此基础上有人想出了更加完美的解决方案. 一个动态链接库总是以LoadLibrary, FreeLibrary的方式加载/卸载. 卸载?不就是从内存中撤掉一个DLL的映射么?那我们是不是把UnmapViewOfFile替换成FreeLibrary实现对一个DLL的自我删除呢?事实证明是完全可行的. 那么谁来加载这个DLL, 如果由我们的EXE加载肯定不行, 因为EXE的生命周期肯定长于DLL, EXE还是没办法删除. 微软提供了我们一个工具rundll32.exe允许我们以命令行的形式加载一个DLL并且调用DLL内部的函数, 当然这个函数的原型有一定的规范. 使用方法如下:rundll32.exe XXX.dll,_Func@16 AnyStringYouWantToPassIntoFunc

接下来让我们整理一下, 如何用DLL实现这个目标:

1. 首先我们肯定需要两个文件: EXE+DLL.

2. EXE负责启动rundll32进程, 同时以参数的形式将EXE的路径名传给rundll32, 确切的说是传给DLL中的函数.

3. EXE退出, rundll32开始运行. DLL中的函数被调用, 首先删除EXE文件, 再通过FreeLibrary的手法完成自己的删除.

 

一切都很完美, 但是我们可以做的更完美:

1. 我们只需要提供一个EXE文件, DLL以二进制资源的形式嵌入EXE资源段. EXE运行的时候动态生成这个DLL.

2. EXE必须在启动rundll32之后立刻退出么?答案是否定的, 我们可以在DLL中WaitForSingleObject等待EXE退出. 那么如何在DLL中获得EXE的进程句柄呢?方法当然有很多, 但是有个最直截了当的: 我们还是以参数的形式与EXE路径一起传到DLL的函数中.

 

有了以上的基础, 下面的代码就不难理解了. EXE:

 

DLL:

代码虽然都已给出, 但是要运行起来还是不够的. 因为在我们会把DLL已资源的形式嵌入到EXE中, 所以我们还需要一个resource.h和一个rc文件来完成这个事情, 另外还需要设置一下项目依赖关系, 因为编译EXE的时候需要保证DLL以后生成. 这些工作就交给读者自己了.

读到这里, 你有没有一个疑问: 这个代码在x64下编译运行么?答案是100%否定的. 因为x64根本不支持嵌入式汇编. 那么你可能会继续问: 如果单独用一个asm文件呢?其实我也有这个问题, 甚至还打算动手写一个x64版本的DLL. 刚动手不久, 猛然发现这个技术在x64下面是不可行的, 原因在于x64下函数的前四个参数是用寄存器(rcx,rdx,r8,r9)传递的, 并非堆栈. 如果你还不能理解这一点, 那说明你对之前的那段汇编代码理解不够.

 

 

5. CreateRemoteThread

这也是一个惯用的手法, 编写代码期间也遇到了不少问题. 之前我有一篇文章就是比较详细得记录了用这个方法时遇到的一些问题或现象. 现在你只需关心下面的内容, 在适当的时候我会提醒你可以翻翻那一篇文章. 用CreateRemoteThread的基本想法也很简单: 找到一个比较common的进程, 然后在其中创建一个远程线程, 这个线程就是用来删除我们的EXE的. 当然, 如果不考虑通用性的话, 你可以简简单单的打开QQ, 然后再任务管理器找到进程ID, 注入完事. 估计代码不超过100行. 但是由于我当初的想法就是写一个'比较'通用的程序, 而不是说不打开QQ就不能运行. 那么下面的问题接踵而至:

1. 如何选择进程保证能在不同机器上运行. 当然如果lsass/csrss这样的系统进程能注入的话最好不过, 因为基本上现在的windows平台都会有这些系统进程. 很可惜, 这样进程是不允许你注入的. 这个时候你不妨看看我之前的一篇文章, 其中列举了win 7下CreateRemoteThread所有的情况.

2. 既然系统进程不能使用, 那么我们只能用非系统进程, 但是每个用户的非系统进程都不一样, 怎么样?遍历吧. 问题又来了, 遍历下来以后如何删选, 可能是系统进程可能是用户进程, 在win7x64还可能是x64也可能是x86的. 什么样的进程符合我们的需求?也许你想说, 找到一个进程就注入, 总有一个会成功. 但是事实证明这是一个馊主意, 特别是用x64注入x86进程的时候会导致目标进程崩溃. 所以我们还是老老实实挑选一个我们认为OK的吧. 这个时候如果你还没有读过我之前一篇文章<<远程线程注入时遇到的问题>>, 我还是建议你回去读一下. 通过测试结果, 你可以很清楚地看出什么样的目标是我们需要的: 用户进程/相同位宽(都是x86或者x64).

 

为了实现这个目标, 有不少的工作需要我们完成, 代码量也迅速膨胀:

还是老样子, 代码我不打算过多的解释. 通过之前的介绍加上代码注释我相信不存在什么困难了. 重点还是介绍一下期间遇到的问题已经应该注意的地方:

1. 首先需要提醒的地方是有些代码可能不是必须的, 在这个例子中EnableDebugPrivilege和GetModuleFileNameEx就是如此. 有些函数是我在不断尝试过程中加入的, 为了方便以后查阅而没有删除(当然是无害的), 一般我会加上注释说明.

2. 为了使CreateRemoteThread这个方法正常工作, 光有代码是不顶用的. 还需要一些配置, 具体做法在代码上方已经给出. 至于为什么要这样设置是另外一个话题, 请参考我之前的另外一篇文章<<运行时和编译时的安全性检查>>:

http://blog.csdn.net/panda1987/archive/2010/10/19/5952262.aspx

3. ntdll.h这个头文件不是公开的, 需要自己网上下载.  很多数据结构比如PROCESS_BASIC_INFORMATION, PEB_LDR_DATA, PEB, LDR_MODULE都是在这个头文件中定义的. 碰到了一个不解的问题是有一个winternl.h的头文件也有这些数据结构的定义, 但是有些定义(比如PEB_LDR_DATA)却与ntdll.h不同, 这个头文件是不能用的. 困惑中...

4. 有一部分API会在这样的环境中失败: OS: win7x64. Self.exe:x86. Target.exe:x64. 比如GetModuleFileNameEx就是一个例子. 简单分析一下原因: 在使用GetModuleFileNameEx的时候系统会访问进程的PEB, PEB的指针存放在一个叫PROCESS_BASIC_INFORMATION的结构体中. 那么当我们用x86的进程读取一个x64进程的PEB时会遇到什么问题? 按照正常的思维, x86进程无法装下64位指针会发生截断. 但是我还不清楚WOW64下windows做了什么处理, 更深入的说WOW64是如何实现的. 这个希望以后有足够的知识去研究. 这里只是提出有这么一个问题, 确实有部分API是在WOW64下不能正常工作的.

5. 在判断程序是否是32位还是64的问题上遇到了一点问题, 我能想到的唯一的办法就是找到可执行映像的基址, 然后逐步找到IMAGE_OPTIONAL_HEADER中Magic这个字段. 理解这个代码需要一定的PE基础, 网上有很多相关资料, 这里就不多解释了. 我遇到的问题是这样的, 在x64+x64+x64(OS:x64/本进程:x64/目标进程:x64)环境下IMAGE_DOS_HEADER都能正常得到, 但是大部分目标进程的IMAGE_NT_HEADERS却不能获得. ReadProcessMemory在读取x64进程的IMAGE_NT_HEADERS的时候出现三种情况:

1) 如果目标进程的基址<0x0000 0001 0000 0000. ReadProcessMemory失败. GetLastError()==0x000003E6. 错误信息: Invalid access to memory location.

2) 如果目标进程的基址>0x0000 0001 0000 0000. ReadProcessMemory失败. GetLastError()==0x0000012B. 错误信息: Only part of a Read ProcessMemory or WriteProcessMemory request was completed.

3) 如果目标进程的基址==0x0000 0000 0040 0000. ReadProcessMemory成功. 可惜的是这样的64位程序很少. cmd就是一个例子.

至于为什么, 我也很不解. 如果有知晓的朋友务必指教. 感激不尽!

 

6. CreateProcess

这个方法跟之前的远程线程相当类似. 比起CreateRemoteThread有一个优点就是进程的选择更加灵活, 我们可以选择explorer这样的进程作为我们的目标进程, 不需要遍历等等操作. 基本的想法是这样的:

1. 用CreateProcess创建一个进程, 比如explorer. 创建的时候挂起.

2. 找到该进程的基址, 注入代码.

3. 恢复进程的执行.

 

我们可以通过与CreateRemoteThread的比较更具体的了解这个方法, 我们知道CreateRemoteThread提供两个参数, 一个是远程函数地址, 一个是远程数据地址. 这样我们可以通过两次VirtualAllocEx得到的指针分别作为这两个参数. 这样远程函数就可以方便的访问这些数据. 可是CreateProcess就不同了, 我们是把映像的基址所在的代码替换了, 而基址通常是由CRT调用的. 这样的话数据怎么办? 最简单的例子就是EXE的路径, 放在哪里? 如何在目标代码中正确的访问? 当然方法有很多, 我们这里提供一个比较简单的:

1. 代码还是正好放在基址位置. 要不然我们还要计算、更新基址.

2. 数据紧跟着代码放. 这里的数据无非是一个RMTDATA结构.

那么问题又来了, 在代码中如何快速的定位到这个数据结构的起点? 如果我们能找到映像的基址当然一切不成问题, 只要基址+函数长度就是数据的起点. 虽然我们在代码中已经得到了映像的基址, 但是你别忘了这是在将要被删除的EXE内完成的. 如今代码已经注入到explorer, 如果要获得映像的基址, 那还是要大动干戈重新来一边. 我们有更快捷的方法, 首先请读者试想一下, 如何在程序中获得当前EIP的值, 也就是当前运行代码的地址. 我提供两种办法:

如果你对这个代码还不理解, 建议你补补汇编知识. 这里获得的是当前指令的地址, 显然不是基址. 但是我们可以肯定的是这个地址肯定大于基址, 而且相距不远. 这样的话, 我们可以利用一些标志字节来搜索数据结构的起始地址.

 

接下来的代码对你来说肯定小菜一碟了:)

这个程序可以以x86的形式在x86和x64下运行, 但是却不能以x64的形式运行. 因为explorer是32位的, 而注入函数却是以x64编译的, 不出问题才怪. 解决的方法应该不难, 可以用shellcode实现, 直接将x86下编译的二进制代码写入目标进程. 这里我就不试了, 有兴趣的读者不妨自己一试.

 

这次为止, 已经介绍了6种自删除程序的实现方法, 除第三种只能在NT/2000下运行以外, 其他程序都能在win7x86,win7x64下面运行. 第四种方法需要读者自己添加一个resource.h和rc文件, 第五第六种方法需要读者自己下载一个ntdll.h文件. 另外要对vs进行一定的设置. 在结束之前, 还有一种方法也是网上广为流传的, 有兴趣的读者不妨搜索一下'DeleteMe.cpp'. 可惜的是99%都是copy/paste. 我按照同样的方法重新写了一份代码, 经测试这个方法不能正常工作.

 

 

7. FILE_FLAG_DELETE_ON_CLOSE(Not Working)

我不能确定这个代码为什么广为流传, 或许它能再win9x上工作. 只可惜过时了...

 

 

THE END...Thank you for reading:)

exe程序本地“注册”方案实现 exe程序本地“注册”方案实现前因方案一:需要填注册码的注册方案方案二:无需填注册码的注册方案补充说明如何让程序自己删除自己(我杀我自己) 前因 之前应公司的需求用python了一个小程序,封装成exe文件提交了。今天收到新的需求,客户担心他的程序被人copy后,到其他电脑上还可以使用,可能导致重要信息泄露,所以要求我们给出注册方案。 方法有很多,网上有指出入注册表,但是现在有很多针对注册... 阅读详情

相关推荐

程序实现自我删除的七种方法

程序实现自我删除的七种方法

关注互联网安全的小虾米一枚 1万+

FILE_FLAG_DELETE_ON_CLOSE参数不起效

CreateFile使用FILE_FLAG_DELETE_ON_CLOSE标志打开临时文件夹下的临时文件后closehandle,而且程序也退出了,但是该临时文件依然存在。 还有个现象,同样的程序在有些电脑上可以自动删除临时文件,有些电脑不行。不知道为什么? 请高手们解答。。。。谢谢!

niheng1452的博客 2108

文件自删除的一些资料与实现

原文链接https://blogs.msdn.microsoft.com/oldnewthing/20160108-00/?p=92821MSDN 上关于 FILE_FLAG_DELETE_ON_CLOSE 的描述       当文件的所有句柄都被关闭的时候,文件立马被删除,包括这个函数返回的句柄以及其它的打开的句柄以及复制的句柄。        如果已经存在了这个文件的一个打开的句柄,这个函数调

商少 1117

[源码和文档分享]3种方式实现程序自删除

背景 了很多小程序,也有很多小程序需要用到程序自删除的功能。所谓的自删除,就是程序能够自己删除自己。常见的自删除实现方式就有批处理方式还有使用MoveFileEx函数重启删除的方式。 现在,我就对自己掌握的自删除方式进行总结。给出 3 种程序自删除实现方式。其中,两种是批处理方式实现的,还有一种是使用MoveFileEx实现的。 ...

qq_38474647的博客 188

c语言如何删除程序,EXE 程序自删除实现(C语言)

程序自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块),它就自动地把自己从磁盘中删掉,这样一来,就做到了神不知鬼不觉,呵呵,是不是很cool呢?自删除(SelfDeleting)*早的方法是由GaryNebbett大虾的,太经典了,不能不提。程序如下:#include"windows.h"intmain(intar...

weixin_34501627的博客 1772

EXE程序自删除实现

程序自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块),它就自动地把自己从磁盘中删掉,这样一来,就做到了神不知鬼不觉,呵呵,是不是很cool呢? 自删除(Self Deleting)最早的方法是由 Gary Nebbett 大虾的,太经典了,不能不提。程序如下:#include "windows.h"int main

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 1574

VC 程序自删除功能的实现

http://jackaldire.com/201004/exe-self-delete-and-self-modify/其实真正的删除自己肯定是做不到的,至少用户态不行。windows下只要一个文件被某个进程打开就不能被删掉(Linux下可以删除任何打开的文件,只要有权限,而且一般不会影响程序的执行,因为文件系统会等到所有的打开的fd都释放后会才回收inode和data),所以一个windo

cay22的专栏 2561

自删除程序

<br />上一段大牛Gary Nebbett的代码吧、自删除程序、留着研究学习。<br /> <br /><br />#include "windows.h"<br />int main(int argc, char *argv[])<br />{<br />char buf[MAX_PATH];<br />HMODULE module;<br /><br />module = GetModuleHandle(0);<br />GetModuleFileName(module, buf, MAX_PATH

美丽的流域 326

Windows下实现文件自删除

msdn原文链接:https://blogs.msdn.microsoft.com/oldnewthing/20160108-00/?p=92821 MSDN 上关于 FILE_FLAG_DELETE_ON_CLOSE 的描述        当文件的所有句柄都被关闭的时候,文件立马被删除,包括这个函数返回的句柄以及其它的打开的句柄以及复制的句柄。         如果已经存在了这个文件的一个打...

D_R_L_T的博客 2159

自删除程序技术

'自删除程序sub main()dim w_sw_s= WScript.ScriptFullNameset fso = CreateObject("Scripting.FileSystemObject")fso.DeleteFile w_sEnd Subexe程序自删除 程序自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块)...

42

学习一本书,介绍的关于程序自删除技术,查资料时找到相关的文章收藏起来!!!

感谢网名为quasiceo提供的资料: 这是一个非常有意思的话题, 一个EXE程序如何在运行结束以后从电脑中删除. 网上一搜就会找到各种各样的介绍. 看完这篇文章或许可以帮助你不必继续Google了, 因为我相信读完这篇文章你对这个话题已经有了足够的认识. 而且据我经验, 网上太多的拷贝/粘贴都没有实践过, 甚至有误导的嫌疑. 或者这篇文章对初学者有一定的难度, 但是我还是建议你多花点时间理

mokevip的博客 427

SharpSelfDelete 项目常见问题解决方案

SharpSelfDelete 项目常见问题解决方案 项目基础介绍 SharpSelfDelete 是一个开源项目,旨在实现自删除功能。该项目基于 C# 语言开发,主要用于在 Windows 环境下实现程序自删除功能。该项目参考了 Jonas Lyk 的研究和 LloydLabs 的 PoC(概念验证),并在此基础上进行了实现。 新手使用注意事项及解决方案 1. 项目依赖和环境配置 问题描述:新...

gitblog_00199的博客 667

Self-Replace案例研究:知名开源项目如何使用这个库实现无缝更新

Self-Replace是一个强大的Rust工具库,能够帮助开发者实现程序的自我更新和自我卸载功能。无论是在Unix系统还是Windows系统,它都能提供稳定可靠的自我替换机制,特别适合单文件可执行程序的无缝升级场景。 ## 📌 为什么需要Self-Replace? 在开发单文件工具时,自我更新一直是个挑战。传统方案往往需要外部工具辅助,或者要求用户手动下载新版本。Self-Replace通

gitblog_01166的博客 497

PEunion核心功能详解:双层架构如何实现完美规避检测

PEunion是一款专业的加密器、绑定器和下载器工具,采用创新的双层架构设计,专门用于降低可执行文件被安全软件检测的概率。本文将深入解析PEunion的核心功能,特别是其独特的双层架构如何实现完美的规避检测效果,帮助新手用户快速掌握这一强大工具的使用方法。 ## 🔍 PEunion是什么?为什么需要它? PEunion是一款功能强大的加密工具,它能够加密可执行文件,并在运行时解密后在内存中执

gitblog_00001的博客 525

Forensia高级技巧:文件融化(File Melting)功能的实现原理与实战应用

Forensia是一款专为红队人员设计的反取证工具,在渗透测试的后期阶段用于清除操作痕迹。其中,文件融化(File Melting)功能是其核心特性之一,能够帮助安全测试人员在完成任务后彻底清除自身痕迹,避免被溯源。本文将深入解析这一强大功能的实现原理与实战应用方法。 ## 一、什么是文件融化(File Melting)? 文件融化是Forensia工具中一项独特的自毁机制,通过特殊的技术手段

gitblog_01163的博客 752

程序删除自己,改自己

用C/C++编程,实现删除自己改自己

lichao17909的博客 1473

linux inotify研究2

Inotify 使用系统调用而非 SIGIO 来通知文件系统事件。 Inotify 可以监视的文件系统事件包括: IN_ACCESS,即文件被访问 IN_MODIFY,文件被 write IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等 IN_CLOSE_WRITE,可文件被 close IN_CLOSE_NOWRITE,不可文件被 c

zvivi521的专栏 535
上一篇: 远程线程注入时遇到的问题
下一篇: Ring3下Hook API实现分析
panda1987
博客等级 码龄18年 37粉丝 25原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值