电脑系统自毁程序

电脑系统自毁程序,第1张

自毁程序是一些电脑高手编写的可执行代码,没有现成的。我给个代码你看一下,如果你能看懂就可以用了。面的代码由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不被删除.)

不过我还是没有找到象你说的那样的程序

逾期自毁程序指一些程序,如中文编辑软件CCED及WPS等,这类程序的使用有一定的日期

限制,一旦逾期,将提出警告并删除系统运行所必须的文件。显然这类程序给我们的日常应

用带来了诸多不便。一种简单的方法是用DOS的DATE命令修改系统日期,然后运行这类程序

,运行完毕再改回日期。该法虽然可行,但需较多的人工干预,万一忘记某一步骤,将产生不

可预料的后果。一种改进的方法是使用批命令,但由于无法保证运行后系统日期的正确,故

其实际效果仍欠佳。有鉴于此,笔者用C语言编写了一个程序(附后),圆满地解决了此问题。

使用本方法不仅可以有效地防止程序自毁,而且不对系统日期产生影响。程序用Turbo C V

2.0编译通过,在PC/AT、Super386上运行通过。

#include

#include

#include

#include

extern unsigned_stklen=2048

extern unsigned_heaplen=2048

int main(int argc,char *argv ,char * envp )

{

struct date curdate,olddate

int reyear

inr result

char * errstr[] =

{

"Parameter table too long.",

"Invalid parameter.",

"Path or filename not found.",

"Bad EXEC format.",

"Not enough memory",

"Unknown error"

}

"int err

if (argc==1)

{

printf(" This program is used for executing those programs\n")

printf ("which may destroy themselves while deadline passed.\n\n")

printf ("Usage:SAFEDATE\n")

return 1

}

getdate (&curdate)

olddate=curdate

reyear=olddate.da_year_1980

olddate.da_year-=reyear

setdate (&olddate)

argv++/* Adjust command line pointer */

result=spawnvpe(P_WAIT,argv[0],argv,envp)

olddate.da_year+=reyear

setdate (&olddate)

if (result==-1)

{

printf("\aExecuting program%sfailed.\n",argv[0])

switch (errno)

{

case E2BIG: err=0

break

case EINVAL: err=1

break

case ENOENT: err=2

break

case ENOEXEC: err=3

break

case ENOMEM: err=4

break

default:

err=5

}

printf(" %s\n", errstr [err])

return 2

}

return 0

}

注:此文仅作为一种应用技巧予以刊出,仅此而已。

——编者


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12139269.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存