Trao đổi với tôi

http://www.buidao.com

12/21/16

[System Info], Self-deleting executable

Self-deleting executable



Bài viết này hướng dẫn chúng ta làm thế nào file exe của chúng ta sao khi thực thi xong sẽ “tự xác” luôn, tức là sẽ tự xóa chính mình.

Kỹ thuật ở đây là tạo ra 1 file del.bat trong thư mục của file exe. Rồi cho thực thi file del.bat này. File .bat sẽ del file exe và del chính nó.
Kỹ thuật này có 1 bug là khi path trả về bời hàm GetModuleFileName có khoảng trống space.

(Theo tôi nghĩ do sử dụng các hàm wsprintf và lstrlen gây ra bug.)




;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..
; Example of a self-deleting executable  -  by Sunshine
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..

; BUG : Does not work if there's a space in the path returned by GetModuleFileName... WHY?

.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\shell32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib


.data
InfoText db "Sunshine's example of a self-deleting executable.",13,10,\
            "After hitting ok, this executable will delete itself.",0
InfoCap db "Self-deleting PE File",0

BatFile db "del.bat",0
OpenStr db "open"

buf db 0ffh dup(0)

MainStr db ":Repeat",13,10,\
           "del %s",13,10,\
           "if exist %s goto Repeat",13,10,\
           "del del.bat",0


.data?
myfile HANDLE ?
howmanybyteswritten DWORD ?
MyFileDir LPSTR  ?



.code
start:
   invoke MessageBox, 0, addr InfoText, addr InfoCap, MB_OK
  
   ;:: get filename of executable
   invoke GetModuleFileName, NULL, addr MyFileDir, 512
   
   ;:: create del.bat file and if failed then exit
   invoke CreateFile, addr BatFile, GENERIC_WRITE, 0, NULL,  CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
   mov myfile, eax
   cmp eax, 0FFFFFFh
   jz @Exit

 
   ;:: build our string and write it to del.bat
   invoke wsprintf, addr buf, addr MainStr,addr MyFileDir,addr MyFileDir
   invoke lstrlen, addr buf
   invoke WriteFile, myfile, addr buf, eax, addr howmanybyteswritten, NULL

   ;:: close handle to .bat file
   invoke CloseHandle, myfile
   ;:: and execute it
   invoke WinExec, addr BatFile, SW_HIDE
  

@Exit:
   invoke ExitProcess, NULL

end start