求一段C语言写的程序自毁代码,要求该程序在任务结束后删除自身及相关文件.

求一段C语言写的程序自毁代码,要求该程序在任务结束后删除自身及相关文件.,第1张

BOOL SelfDel()

{

SHELLEXECUTEINFO sei

TCHAR szModule [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH]

// 获得自身文件名. 获取cmd的全路径文件名

if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&

(GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&

(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))

{

    // 设置命令参数.

    lstrcpy(szParams,"/c del ")

    lstrcat(szParams, szModule)

    lstrcat(szParams, " > nul")

    // 设置结构成员.

    sei.cbSize = sizeof(sei)

    sei.hwnd = 0

    sei.lpVerb = "Open"

    sei.lpFile = szComspec

    sei.lpParameters = szParams

    sei.lpDirectory = 0 sei.nShow = SW_HIDE

    sei.fMask = SEE_MASK_NOCLOSEPROCESS

    // 创建cmd进程.

    if(ShellExecuteEx(&sei))

    {

        // 设置cmd进程的执行级别为空闲执行,使本程序有足够的时间从内存中退出.

        SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS)

        // 将自身进程的优先级置高

        SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS)

        SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL)

        // 通知Windows资源浏览器,本程序文件已经被删除.

        SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0)

        return TRUE

    }

}

return FALSE

}

其他相关程序直接调用remove函数删除就好. 只有程序本身 需要新建进程删除 也就是上面这个代码

这段代码的原理比较简单,在窗体的卸载事件加上下面代码。主要都是输出bat文件,然后在调用taskkill结束掉本进程,然后用del删除文件和bat文件。

Private

Sub

Form_Unload(Cancel

As

Integer)

Open

"C:\1.bat"

For

Output

As

#1

Print

#1,

"taskkill

/f

/im

"

&

App.EXEName

&

".exe"

Print

#1,

"del

"

&

App.Path

&

"\"

&

App.EXEName

&

".exe"

Print

#1,

"del

C:\1.bat"

Close

#1

Shell

"cmd

/c

C:\1.bat"

End

Sub

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


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存