首页
社区
课程
招聘
一个简单的自杀代码
发表于: 2005-12-30 11:59 9658

一个简单的自杀代码

2005-12-30 11:59
9658

////////////////////////////////////////////////////////

#include <windows.h>
#include <shlobj.h>

BOOL SelfDelete()
{
  SHELLEXECUTEINFO sei;

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

  // get file path names:
  if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&
     (GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&
     (GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))
  {
    // set command shell parameters
    lstrcpy(szParams,"/c del ");
    lstrcat(szParams, szModule);
    lstrcat(szParams, " > nul");

    // set struct members
    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;

    // increase resource allocation to program
    SetPriorityClass(GetCurrentProcess(),
                     REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread(),
                      THREAD_PRIORITY_TIME_CRITICAL);

    // invoke command shell
    if(ShellExecuteEx(&sei))
    {
      // suppress command shell process until program exits
      SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);
      SetProcessPriorityBoost(sei.hProcess,TRUE);

      // notify explorer shell of deletion
      SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0);
      return TRUE;
    }
    else // if error, normalize allocation
    {
      SetPriorityClass(GetCurrentProcess(),
                       NORMAL_PRIORITY_CLASS);
      SetThreadPriority(GetCurrentThread(),
                        THREAD_PRIORITY_NORMAL);
    }
  }
  return FALSE;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
2
,学习
2005-12-30 14:42
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
3
http://www.cppblog.com/sandy/archive/2005/12/07/1580.aspx
2005-12-30 15:15
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
最初由 鸡蛋壳 发布
////////////////////////////////////////////////////////

#include <windows.h>
#include <shlobj.h>

........


转帖请注明一下。不然别人还以为是你原创的。
2005-12-30 15:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不然别人还以为是你原创的。
2005-12-30 19:13
0
雪    币: 215
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我真的还以为是他原创!
2005-12-30 22:49
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大家把自杀代码共享下阿,好像有很多种
2005-12-31 23:46
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
测试过,有效!
2006-1-2 09:47
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
今天在C:\WINNT发现个_MSRSTRT.EXE,十分可疑
反编译了一下,原来是个重启程序,会删除自身,代码很短:
00401000 >/$  >PUSH EBP
00401001  |.  >MOV EBP,ESP
00401003  |.  >SUB ESP,114
00401009  |.  >PUSH ESI
0040100A  |.  >LEA EAX,DWORD PTR SS:[EBP-114]
00401010  |.  >PUSH 104                                 ; /BufSize = 104 (260.)
00401015  |.  >PUSH EAX                                 ; |PathBuffer
00401016  |.  >PUSH DWORD PTR SS:[EBP+8]                ; |hModule
00401019  |.  >CALL DWORD PTR DS:[<&KERNEL32.GetModuleF>; \GetModuleFileNameA
0040101F  |.  >XOR ESI,ESI
00401021  |.  >TEST EAX,EAX
00401023  |.  >JE SHORT _MSRSTRT.00401035
00401025  |.  >PUSH 5                                   ; /Flags = REPLACE_EXISTING|DELAY_UNTIL_REBOOT
00401027  |.  >LEA EAX,DWORD PTR SS:[EBP-114]           ; |
0040102D  |.  >PUSH ESI                                 ; |NewName => NULL
0040102E  |.  >PUSH EAX                                 ; |ExistingName
0040102F  |.  >CALL DWORD PTR DS:[<&KERNEL32.MoveFileEx>; \MoveFileExA
00401035  |>  >LEA EAX,DWORD PTR SS:[EBP+8]
00401038  |.  >PUSH EAX                                 ; /phToken
00401039  |.  >PUSH 28                                  ; |DesiredAccess = TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES
0040103B  |.  >CALL DWORD PTR DS:[<&KERNEL32.GetCurrent>; |[GetCurrentProcess
00401041  |.  >PUSH EAX                                 ; |hProcess
00401042  |.  >CALL DWORD PTR DS:[<&ADVAPI32.OpenProces>; \OpenProcessToken
00401048  |.  >TEST EAX,EAX
0040104A  |.  >JE SHORT _MSRSTRT.00401088
0040104C  |.  >LEA EAX,DWORD PTR SS:[EBP-C]
0040104F  |.  >PUSH EAX                                 ; /pLocalId
00401050  |.  >PUSH _MSRSTRT.00403000                   ; |Privilege = "SeShutdownPrivilege"
00401055  |.  >PUSH ESI                                 ; |SystemName
00401056  |.  >CALL DWORD PTR DS:[<&ADVAPI32.LookupPriv>; \LookupPrivilegeValueA
0040105C  |.  >PUSH ESI                                 ; /pRetLen
0040105D  |.  >PUSH ESI                                 ; |pPrevState
0040105E  |.  >LEA EAX,DWORD PTR SS:[EBP-10]            ; |
00401061  |.  >PUSH ESI                                 ; |PrevStateSize
00401062  |.  >PUSH EAX                                 ; |pNewState
00401063  |.  >PUSH ESI                                 ; |DisableAllPrivileges
00401064  |.  >PUSH DWORD PTR SS:[EBP+8]                ; |hToken
00401067  |.  >MOV DWORD PTR SS:[EBP-10],1              ; |
0040106E  |.  >MOV DWORD PTR SS:[EBP-4],2               ; |
00401075  |.  >CALL DWORD PTR DS:[<&ADVAPI32.AdjustToke>; \AdjustTokenPrivileges
0040107B  |.  >TEST EAX,EAX
0040107D  |.  >JE SHORT _MSRSTRT.00401088
0040107F  |.  >PUSH ESI                                 ; /Reserved
00401080  |.  >PUSH 2                                   ; |Options = EWX_REBOOT
00401082  |.  >CALL DWORD PTR DS:[<&USER32.ExitWindowsE>; \ExitWindowsEx
00401088  |>  >XOR EAX,EAX
0040108A  |.  >POP ESI
0040108B  |.  >LEAVE
0040108C  \.  >RETN 10

与楼主自杀代码很类似哦
2006-1-2 12:15
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
翻译成Delphi,没有成功,不过看原理就等同于写一个delme.bat的批处理。

Program Project1;
Uses
  windows, shlobj, shellapi;

Function SelfDelete: Boolean;
Var
  sei: PShellExecuteInfo;
  szModule, szComspec, szParams: Array[0..MAX_PATH] Of char;
  // get file path names:
Begin
  If ((GetModuleFileName(0, szModule, MAX_PATH) <> 0) And
    (GetShortPathName(szModule, szModule, MAX_PATH) <> 0) And
    (GetEnvironmentVariable('COMSPEC', szComspec, MAX_PATH) <> 0)) Then
  Begin
    // set command shell parameters
    lstrcpy(szParams, ' / c del');
    lstrcat(szParams, szModule);
    lstrcat(szParams, ' > nul');
    // set struct members
    New(sei);
    sei^.cbSize := SizeOf(TShellExecuteInfoA);
    sei^.Wnd := 0;
    sei^.lpVerb := 'Open';
    sei^.lpFile := szComspec;
    sei^.lpParameters := szParams;
    sei^.lpDirectory := 0;
    sei^.nShow := SW_HIDE;
    sei^.fMask := SEE_MASK_NOCLOSEPROCESS;
    // increase resource allocation to program
    SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
    // invoke command shell
    If (ShellExecuteEx(sei)) Then
    Begin
      // suppress command shell process until program exits
      SetPriorityClass(sei^.hProcess, IDLE_PRIORITY_CLASS);
      SetProcessPriorityBoost(sei^.hProcess, True);
      // notify explorer shell of deletion
      SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, @szModule, 0);
      Result := True;
    End
  End
  Else // if error, normalize allocation
  Begin
    SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
    Result := False;
  End;
End;
Begin
  SelfDelete
End.
2006-1-3 01:10
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢,学习中。。。
2006-1-3 09:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这篇文章讲的很详细

从历史角度回顾了很多经典的自删除程序

http://www.catch22.net/tuts/selfdel.asp

最后一个方法适用于9x NT
创建explorer进程并暂停 插入删除代码到explorer的空间 然后resume explorer进程 于是自己被删除 然后explorer马上结束
呵呵
2006-1-9 11:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
最初由 kanxue 发布


转帖请注明一下。不然别人还以为是你原创的。


老大,你不说我还以为是他原创!
2006-2-1 15:59
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
14
不错的代码
2006-2-1 18:20
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
还不错吧
是好方法
2006-2-5 12:47
0
游客
登录 | 注册 方可回帖
返回
//