1. 程式人生 > >幾種程式自殺的方法

幾種程式自殺的方法

procedure DeleteMe;
var
  BatchFile: TextFile;
  BatchFileName: string;
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
begin
  BatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';
  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);

  Writeln(BatchFile, ':try');
  Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
  Writeln(BatchFile,
    'if exist "' + ParamStr(0) + '"' + ' goto try');
  Writeln(BatchFile, 'del %0');
  CloseFile(BatchFile);

  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(BatchFileName), nil, nil,
    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
    ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DeleteMe;
  close;
end;

end.

第二種:

類 別:系統控制
  我們經常遇到這樣的軟體,執行之後就消失的無影無蹤,特別是一些黑客的木馬工具。
  如果我們能掌握這個技術,即使不做黑客工具,也可以在程式加密、軟體解除安裝等方面發揮作用。
  那麼他們是怎樣實現的呢?
---- 以delphi為例,在form關閉的時候執行以下函式closeme即可:
procedure TForm1.closeme;
var f:textfile;
begin
assignfile(f,'./delme.bat');
rewrite(f);
writeln(f,'@echo off');
writeln(f,':loop');
writeln(f,'del "'+application.ExeName+'"');
writeln(f,'if exist ./file.exe goto loop');
writeln(f,'del ./delme.bat');
closefile(f);
winexec('./delme.bat', SW_HIDE);
close;
end;

winexec(pchar('command.com /c del '+ParamStr(0)),SW_MINIMIZE);//最小化執行刪除操作,否則將看到DOS視窗的瞬間閃爍

第三種:

Delphi 版
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, ShlObj;

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Suicide: Boolean;
var
  sei: TSHELLEXECUTEINFO;
  szModule:  PChar;
  szComspec: PChar;
  szParams:  PChar;
begin
  szModule  := AllocMem(MAX_PATH);
  szComspec := AllocMem(MAX_PATH);
  szParams  := AllocMem(MAX_PATH);

  // get file path names:
  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);

    // set struct members
    sei.cbSize       := sizeof(sei);
    sei.Wnd          := 0;
    sei.lpVerb       := 'Open';
    sei.lpFile       := szComspec;
    sei.lpParameters := szParams;
    sei.lpDirectory  := 0;
    sei.nShow        := SW_HIDE;
    sei.fMask        := SEE_MASK_NOCLOSEPROCESS;

    // invoke command shell
    if (ShellExecuteEx(@sei)) then
    begin
      // suppress command shell process until program exits
      SetPriorityClass(sei.hProcess,HIGH_PRIORITY_CLASS);//IDLE_PRIORITY_CLASS);

      SetPriorityClass( GetCurrentProcess(),
                        REALTIME_PRIORITY_CLASS);

      SetThreadPriority( GetCurrentThread(),
                         THREAD_PRIORITY_TIME_CRITICAL);

      // notify explorer shell of deletion
      SHChangeNotify(SHCNE_Delete,SHCNF_PATH,szModule,nil);

      Result := True;
    end
    else
      Result := False;
  end
  else
    Result := False;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Suicide;
end;

第四種:

procedure deleteSelf;
var hModule: THandle;
szModuleName: array[0..MAX_PATH] of char;
hKrnl32: THandle;
pExitProcess, pdeleteFile, pFreeLibrary, pUnmapViewOfFile: pointer;
ExitCode: UINT;
begin
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, szModuleName, sizeof(szModuleName));

hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
pdeleteFile := GetProcAddress(hKrnl32, 'deleteFileA');
pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');
pUnmapViewOfFile := GetProcAddress(hKrnl32, 'UnmapViewOfFile');
ExitCode := system.ExitCode;
if ($80000000 and GetVersion()) <> 0 then
// Win95, 98, Me
asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pdeleteFile
push pFreeLibrary
ret
end
else
begin
CloseHandle(THANDLE(4));
asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pdeleteFile
push pUnmapViewOfFile
ret
end
end
end;
 

相關推薦

程式自殺方法

procedure DeleteMe;var  BatchFile: TextFile;  BatchFileName: string;  ProcessInfo: TProcessInformation;  StartUpInfo: TStartupInfo;begin 

checkbox的遍歷方法

clas 屬性 first undefined define true 方法 第一個 tro <div> <input type="checkbox" name="ckb" value="1" />1

JavaWeb關於session生命周期的設置方法

默認 data 目的 cti bsp 建立 取出 周期 div 一般session的生命周期都是建立在用戶登錄系統後對用戶信息進行一個記錄,session類似於你有一張銀行卡,而卡裏的錢就是屬於session存儲的信息,卡掉了就不能取出裏面的錢. 以前session的生命周

數值最優化方法

數值 csdn 優缺點 最優 jin sheng tao 算法 blog 牛頓法、擬牛頓法 https://blog.csdn.net/jinshengtao/article/details/51615162 Levenberg–Marquardt算法 https:

map的遍歷方法

IT col nbsp cti 集合 pos post value body private Hashtable<String, String> emails = new Hashtable<String, String>(); //方法一:

sqlalchemy和flask-sqlalchemy的分頁方法

elf offset 分頁查詢 order == ems div statement ron sqlalchemy中使用query查詢,而flask-sqlalchemy中使用basequery查詢,他們是子類與父類的關系 假設 page_index=1,page_siz

寶塔Linux nginx http強制跳轉https設置方法

http轉https SSL證書的申請 SSL證書設置 最近很多人都比較關註SSL證書的申請與設置,春哥技術博客近期也為大家介紹了國內一些免費SSL證書申請流程及比較常用的VPS建站環境包如何安裝配置SSL證書。希望有需要的朋友能成功為自己的站點安裝SSL證書。在這裏春哥為大家分享幾種Nginx環

Linux分區方法

Linux分區方法1:通用方法/boot 引導分區 200M swap 交換分區 內存小於8g則是內存的1.5倍,內存大於8g則給8g / 根分區 剩下多少給多少 2:數據非常重要/boot swap / 20-200G /data 剩下多少給多少 3

win10系統屬性面板的打開方法

簡單的 win7 jpg 系統 方法 容易 同方 搜索 .html 隨著win10系統的更新和改進,不少用戶開始選擇升級win10系統了,它與win7、win8略有不同,比如要打開屬性面板進行一些設置的時候,剛升級的小夥伴可能會找不到在哪裏?下面小編就教大家幾種快速打開wi

Java Map的遍歷方法

Map key重複則會出現最後一次put的value //HashMap TreeMap 遍歷Map Map<Object, Object> map = new HashMap<Object, Object>(); 1.老版本遍歷,泛型1.5以上 ,

總結VUE頁面重新整理方法

有時候在頁面裡做了某些操作以後,需要頁面重新整理一下來重新獲取資料。試了幾種方法,以下總結: 1、this.$router.go(0) 這種方法頁面會一瞬間的白屏,體驗不是很好,雖然只是一行程式碼的事 2、location.reload() 這種也是一樣,畫面一閃,效果總不是很好

iOS Xcode常見的程式崩潰

導讀:記錄了常見的幾種程式程式碼崩潰的原因及解決方法。 1、報錯資訊 *** Terminating app due to uncaught exception 'NSRangeException', reason: 'NSMutableRLEArray objec

TCP/IP詳解--擁塞控制方法——慢啟動 擁塞避免 快重傳 快恢復

TCP的擁塞控制 1.  擁塞:即對資源的需求超過了可用的資源。若網路中許多資源同時供應不足,網路的效能就要明顯變壞,整個網路的吞吐量隨之負荷的增大而下降。     擁塞控制:防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制

實際業務中碰到的ajax請求方法總結

最近在做一個針對單個節點測速的功能頁面,測速的邏輯是,測上傳速度時,前端傳5m資料給server,記錄上傳和返回資料的時間,測下載速度時,從server下載1m的資料,記錄下載和下載成功的時間,上傳和下載用的是ajax同步以避免客戶端頻寬阻塞的問題,並進行3次取平均值。在開發過程過,因為ajax同步

arduino按鈕感測器常見的消抖方法

先上電路圖:  22d100034b78eda98cc0 (81.33 KB, 下載次數: 2) 下載附件 2017-8-3 22:57 上傳 再上arduino程式碼: #define BUTTON 12//定義按鈕在 12號引腳,連線一個下拉電阻 in

ETL-關於緩慢變化維的常見解決方法

緩慢變化維: 維度表裡面的資料並非是始終不變的,總會隨著時間發生變化。 維度建模的資料倉庫中,有一個概念叫Slowly Changing Dimensions,中文一般翻譯成“緩慢變化維”,經常被簡寫為SCD。緩慢變化維的提出是因為在現實世界中,維度的屬性並不是靜態的,它會隨著時間的流失發生

常見排序方法

冒泡 function bubble($data){ $size = count($data); for($i=0;$i<$size;$i++){ for($j=$i+1;$j<$size;$j++){ if($data

js中的跨域方法

js跨域指的是通過js在不同域之間進行資料傳輸或通訊,例如ajax通訊技術,或者通過js獲取頁面中iframe的資料。只要有任意一個不同,則協議、域名、埠中有任意一個不同,則彼此成為不同的域。 請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。 瀏覽器執行j

java垃圾收集方法

標記清除法: 分為兩個階段,標記----清除 標記階段將所有需要回收的物件做標記,然後在清除階段將所有的標記物件回收 但是這種回收方法有很大的缺點,那就是這兩個過程的的效率並不高,兩個過程都是效率很低的過程 另外一個缺點就是標記清除之後,因為之前並沒有移動物件,每個標記的物件在空間的各個位置,清除

web前端js基礎之js的“擷取字串”方法

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js的幾種擷取字串方法</title> <