还未结束就能把自身删除的程序

下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码.

这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了.

int main(int argc, char *argv[])
{
HMODULE module = GetModuleHandle(0);
CHAR buf[MAX_PATH];
GetModuleFileName(module, buf, sizeof buf);
CloseHandle(HANDLE(4));
__asm {
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push UnmapViewOfFile
ret
}
return 0;
}

现在,我们先看一下堆栈中的东西

偏移 内容

24 0

20 0

16 offset buf

12 address of ExitProcess

8 module

4 address of DeleteFile

0 address of UnmapViewOfFile

调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错.而调用ExitProcess则应该不会返回.

这段代码的精妙之处在于:

1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对应的一个句柄.

2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错.而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码.

3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.)

时间: 2024-09-20 17:54:31

还未结束就能把自身删除的程序的相关文章

多线程中操作数据库,resultset还未结束当前操作,己被另一个线程提前关闭而出错

问题描述 先来看我的线程 private DataHandle dh = new DataHandle(); public synchronized void runTask() { try { dh.handle(pbean.getStartNo(), pbean.getEndNo()); } catch (Exception e) { e.printStackTrace(); // TaskManagerBean.returnItem(); } 这个是我的线程,里面用到一个叫DataHand

新东方与做空机构浑水公司(MuddyWatersResearch)之间的博弈还未结束

近日,美国律师事务所GlancyBinkow GoldbergLLP又宣布,已经代表于2009年7月21日至2012年7月17日之间购入新东方美国存托凭证的所有个人或实体发起集体诉讼.目前,起诉书已经向加州中部地区法院递交. 新东方遭遇"集体诉讼" 这家律师事务所指控称,新东方自2009年7月至今,发布了虚假或有误导性的消息,公司及部分高管涉嫌违反美国联邦证券法的规定. 记者注意到,事实上,这家律师事务所对新东方的指控与浑水公司此前的做空报告相差无二,具体来说包括:从事新东方业务运作的

java-Java 网络通信 类还未编写如何进行调用(或者解决思路)

问题描述 Java 网络通信 类还未编写如何进行调用(或者解决思路) 程序想实现的效果:客户端现在有一个对象"狗",加入了一个LinkedList集合,随后将该集合发送到服务器端.服务器端接收到这个集合,会调用一个方法Judge来判断LinkedList里面有什么,如果是狗则调用XXX方法,如果是猫则调用XXX方法. 问题描述:现在客户端与服务器端单独抽出成为一个jar工具包.也就是说服务器端和客户端会预先写好.换而言之,在该包里没有Judge方法,Judge方法是在程序实际编写时再写

请教:为什么会提示有未结束的字符串常量和GRulerControl未定义呢

问题描述 为什么会提示有未结束的字符串常量和GRulerControl未定义呢<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:v="urn:schemas-microsof

SD定价提示:条件记录已存在,但还未被设置

问题描述 在单据中提示定价错误,从价格分析中也能分析到定义的价格,但没有取到单据上去,存取细目中的解释是"条件记录存在,但还未被设置",不明白具体什么原因,碰到好多次了,请大家及版主帮帮忙看看,先谢谢了!已经排除了在单据之后定义价格和提取价格后又删除记录的可能了 解决方案 解决方案二:看看解决方案三:看看和工厂有关系没,直觉,没遇到过这种问题,嘿嘿

内忧外患 “两个三星”能否解困还未可知

11月29日,三星发布公告称,该公司正在考虑是否要分拆成两家公司,以便提升股东长期价值,而这个决定的背后是三星所面临的巨大经营压力.Note 7事件,再加之后来的洗衣机召回和贿赂丑闻,如今的三星已经伤痕累累,而在手机和家电市场中,三星更是面对着来自竞争对手的有力挑战.业内人士对三星的业务裂变前景表示担忧,"分拆重组"会在未来再造一个三星,还是只是为了取悦资本市场的短期断臂行为,目前还未可知. 考虑拆分 11月29日,三星电子发表声明称,将增加向股东的现金回报,今明两年将把50%的自有现

IE6下出现JavaScript未结束的字符串常量错误的解决方法_javascript技巧

里面提到"DOM是UTF-8的篇码,如果JS库不是分离的独立JS文件,而是包含在DOM里的,这个问题是不会出现的.然而分离的JS文件并不是UTF-8编码,被加库到UTF-8编码的DOM里,中文就出现了乱码,并影响到引号符,使浏览器无法判断字符串结束.解决变法很简单,JS文件另存为UTF-8编码格式即可. " 所以我修改了JavaScript的引用, <script type="text/javascript" src="**.js" cha

javascript 字符串未结束解决

网页特效 字符串未结束解决 我的解决方法有两个,一个是将字符串变量进行替换操作,将双引号替换成单引号 ,单引号替换成""",不过这样在传递后读取时还得替换成原文:第二种方法是 不直接将数据以参数形式传递,而是先将其赋值给一个隐藏文本内,函数里只需读 取文本中的内容即可 一就是js文件与页面编码不一致,导致文件内部特殊字符因格式不一致就会在解码 时出现乱码,从而导致编译器在未到达引号( "或' )前提前结束,产生"未结束的 字符串常量". 解决办法

付费广告仍有效 新的模式还未出现

中介交易 SEO诊断 淘宝客 云主机 技术大厅 各种各样的大小公司宣贯着他们新的媒体广告形式尝试. 而越来越多的企业被鼓动尝试各种新媒体:划拨多少预算给各种新尝试?传统媒体是否单纯地削减预算?听听广告主教父宝洁和专业公司的意见. 宝洁首席营销官史丹格详解新旧媒体应用心得:付费广告的营销方式依然有效:宝洁的营销开支越来越分散:正进行新营销尝试.但是-- 成型的新营销模式还未出现 人们问起我们是否担心来自TiVo数字电视公司及其点播节目趋势的销售渠道冲击,我的回答是绝对不会.媒体界正经历的变革,促使