刪除應用程式自身的可執行檔案

2021-09-30 02:19:28 字數 1226 閱讀 4257

下面的**由gary nebbett寫就.gary nebbett乃是windows nt/2000 native api reference的作者.乃nt系統一等一的高手.下面就分析一些他的這段**.

這段**在process沒有結束前就將啟動process的exe檔案刪除了.

int main(int argc, char *ar**)

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不被刪除.)

快速刪除可執行檔案

在使用 vim 擼碼的的時候,我的配置可以按f5直接編譯執行,不過在編譯通過後會生成乙個同名的可執行檔案,然後每次都要手動刪除這個檔案,很煩,所以決定寫個命令直接刪除當前檔案下所有的可執行檔案 首先我自己寫了乙個 站,防止 rm 命令誤刪檔案具體可以看給rm命令加道保險 然後在此基礎上在 bashr...

python應用程式打包成exe可執行檔案

pywin32是乙個python庫,為python提供訪問windows api的擴充套件,提供了齊全的windows常量 介面 執行緒以及com機制,所以為了能讓所有電腦可以完美執行我們的exe,這裡就需要將安裝pywin32。第三步 執行打包命令 pyinstaller f w main.py ...

程式中執行其他可執行檔案

例如 system del c jk.txt system 函式中可以直接執行dos命令,執行相應操作。ex winexec notepad.exe c autoexec.bat sw show 執行 notepad.exe 開啟目錄下批處理檔案,並正常顯示 ex winexec notepad.e...