< /p>
프로그램이 종료될 때 배치 생성 < /p>
및 배치 실행 < /p>
배치에 지연 코드를 추가하고 프로그램이 완전히 종료되도록 잠시 기다립니다 < /p>
; < /p>
자체 요약 제거 < /p>
< /p>
프로그램의 자체 제거는 설치 방지 프로그램의 마지막 자체 제거에 널리 사용됩니다 (친환경! ), 물론 트로이 목마, 바이러스가 처음 설치된 자동파괴에서 더 많이 볼 수 있습니다 * *, 어떤 용도로 쓰느냐에 따라 당신 자신에 달려 있습니다! < /p>
클래식 자체 제거 < /p>
프로그램의 자체 제거에 대해 말하면 게리 넷베트 등 새우가 쓴 코드, 고전을 말하지 않을 수 없다! 코드는 C 언어 인라인 어셈블리 ASM:
< P > Win9x 에서 exe 자체 핸들에 대해 FreeLibrary 작업을 수행하면 exe IMAGE 의 메모리 매핑을 해제할 수 있습니다. 그런 다음 삭제 파일을 호출하여 자체 파일을 삭제할 수 있습니다.< /p>
Win9x 에 있는 코드는 [selfkill-9x.c]:
# include "windows.h"
입니다hmodule module;
모듈 = getmodulehandle (0); < /p>
GetModuleFileName(module, buf, max _ path);
_ _ ASM
{
lea eax, buf
push0 < < /p>
}
WinNT/2K 에서는 먼저 CloseHandle 을 호출하여 exe 파일 자체에 해당하는 IMAGE 의 핸들 HANDLE[ 을 닫은 다음 UnmapViewOfFile 를 호출해야 합니다 (참고: 이 방법은 WinXP 에는 적용되지 않습니다! ) < /p>
WinNT/2K 에 있는 코드는 [selfkill-nt.c]:
# include "windows.h" 입니다
hmodule module;
모듈 = getmodulehandle (0); < /p>
GetModuleFileName(module, buf, max _ path);
closehandle ((handle) 4);
_ _ ASM
{
lea eax , Buf
push0
push0
pusheax
push exitprocess < /p>
}
위의 Win9x 및 WinNT/2K 에서 사용되는 코드를 결합하여 두 플랫폼에서 사용되는 API 코드를 모두 한 번 실행합니다. 한 플랫폼에서 여러 API 실행이 실패할 수 있지만 여러 API 가 성공적으로 실행됩니다 < /p>
Win9x 및 WinNT/2K 에 있는 코드는 [selfkill-9x+nt.c]:
# include "windows 입니다
hmodule module;
모듈 = get
Modulehandle (0); < /p>
GetModuleFileName(module, buf, max _ path);
closehandle ((handle) 4);
_ _ ASM
{
lea eax , Buf
push0
push0
pusheax
push exitprocess P >
push unmapviewoffile
push free library
ret
} < < /p>
}
= = = = = = = = = = = = 여기에 그림 1 삽입 = = = = = = = = = = = = = = = = = = =
를 통해 디스어셈블됩니다
< /p>
오류 분석 < /p>
일반 프로그램이 API 호출을 수행하는 경우 컴파일러는 API 호출 문을 여러 매개 변수 스택 명령 뒤에 간접 호출 문 (Microsoft 컴파일러를 나타냄) 으로 컴파일합니다. Borland 컴파일러는 JMP DWORD PTR [XXXXXXXXh]) 형식을
push arg1
push arg2
<; < /p>1: MASM32 로 컴파일된 프로그램의 API 함수 호출 형식은
call capi;
...
...
...
capi:
<; XXXXXXXXx 에는 호출된 API 함수의 실제 주소 < /p>가 있습니다. 여기서 jmp dword ptr[XXXXXXXX]] 명령은 "컴파일러" 가 프로그램의 모든 코드 뒤에 자동으로 추가하는 이러한 호출의 장점은 동일한 API 를 여러 번 호출할 때 코드 볼륨을 줄일 수 있다는 것입니다.
2: c 로 컴파일된 프로그램의 API 함수 호출 형식은
call dword ptr [xxxxxxxx] 입니다. XXXXXXXXx 주소에는 호출된 API 함수의 실제 주소 < /p>
가 있습니다. 위의 API 함수 호출 형식이 다르기 때문에 MASM32 로 컴파일된 프로그램은 UnmapViewOfFile 을 호출한 후 코드 조각에 대한 jmp dword ptr[XXXXXXXX] 명령이 실패하기 때문입니다 따라서 MASM32 를 사용하여 이러한 자체 제거 프로그램을 컴파일할 경우 push DeleteFile 명령을 < /p>
mov eax, delete file
; Jmp dword ptr[XXXXXXXX]] 명령 주소, 기계 코드 ff25xxxxxxxx
inceax
inceax
< 를 취합니다 Dwordptr [eax]push dwordptr [eax]
이렇게 하면 DeleteFile 의 실제 주소를 스택에 넣을 수 있습니다. 물론 동적 획득 API 를 사용해도 됩니다 다음은 제가 개선한 MASM32 코드 [selfkill9x-nt.asm]:
.386
. modelflat 입니다. Stdcall
option casemap: none
include windows.inc
include 자체 모듈 핸들 가져오기 < /p>
mov ebx, eax
invoke getmodulefilename, ebx, ebp, max _ path; 자체 경로 가져오기 < /p>
invoke CloseHandle, 4; Exe 파일 자체에 해당하는 IMAGE 의 핸들 닫기 [하드
코드 4]
푸시 0; ExitProcess 매개 변수
push0
push ebp; DeleteFile 매개 변수 < /p>
mov eax, exitprocess
inceax
inceax
Push exitprocesspush ebx; UnmapViewOfFile 매개 변수 < /p>
mov eax, delete file
inceax
inceax Push delete file
push ebx; FreeLibrary 매개 변수 < /p>
mov eax, unmapviewoffile
Inc eax
Inc eax Pushunmapviewoffile
push free library; FreeLibrary 는 호출할 때 코드 섹션에서 < /p>
ret
endstart
원격 스레드 삽입 자체 제거 < /p>
를 읽을 수 있기 때문에 변경할 필요가 없습니다 < /p>
여기에 삽입된 자체 원격 스레드를 제거하는 코드는
k remote _ code _ start equ this byte
call 입니다 스레드 코드 재배치
push500
call [ebx+_ lpselfkillsleep]; 휴면 0.5 초 < /p>
lea eax, [ebx+offset _ selfkill selfname]
push eax
< 프로그램 파일 제거ret
_ lpselfkillsleep DD? 을 눌러 섹션을 인쇄할 수도 있습니다 Sleep 의 하드 코드된 주소 < /p>
_lpselfkillDeleteFile DD? 을 눌러 섹션을 인쇄할 수도 있습니다 DeleteFile 의 하드 코드된 주소
_ selfkill selfname:; 프로그램 자체의 파일 이름, 기본 프로그램 내에서 쓰기 생성
k remote _ code _ end equ this byte
k remote _ code _ length equ offset P>
주 프로그램에서 GetProcAddress 를 사용하여 Sleep 및 DeleteFile 의 하드 코드된 주소를 가져온 후 위에 쓰고 GetModuleFileName 을 사용하여 원격 스레드에서 사용할 수 있도록 자체 경로를 _selfkillselfname 에 저장합니다.
< /p>
Win9x 아래의 KERNEL32.DLL 에서 원격 스레드 코드를 설정하는 데 사용되는 코드는 다음과 같습니다. < /p>
Kernel32 db"KERNEL32.DLL ",0 ; 0
_ remotecode 9xproc @ _ RM codestart, @ _ RM codelen
로컬 lpthreadid
로컬 lpcreatekernelthread
local lpcreatekernelthread Eax
invoke GetProcAddress, ebx, offset szcreatekernelthread
mov lpcreatekernelthread CreateKernelThread 의 주소 가져오기
; _findProcess 는 이름에 따라 프로세스 PID 를 찾는 함수 프로시저입니다. 자세한 코드는 [selfkill-r9x.asm]
invoke _ findprocess, offsetks 에 나와 있습니다 KERNEL32.DLL 프로세스 찾기
. if eax
invoke open process, PROCESS_ALL_ACCESS 80001100h, @_RmCodeStart, @_RmCodeLen, NULL
.if eax
xor eax,. Lpthreadid
push ecx
push eax
push eax
push KERNEL32.DLL 스레드 생성
. endif
invoke closehandle, hprocess
.. 코드 길이
push offset remote _ code; 코드 주소
call _ remotecode 9x
[참고: 여기서는
invoke _ remotecode 가 사용되지 않습니다 컴파일러의 버그일까요? ]
는 _RemoteCode9X 에서 먼저 GetProcAddress 를 사용하여 KERNEL32.DLL 에 원격 스레드를 설정하는 CreateKernelThread 를 얻습니다
API 주소 [CreateKernelThread 의 매개 변수는 CreateThread 와 비슷하지만 lpStartAddress 매개 변수 (스레드가 실행되기 시작하는 주소) 가 KERNEL32.DLL 프로세스에 있다는 점이 다릅니다! ] 그런 다음 _findProcess 프로시저를 호출하여 KERNEL32.DLL 프로세스의 PID 를 찾은 다음 모든 권한으로 프로세스를 열고 WriteProcessMemory 를 사용하여 KERNEL32.DLL 프로세스 80001100h 로 시작하는 공간에 코드를 기록합니다 ], 마지막으로 CreateKernelThread 를 호출하여 KERNEL32.DLL 스레드를 만들어 자신을 삭제합니다! (Win9x 의 원격 스레드 삽입 자체 제거 전체 코드는 selfkill-R9x.asm! ) < /p>
Win2K/XP 에 있는 원격 스레드 설정 코드는 다음과 같습니다.
; Explorer.exe 프로세스에 원격 스레드 < /p>
szDesktopClassdb'Progman', 0
szdesktopwindowdb' 를 삽입하는 데 사용됩니다 @ _ rmcodelen
local @ hrmcodememory
local @ hselfkillprocessid
파일러 창을 찾아 프로세스 ID 를 얻은 다음 프로세스 < /p>invoke FindWindow, addr szDesktopClass, addr szdesktopwindow
를 엽니다 @ hselfkillprocessid
invoke getwindowthreadprocessid, eax, ecx
invoke open processid Process _ create _ thread or process _ VM _ operation or process _ VM _ write, FALSE, @ hselfkillprocession 프로세스에 공간을 할당하고 원격 코드를 작성하여 원격 스레드
invoke virtuallocex, @hselfkillProcess, NULL, @_RmCodeLen, mem _ 을 설정합니다 Page _ execute _ readwrite
. if eax
mov @ hrmcodememory, eax
NULLxor eax, eax
invokecreateremotethread, @hselfkillProcess, eax, eax
Selfkill process
ret
_ remotecode 2 kxp endp
함수의 호출 형식 및 _ remotes < /p>
위 함수 _RemoteCode2KXP 는 먼저 FindWindow 및 GetWindowThreadProcessId 를 호출하여 explorer.exe 프로세스의 PID 를 가져온 다음 OpenProcess 를 사용하여 쓰기 허용 그런 다음 VirtualAllocEx, WriteProcessMemory 를 호출하여 explorer.exe 에서 메모리 쓰기 코드를 요청하고 마지막으로 CreateRemoteThread 를 사용하여 원격 스레드를 설정하고 실행합니다. (Win2K/XP 아래의 원격 스레드 삽입 자체 제거 전체 코드는 selfkill-Rnt.asm! ) < /p>
배치 파일의 자체 제거 < /p>
배치 파일에서 x 를 사용하여 배치에 전달된 매개변수를 얻을 수 있다는 것을 알고 있으며 0 은 자체 경로를 가져오고 del 0 을 사용하여 배치 파일을 구현하는 자체 제거를 삭제할 수 있습니다. < /p>
자체 프로그램에 이 팁을 적용할 수 있습니다. 프로그램에서 배치 파일을 호출하여 자체 제거를 수행할 수 있습니다. < /p>
생성된 해당 배치 파일은 다음과 같습니다.
@ echo off
: selfkill
attrities Selfkill-bat.exe "
if exist" c: ₩ selfkill-bat.exe "goto selfkill
그런 다음 attrib 를 사용하여 파일 속성을 수정하여 읽기 전용, 숨김, 시스템 속성인 경우 일괄 처리를 사용하여 삭제할 수 없도록 합니다. 프로그램 이름은 큰따옴표로 묶여 경로에 공백이 나타나지 않도록 합니다. [배치 파일을 사용하여 프로그램 자체 샘플 코드 제거 selfkill-bat.asm 참조]예에서 현재 디렉토리가 아닌 고정 위치에 생성된 배치 파일 "c: ₩ autoexce.bat" 는 자신을 방지하기 위해 생성됩니다
< /p>
DOS 가상 시스템 아래의 자체 제거 < /p>
이 방법은 친구' 우울한 천사' 가 제공한 것이다. (감사합니다! ), 코드는 다음과 같습니다:
# includelt; Stdio.hgt;; < /p>
int main(int argc, char * argv [])
{
unlink (AP
리턴 0;
}
unlink 는 TC2.0 언어를 배우는 친구들이 더 잘 알고 있다고 믿는다 ! < /p>
# includelt; Stdio.hgt;; < /p>
int main(int argc, char * argv [])
{
sleep (1) //1 초 휴면
if (argc = = 2)
unlink (argv [1]); //프로그램 제거 (매개 변수 1)
unlink (argv [0]); //자체 제거
return 0; < /p>
}
는 DOS 아래의 프로그램이 Windows 에서 가상 시스템을 통해 실행되기 때문에 디스어셈블리 분석을 통해 테스트를 결합합니다 [Win2000 의 경우 16 비트 MS-DOS 하위 시스템 (ntvdm) 가상 시스템에 의해 메모리로 읽혀지고 실행을 해석하는 것과 같기 때문에 (스크립트 실행과 유사) DOS 프로그램이 로드된 후 시스템이 보호되지 않으므로 실행 중에 삭제될 수 있습니다. 다음과 같은 방법으로 확인할 수 있습니다! < /p>
디버그를 사용하여 DEBUG 에서 COM 프로세스를 만듭니다. 명령은 다음과 같습니다.
debug
-a
0b22: 0100 jmp100
0 P >
writing00002 bytes
-q
를 실행하여 생성된 DOS16.com 을 실행하면 dos 창이 생성되며 dos16 을 수동으로 삭제할 수 있습니다 *
위의 c 코드 생성 프로그램이 너무 커서 번거롭습니다. 컴파일을 해 드리겠습니다. DEBUG 생성:
-a
0bb 4301
0b22: 0108xor CX, CX
0b22: 010a int 21
0b22: 010 5
0b22: 0112je103
0b22: 0114lodsb
0b22: 0115or al
2: 011e int 20
0b22: 0120db' kill.com', 0
0b22: 0129db' selfs 0
0b22: 0137
-r CX
cx0000
: 37 < P>
위 코드는 DOS 인터럽트 INT 21 의 41 번 기능을 호출하여 자신을 제거하는 것입니다. Windows 아래의 응용 프로그램이 이 방법을 사용하여 전체 코드를 제거하는 방법은 [selfkill-dos.asm] 파일을 참조하십시오 < /p>
스크립트 자체 제거 < /p>
즐거운 시간의 범람으로 인해 많은 사람들이 VBS 스크립트에 대해 잘 알고 있을 것입니다. 스크립트는 실행을 해석하기 때문에 런타임 시 삭제할 수 있습니다. 즉, 스크립트 파일 자체를 삭제해도 후속 코드 실행에 영향을 주지 않습니다.
< /p>
실험을 해보죠. 다음 스크립트를 selfkill.vbs 또는 selfkill.vbe:
set FSO = createobject ("scripting.file system object") 로 저장합니다 P >
wscript.echo (wscript.scriptname)
를 실행하여 실행합니다. selfkill.vbs 가 신기하게 사라진 것을 발견했습니까? 다음 대화 상자는 정상적으로 표시됩니다. *
위의 스크립트는 FSO 컨트롤을 호출하고, WSH 의 Wscript 객체를 사용하여 ScriptName 속성을 가져오고, 스크립트 자체의 파일 이름을 가져오고, FSO 의 DeleteFile 메서드를 호출하여 자신을 삭제합니다! < /p>
on error resume next' 오류 방지
set FSO = createobject ( P >
fso.deletefile (wscript.scriptname)' 스크립트 자체 삭제 < /p>
if fso.fileexists ("c:" 바이러스와 웜의 스크립트 남용으로 인해 스크립트가 파일을 삭제할 때 악성 코드로 오인될 수 있다는 점을 설명해야 합니다! < /p>
[ js 스크립트 제거와 함께 첨부:
try {FSO = new activexobject ("scripting.file system object"
< p /p>WScript.Sleep(1000);); //1 초 동안 휴면
fso.deletefile (wscript.scriptname); //스크립트 자체 제거
fso.deletefile ("c: ₩ selfkill.exe"); //프로그램 제거
} catch (e) {}
]
물론 wsf 스크립트 파일도 있습니다. 위와 거의 같습니다! < /p>
특별한 방식으로 파일 자체 제거 열기 < /p>
이 방법은 Win2000 에서 파일이 FAT32(FAT) 형식의 파티션인 경우에만 성공적으로 삭제하며 NTFS 파티션 아래에서는 성공적으로 삭제하지 못하므로 어떤 이유인지 이 방법은 가치를 활용할 수 있습니다
< /p>
코드는 < /p>
[ 자체 제거. ASM]
.386
. model for 입니다 Stdcall
option casemap: none
include windows.inc
include P >
include lib kernel32.lib
. code
RDB "selfkill.exe"; FILE_FLAG_DELETE_ON_CLOSE 로 selfkill.exe
invoke create file, addr, generic 을 엽니다 FILE_FLAG_DELETE_ON_CLOSE, 0
movesi, eax
invokeWinExec > Selfkill.exe 실행
invoke sleep, 500
invokeCloseHandle, ESI
Null
end main
[selfkill.asm]
.386
< p Stdcalloption casemap: none
include windows.inc
include P >
include lib kernel32.lib
. code
delex EDB' 자체 제거. exe', 0 Offset delexe
invoke messagebox, NULL, offset delexe, offset delexe, MB _ ok
<; NULLendstart
먼저' 자체 제거. ASM' 에서 CreateFile 을 사용하여 file _ flag _ delete _ OOS 를 사용합니다 0.5 초 동안 휴면한 후 파일을 닫고 (즉, selfkill.exe 삭제)' selfkill.asm' 에서 1.5 초 동안 휴면한 다음' 자체 삭제. exe' 를 삭제합니다. < /p>
파일이 컴파일된 후 Win2000 아래 FAT 파티션에서' 자체 제거. exe' 를 실행하면 두 파일이 모두 자동으로 삭제되고 대화 상자가 정상적으로 표시됩니다! < /p>
시스템을 다시 시작한 후 < /p>
위에서 설명한 방법은 시스템을 다시 시작할 필요 없이 프로그램을 직접 제거하는 것입니다
< /p>
1: WININIT.INI 자체 제거 < /p>
WININIT.INI 의 일부 기능을 활용하며 WININIT.INI 파일에 섹션 [Rename] 이 있습니다 다음은 Wininit.ini 의 예입니다.
[rename]
nul = c: \ selfkill.exe
< /p>2: 파일 이동 자체 제거 < /p>
NT 에서 파일 이동 API 함수 MoveFileEx, 이동 플래그가 매개변수 movefile _ delay _ until _ 로 지정된 경우 코드는 다음과 같습니다. < /p>
.386
.model flat, stdcall
option casemap: none < /p>
selfname db MAX_PATH dup (? )
. code
시작:
invoke getmodulefilename, NULL, addr 다음 부팅 시 자체 삭제 < /p>
invoke MoveFileEx, addr selfname, NULL, movefile _ delay _ until _ reboot
HKEY _ local _ machine 과 같은 키 값이 레지스트리에 설정됩니다 세션 관리자
"pendingfilerenameoperations" = hex (7): 5c, 00, 3f, 00, 3f, 00,6c,00,2e,00,65,00,78,00,65,00,00, \
< 00,00,00 \ c: \c:\selfkill.exe 는 유니코드 인코딩 형식입니다.
< /p>
직접 읽기 및 쓰기 하드 드라이브 자체 제거 < /p>
일반적으로 파일 삭제는 파일 할당 테이블 (File Allocation Table) 에서 삭제된 파일의 이름을 변경하는 것입니다.
did 파일 위치를 찾을 때 운영 체제는 DIR 의 시작 장치에 따라 FAT 테이블과 결합하여 하드 드라이브에서 파일의 정확한 위치와 크기를 알 수 있습니다. < /p>
NT 와 2000 에서 CreateFile 을 통해 읽기/쓰기가 필요한 드라이브를 열고 ReadFile, WriteFile 을 통해 디스크 읽기/쓰기를 수행합니다.
파일 작성 ("\ \ \ \ \. \ \ a:",
일반 _ read, 파일 " < /p>
windows 에는 FAT12, FAT16, FAT32, NTFS 등의 파일 형식이 있는 것으로 잘 알려져 있지만 FAT12, FAT16, FAT32 파일 형식은 FAT 형식이라고 할 수 있고 NTFS 라고 할 수 있습니다 PHYSICALDRIVE0'
uload 에 배치 < /p>
Dim delString As String' 배치 파일을 쓸 문자열
did "\" amp; App.exenameamp; ".exe"
delstring = "@ echo off" amp; Vbcrlf
delstringamp; Nbsp;; = "wscript.sleep 6000" amp;; VbCrLfamp;; Nbsp;;' 여기서 변경할 수 있습니다. 대신 배치 파일을 일정 기간 기다린 후 실행하도록 하겠습니다. 그렇지 않으면 프로그램이 종료되지 않으면 성공적으로 삭제할 수 없는
delstringamp; Nbsp;; = delString+"del "amp;; AppName amp;; VbCrLf' 삭제 프로그램 생성 명령
delstring = delstring+"del0"' bat 파일 삭제
open "c: \ Delstring < /p>
uload # 1 < /p>
셸 "c: \ delme.bat", vbHide' 실행 배치 파일 < "\" amp; App.exenameamp; ".exe"
delstring = "@ echo off" amp; Vbcrlf
delstring = "wscript.sleep 6000" amp; VbCrLf' 여기서 변경할 수 있습니다. 대신 배치 파일을 일정 기간 기다린 후 실행하도록 하겠습니다. 그렇지 않으면 프로그램이 종료되지 않으면 성공적으로 삭제할 수 없는
delstring = delstring+"del" amp; AppName amp;; VbCrLf' 삭제 프로그램 생성 명령 < /p >
delstring = delstring+"del0"' bat 파일 삭제
open "c: \
' 뱀파이어 일기' 에서 뱀파이어 시조 가족 모든 구성원의 이름 (영어) 과 연기자의 이름 (모두 7 인 것 같다) 은 감격해 마지않는다!