解析C语言程序是如何自删除的

解析C语言程序是如何自删除的,第1张

程序自删除的方式有很多,不过最终的岁岁悔思想不过是关闭本身进程,开启新进程用于删除自身。下面这个方法是用windows自带命令行程序实现删除。命令行为

cmd.exe

/c

del

filename--------------------------------------------------------------------------------代码示例:C语言形式#include

#include

#include

BOOL

SelfDel(){SHELLEXECUTEINFO

seiTCHAR

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

=

0sei.lpVerb

=

"Open"sei.lpFile

=

szComspecsei.lpParameters

=

szParamssei.lpDirectory

=

0

sei.nShow

=

SW_HIDEsei.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}---------------------------------------------------------------------------------代码示例:汇编形式雀则.386.model

flat,stdcalloption

casemap:noneinclude

windows.incinclude

kernel32.incincludelib

kernel32.libinclude

urlmon.incincludelib

urlmon.libinclude

shell32.incincludelib

shell32.lib.data?szModule

db

MAX_PATH

dup

(?)sComspec

db

MAX_PATH

dup

(?)

自删除szParams

db

MAX_PATH

dup

(?)hCurProcess

dd

?hCurThread

dd

?.datasei

SHELLEXECUTEINFO

<0>.constszComspec

db

COMSPEC,0Verb1

db

open,0szCom1

db

/c

del

,0szCom2

db

>

nul,0.codestart:invoke

GetModuleFileName,0,addr

szModule,MAX_PATHinvoke

GetEnvironmentVariable,addr

szComspec,addr

sComspec,MAX_PATHinvoke

lstrcpy,addr

szParams,addr

szCom1invoke

lstrcat,addr

szParams,addr

szModuleinvoke

lstrcat,addr

szParams,addr

szCom2mov

sei.cbSize,sizeof

sei

1mov

sei.hwnd,0

2mov

sei.lpVerb,offset

Verb1

3lea

eax,szParamsmov

sei.lpParameters,eax

4lea

eax,sComspecmov

sei.lpFile,eax

5mov

sei.lpDirectory,0mov

sei.nShow,SW_HIDEmov

sei.fMask,SEE_MASK_NOCLOSEPROCESSinvoke

ShellExecuteEx,

addr

sei.if

eaxinvoke

SetPriorityClass,sei.hProcess,IDLE_PRIORITY_CLASSinvoke

GetCurrentProcessmov

hCurProcess,eaxinvoke

SetPriorityClass,hCurProcess,REALTIME_PRIORITY_CLASSinvoke

GetCurrentThreadmov

hCurThread,eaxinvoke

SetThreadPriority,hCurThread,THREAD_PRIORITY_TIME_CRITICALinvoke

SHChangeNotify,SHCNE_DELETE,SHCNF_PATH,addr

szModule,0&n

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函数删除就好. 只有程序本身 需要新建进程渣磨世删除 也就是上面这个代码. 游耐

检查下是否有中断被使能却为巧慧编写中断服务函数。

或者为每个中断答宽逗源编写空的服务函数

原因是AVR中断服务向量在单片机的低段,与main函数清卖,处在相近位置,如无中断服务函数,据会跳到主函数中,这个与中用的编译器也有关系,winavr(gcc) , 就会这样。

在给你推荐一个调试方法,分块屏蔽sei() 前面的程序语句以方便定位,误使能中断的位置。

个人意见仅供参考,如若有误欢迎批评指正。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存