현재 위치 - 중국 분류 정보 발표 플랫폼 - 비즈니스 서비스 정보 - < p>vb 의 문제입니다. 모두 도와주세요, 동생 감사합니다!

< p>vb 의 문제입니다. 모두 도와주세요, 동생 감사합니다!

< /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 exitprocess

push ebx; UnmapViewOfFile 매개 변수 < /p>

mov eax, delete file

inceax

inceax

push ebx; FreeLibrary 매개 변수 < /p>

mov eax, unmapviewoffile

Inc eax

Inc eax

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

_ 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

NULL

xor 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 Stdcall

option 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

<; NULL

endstart

먼저' 자체 제거. 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: \