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