对Gary Nebbet的经典自我删除代码的读后心得

原创 2004年10月24日 19:18:00
 

对Gary Nebbet的经典自我删除代码的读后心得

LionD8 随笔 2004-3-14 QQ:10415468

以下是Gary Nebbet的经典源码

#include "windows.h"

void 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

}

}

代码的前3排就不说了。从CloseHandle((HANDLE)4)开始讲起。

在网上查找了很多资料查到HANDLE4是OS的硬编码,CloseHandle((HANDLE)4)用于关闭文件语柄。

要删除一个文件必须要删除打开文件的语柄,如果有文件语柄打开将会失败。在上面已经关闭了。

下面重点分析 __asm { } 里面的内容。

经过一连串的PUSH过后。 堆栈里面的内容形成了这样的形式。

以下是在WIN2000 SP3 VC6.0下测试结果。

ESP         栈内的值     栈内地址

0012FE28     0           0012FE28

0012FE24     0           0012FE24

0012FE20    0012FE78     0012FE20 文件全路径

0012FE1C    77E7CF5C     0012FE1C ExitProcess入口

0012FE18    00040000     0012FE18 module的值

0012FE14    77E6E3A6     0012FE14 DeleteFile入口

0012FE10    77E6D2BD     0012FE10 UnmapViewOfFile

接下来就RET我们知道RET是在函数返回的时候调用的。它的功能就是从当前的ESP指向的堆栈中取出函数的返回地址。对于上面的代码来说现在的ESP=0012FE10,现在取出栈地址0012FE10里面的值77E6D2BD,然后跳转到77E6D2BD,这就到了UnmapViewOfFile的函数入口。为什么0012FE10后面是DeleteFile?参数module为什么又到了0012FE18这些以后我们马上解决。

我们先自己编写一个代码

void main ()

{

UnmapViewOfFile(NULL);

}

然后反汇编看看汇编命令是怎么的。如下:

6: UnmapViewOfFile(NULL);

00401028 mov esi,esp

0040102A push 0

0040102C call dword ptr [__imp__UnmapViewOfFile@4 (004241ac)]

00401032 cmp esi,esp

首先是参数0入栈,然后我们追到[__imp__UnmapViewOfFile@4 (004241ac)]

里面去。看看现在的栈是什么样子的。如下:

栈内地址     栈内值

0012FF30     0         参数

0012FF2C     00401032  返回地址

00401032是CALL函数系统帮我们入栈的我们并没有手工添加。但是对于RET我们在转移到UnmapViewOfFile入口的时候并没有一个返回地址的入栈,也就是说push DeleteFile就成了UnmapViewOfFile函数的返回地址。再上面push module才是UnmapViewOfFile的参数。有一点烦琐好好想一想。好的当我们的UnmapViewOfFile函数调用完毕,现在EIP已经到了77E6E3A6,DeleteFile入口。

但是ESP现在在什么位置?应该在0012FE1C栈内的值为77E7CF5C,同样的道理

在DeleteFile返回后程序应该跳转到77E7CF5C也就是ExitProcess的入口。

那么(0012FE1C+4)才是DeleteFile的参数。也就是0012FE78。PUSH EAX。

当我们的DeleteFile返回的时候,程序跳转到了77E7CF5C,ExitProcess的入口。现在的ESP=0012FE24。一样的道理

PUSH 0 这个是ExitProcess的参数

PUSH 0 这个是ExitProcess的返回地址

由于ExitProcess还没有返回进程就结束了 所以ExitProcess的返回地址是0也不会发生内存错误。

参考文献:

Gary Nebbet的经典源码

以上是本人的一点个人愚见希望对您有所帮助。如果有什么意见,更好的见解欢迎与本人讨论。

=====================

www.rohu.com

虎盟网络安全小组

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

程序实现自我删除的七种方法
  • bjtbjt
  • bjtbjt
  • 2014年08月14日 12:04
  • 4407

程序快速删除自己

讨论了程序执行完成后删除自己的几种方法,重点讲解了在网上比较少见的一种新的删除自身的思路。值得一看哟。原文见:http://www.iwebtrados.com.cn/post/65.html1、介绍...
  • ljc_zy
  • ljc_zy
  • 2009年08月08日 22:52
  • 1670

Java对象自我救赎机制

Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / ...
  • HWHuangeian
  • HWHuangeian
  • 2015年10月16日 18:04
  • 377

一个具自我复制功能的程序

      我在学C的时候写的程序,现在愿意拿来和大家分享. 此程序是一具自我复制程序,它将以自己为模板,复制许多(产生10000个文件后就退出)不同名字的程 序, 这此复制的程序同样都有自我复制的能...
  • shaohui
  • shaohui
  • 2004年11月02日 14:06
  • 10590

个人总结经典书籍列表

个人总结书籍列表
  • jun55xiu
  • jun55xiu
  • 2014年09月03日 14:39
  • 514

《WEB全栈工程师的自我修养》——读后心得

【整理自ZAZ-原文地址】
  • whh181
  • whh181
  • 2016年11月11日 17:38
  • 494

程序员的自我修养——读书笔记

第一部分:温故而知新 第一章:介绍基本的背景知识——操作系统、线程、硬件1、关于C语言中的hello world这些问题你都清楚吗? 2、计算机硬件设备的三个核心部件: 1》中央处...
  • lemonwxj
  • lemonwxj
  • 2016年05月11日 11:52
  • 716

计算机可以这样玩—自我学习,自我思维,自我工作(编程)

如果让计算机产生自我意识,那一定件很好玩的事情。               我在想,怎么让计算机产生自我意识和自我学习的思维能力呢,特别是在工业集群中的应用。               由这个...
  • luozhonghua2014
  • luozhonghua2014
  • 2014年08月06日 22:06
  • 1207

企业要自我反省

       成功的时候作的报告,大部分是虚的,只有失败的教训才是深刻的,才有含金量选手简介叶杰辉,男,1968年出生,中专。一家运动会所营销总监。参赛项目运动超市网络服务平台。运用互联网为项目经营者...
  • phphot
  • phphot
  • 2009年03月03日 21:24
  • 406

《蔡康永的说话之道》读书笔记

说话对于一个程序员的重要性真的是不言而愉,项目中的相互沟通,项目的协调,跟领导汇报工作,给下属安排任务等等,都需要我们有良好的沟通能力,也就是得会说话。 最近在看关于说话方面的书籍,读《蔡康永的说话...
  • anda0109
  • anda0109
  • 2016年07月17日 21:27
  • 887
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对Gary Nebbet的经典自我删除代码的读后心得
举报原因:
原因补充:

(最多只允许输入30个字)