幾種程式自殺的方法
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> <